android如何做到类似于微信那样后台服务不会被杀死?

问题描述

正在做一款锁屏应用。

做锁屏肯定用到了service,可是我发现每日手动点击自带的内存清理按钮的时候,我的那个service总是会被杀死。

而微信的后台服务却是一直正常的运行,不会被杀掉。

360的话也不会被杀死,但是360会重新启动。而且360的是两个后台服务,我猜有可能会相互作用的,杀死一个的时候另一个接收到广播把其重启。

尝试过用startForeground以及提高service优先级的方式,发现都不行,service都会被杀死。

反编译了一下微信的代码。

请大家帮忙想想办法吧。谢了

下面是微信的注册service:

<service

			android:name="com.tencent.mm.booter.CoreService"

			android:process=":push"

			>

		</service>

代码如下:

public class CoreService extends Service

  implements com.tencent.mm.jni.platformcomm.f, af, bl

{

  private ao bZl;

  private ac bZm = new ac();

  private boolean bZn = true;

  public final int bZo = -1213;

  private final ai bZp = new e(this);

  private com.tencent.mm.modelstat.l bZq = null;

  private AddrBookObserver bZr;

  private WatchDogPushReceiver bZs;

  private WakerLock bZt = null;

  private m bZu = new m();

  private ay bZv = new ay(new g(this), false);

  private void oj()

  {

    aa.w("MicroMsg.CoreService", "[COMPLETE EXIT]");

    bk.Fg().d(3, 10000, "");

    bg.onDestroy();

    try

    {

      MMReceivers.AlarmReceiver.D(getApplicationContext());

      MMReceivers.AlarmReceiver.B(getApplicationContext());

      Alarm.H(getApplicationContext());

      label43: aa.appenderClose();

      Process.killProcess(Process.myPid());

      return;

    }

    catch (Exception localException)

    {

      break label43;

    }

  }

  public final void H(boolean paramBoolean)

  {

    if (!paramBoolean)

    {

      aa.w("MicroMsg.CoreService", "[NETWORK LOST]");

      bk.Fc().cFB = false;

      bk.Fd().eJ(0);

      bk.Fb().a(10502, "", null);

      this.bZn = false;

      return;

    }

    aa.w("MicroMsg.CoreService", "[NETWORK CONNECTED]");

    bk.Fc().cFB = true;

    boolean bool = this.bZm.oM();

    if ((this.bZn) && (!bool))

    {

      Object[] arrayOfObject = new Object[1];

      arrayOfObject[0] = Boolean.valueOf(this.bZn);

      aa.d("MicroMsg.CoreService", "network not change or can‘t get network info, lastStatus connect:%b", arrayOfObject);

      return;

    }

    if (bool)

      bk.Ff().EN();

    this.bZn = true;

    bk.Fd().eJ(1);

    bk.Fb().a(10501, "", null);

    if (this.bZt == null)

      this.bZt = new WakerLock(getApplicationContext());

    if (!this.bZt.isLocking())

      this.bZt.lock(14000L);

    aa.i("MicroMsg.CoreService", "checking ready, start in 7000ms");

    this.bZv.bO(7000L);

  }

  public final boolean a(int paramInt, byte[] paramArrayOfByte)

  {

    if (getSharedPreferences("system_config_prefs", com.tencent.mm.compatible.g.l.qi()).getBoolean("settings_fully_exit", true))

    {

      aa.i("MicroMsg.CoreService", "fully exited, no need to notify worker");

      return false;

    }

    Intent localIntent = new Intent(this, NotifyReceiver.class);

    localIntent.putExtra("notify_option_type", 2);

    localIntent.putExtra("notify_uin", this.bZl.ES().sd());

    localIntent.putExtra("notify_respType", paramInt);

    localIntent.putExtra("notify_respBuf", paramArrayOfByte);

    localIntent.putExtra("notfiy_recv_time", cj.FD());

    localIntent.putExtra("notify_skey", this.bZl.ES().uo());

    aa.i("MicroMsg.CoreService", "notify broadcast:" + localIntent.getAction() + ", type=" + paramInt);

    try

    {

      sendBroadcast(localIntent);

      return true;

    }

    catch (Exception localException)

    {

      while (true)

      {

        Object[] arrayOfObject = new Object[1];

        arrayOfObject[0] = localException.toString();

        aa.a("MicroMsg.CoreService", "onNotify hasDestroyed %s", arrayOfObject);

      }

    }

  }

  public IBinder onBind(Intent paramIntent)

  {

    aa.d("MicroMsg.CoreService", "onBind~~~ threadID:" + Thread.currentThread());

    return this.bZl;

  }

  public void onCreate()

  {

    aa.d("MicroMsg.CoreService", "onCreate~~~threadID:" + Thread.currentThread());

    super.onCreate();

    if (Build.VERSION.SDK_INT < 18)

      startForeground(-1213, new Notification());

    Handler localHandler = new Handler(Looper.getMainLooper());

    PlatformComm.a(al.getContext(), localHandler);

    i locali = new i(this);

    locali.om();

    ag.a(this.bZp);

    if (PlatformComm.cgz == null)

      PlatformComm.cgz = this;

    bk.a(localHandler);

    bk.setContext(getApplicationContext());

    bk.a(new bm());

    bk.a(new bn());

    bk.a(this);

    if (this.bZq == null)

      this.bZq = new com.tencent.mm.modelstat.l();

    bk.a(this.bZq);

    this.bZl = bk.Ff();

    if (this.bZl == null)

    {

      aa.i("MicroMsg.CoreService", "autoAuth is null and new one");

      this.bZl = new ao(bk.getHandler());

      bk.e(this.bZl);

      bg.onCreate();

      if (bk.Fg() != null)

        break label465;

      aa.i("MicroMsg.CoreService", "NetTaskAdapter is null and new one");

      bk.a(new bi());

      label228: if (bk.Fh() == null)

      {

        aa.i("MicroMsg.CoreService", "NetTaskAdapter is null and new one");

        bk.a(new bh());

        bk.Fh().cFn = this;

      }

      at.azE().a(new f(this), null);

      String str1 = locali.getString(".com.tencent.mm.debug.server.host.http");

      String str2 = locali.getString(".com.tencent.mm.debug.server.ports.http");

      String str3 = locali.getString(".com.tencent.mm.debug.server.host.socket");

      String str4 = locali.getString(".com.tencent.mm.debug.server.ports.socket");

      this.bZl.d(str1, str2, str3, str4);

      MMReceivers.AlarmReceiver.D(getApplicationContext());

      MMReceivers.AlarmReceiver.C(getApplicationContext());

      NetworkInfo localNetworkInfo = ((ConnectivityManager)getSystemService("connectivity")).getActiveNetworkInfo();

      if ((localNetworkInfo != null) && (localNetworkInfo.getState() == NetworkInfo.State.CONNECTED))

        break label482;

      bk.Fc().cFB = false;

      bk.Fd().eJ(0);

    }

    while (true)

    {

      this.bZr = new AddrBookObserver(this, new Handler());

      getContentResolver().registerContentObserver(c.aph(), true, this.bZr);

      this.bZs = new WatchDogPushReceiver();

      registerReceiver(this.bZs, new IntentFilter("com.tencent.mm.WatchDogPushReceiver"));

      return;

      aa.w("MicroMsg.CoreService", "autoAuth is not null and reset");

      this.bZl.reset();

      break;

      label465: aa.w("MicroMsg.CoreService", "NetTaskAdapter is not null and reset");

      bk.Fg().reset();

      break label228;

      label482: bk.Fc().cFB = true;

      bk.Fd().eJ(1);

    }

  }

  public void onDestroy()

  {

    aa.d("MicroMsg.CoreService", "onDestroy~~~ threadID:" + Thread.currentThread());

    this.bZq.a(10002, null, null);

    getContentResolver().unregisterContentObserver(this.bZr);

    unregisterReceiver(this.bZs);

    super.onDestroy();

    oj();

  }

  public void onRebind(Intent paramIntent)

  {

    aa.d("MicroMsg.CoreService", "onRebind~~~ threadID:" + Thread.currentThread());

    super.onRebind(paramIntent);

  }

  public boolean onUnbind(Intent paramIntent)

  {

    aa.d("MicroMsg.CoreService", "onUnbind~~~ threadID:" + Thread.currentThread());

    bk.Fc().a(null);

    return super.onUnbind(paramIntent);

  }

  public final void restartProcess()

  {

    aa.w("MicroMsg.CoreService", "restartProcess");

    oj();

  }

}

