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如何做到类似于微信那样后台服务不会被杀死?
原文:http://www.cnblogs.com/liangxieliang56/p/4002019.html