首页 > 代码库 > android如何做到类似于微信那样后台服务不会被杀死?

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一下,等待结果

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