解决方案1

android 系统杀程序,一个很重要的判断就是软件系统资源的占用情况。

解决方案2

mark一下,等待结果

时间: 2024-08-07 08:40:07

android如何做到类似于微信那样后台服务不会被杀死?的相关文章

Android 三级联动选择城市+后台服务加载数据库

技术渣,大家将就着看 首先我们需要一个xml数据保存到数据库,这里我从QQ下面找到一个loclist.xml文件 <CountryRegion Name="中国" Code="1"> <State Name="北京" Code="11"> <City Name="东城" Code="1" /> <City Name="西城"

Android四大组件——Service后台服务、前台服务、IntentService、跨进程服务、无障碍服务、系统服务

Service后台服务.前台服务.IntentService.跨进程服务.无障碍服务.系统服务 本篇文章包括以下内容: 前言 Service的简介 后台服务 不可交互的后台服务 可交互的后台服务 混合性交互的后台服务 前台服务 IntentService AIDL跨进程服务 AccessibilityService无障碍服务 系统服务 部分源码下载 前言 作为四大组件之一的Service类,是面试和笔试的必备关卡,我把我所学到的东西总结了一遍,相信你看了之后你会对Service娓娓道来,在以后遇

android 实现后台服务及源码下载

android APP后台服务可以长期与服务器进行长期的交互,保证数据的实时性,这个小项目主要实现的是在app退出之后依然可以运行服务.使用系统的Intent.ACTION_TIME_TICK进行实现,这个系统的广播每隔一分钟就进行广播一次,可以在程序中接收该广播消息,接收到之后检测app中的service服务是否在运行,如果在运行,则不处理,如果没有运行,则重新启动该service服务. 值得注意的是,虽然本示例可以实现后台运行服务的功能,但是当用户按home键进行清楚内存的时候依然可以把ap

Android中如何像 360 一样优雅的杀死后台服务而不启动

Android中,虽然有很多方法(API或者shell命令)杀死后台`service`,但是仍然有很多程序几秒内再次启动,导致无法真正的杀死.这里主要着重介绍如何像 360 一样杀死Android后台服务,而不会再次启动. 一.已知的 kill 后台应用程序的方法 android.os.Process.killProcess(pid); activityManager.killBackgroundProcesses(pkgName); kill -9 pid 这三种方法都可以“杀死”后台应用程序

Android Services (后台服务)

一.简介 服务是可以在后台执行长时间运行的应用程序组件,它不提供用户界面. 另一个应用程序组件可以启动一个服务,并且即使用户切换到另一个应用程序,它仍然在后台运行. 另外,组件可以绑定到一个服务来与它进行交互,甚至执行进程间通信(IPC). 例如,服务可以从后台处理网络交易,播放音乐,执行文件I / O或与内容提供商交互. 这些是三种不同类型的服务: Scheduled(计划的服务)--- Android 5.0后可用当在Android 5.0(API级别21)中引入的诸如JobSchedule

Android官方开发文档Training系列课程中文版:后台服务之IntentService的创建

原文地址:http://android.xsoftlab.net/training/run-background-service/index.html 引言 除非特别指定,否则所有的操作都是在UI线程中执行的.不过这会引起问题,因为长时间的耗时操作会妨碍UI线程的运行.这会惹恼用户,并可能会引起系统错误.为了避免这样的情况出现,Android为此提供了一些类,可以使这些耗时操作放在单独的线程中执行.这里用到最多的就是IntentService了. 这节课主要学习如何实现IntentService

使用coding.net搭建自己的微信公众号后台服务

首先你得要注册成为Coding.net的用户. 打开之后映入眼帘的就是这个萌萌的图标啦!PS:本来今天早上想继续写来这,结果...Coding.net挂了,希望可怜的攻城师们能早点恢复吧.>(7月23日早6点)---好吧,我把操作步骤放到了项目说明里面.直接去项目说明看吧附上项目地址:https://coding.net/u/yaoml/p/weixinByFlask/git 使用coding.net搭建自己的微信公众号后台服务

Android Service 后台服务之本地服务

Service是Android系统的服务组件,适用于开发没有用户界面且长时间在后台运行的功能 - Service简介 因为手机硬件性能和屏幕尺寸的限制,通常Android系统仅允许一个应用程序处于激活状态并显示在手机屏幕上,而暂停其他处于未激活状态的程序. 因此,Android系统需要一种后台服务机制,允许在没有用户界面的情况下,使程序能够长时间在后台运行,实现应用程序的后台服务功能. 在实际应用中,有很多应用需要使用Service,比如MP3播放器要求在关闭播放器界面后,仍然能够后台保持音乐持

微信小程序后台服务的发布

首先需发布小程序后台服务需要满足以下条件: ①服务的域名必须为备案的Https网站,支持二级域名不支持IP地址加端口的域名 ②其次部署服务的服务器系统环境需支持TLS1.2以上 一.Https网站 需要将普通的Http网站转换为Https网站,则需要ssl证书,将证书直接绑定到网站上即可,获取证书的途径主要有以下几种: 将Http网站就需要有以下几个途径: (1)在腾讯云或阿里云去申请,由于有效期只有一年,到期后需要重新申请替换,也比较麻烦,此处就不做讲述 (2)购买收费的ssl证书,这个简单易