經(jīng)過(guò)整理可行的方案有以下四種,最好配合使用:
1.前臺(tái)服務(wù)
前臺(tái)服務(wù)是被認(rèn)為是用戶(hù)已知的正在運(yùn)行的服務(wù)阶剑,當(dāng)系統(tǒng)需要釋放內(nèi)存時(shí)不會(huì)優(yōu)先殺掉該進(jìn)程罩息,前臺(tái)服務(wù)必須有一個(gè) notification 在狀態(tài)欄中顯示。
NotificationCompat.Builder nb = new NotificationCompat.Builder(this);
nb.setOngoing(true);
nb.setContentTitle(getString(R.string.app_name));
nb.setContentText(getString(R.string.app_name));
nb.setSmallIcon(R.drawable.icon);
PendingIntent pendingintent =PendingIntent.getActivity(this, 0, new Intent(this, Main.class), 0);
nb.setContentIntent(pendingIntent);
startForeground(1423, nb.build());
【可行性】此方法對(duì)防止系統(tǒng)回收有一定的效果个扰,可以減少被回收的概率,但是系統(tǒng)在內(nèi)存極低的情況下葱色,該Service還是會(huì)被kill掉递宅,并且不一定會(huì)重啟。而清理工具或者手動(dòng)強(qiáng)制結(jié)束苍狰,進(jìn)程直接掛掉办龄,并不會(huì)重啟。
2.監(jiān)聽(tīng)系統(tǒng)廣播
通過(guò)監(jiān)聽(tīng)系統(tǒng)的一些廣播淋昭,比如:手機(jī)開(kāi)機(jī)俐填、解鎖屏、網(wǎng)絡(luò)連接狀態(tài)變更翔忽、應(yīng)用狀態(tài)改變等等英融,然后判斷Service是否存活,若否則啟動(dòng)Service歇式。
【可行性】Android系統(tǒng)在3.1版本以后為了加強(qiáng)系統(tǒng)安全性和優(yōu)化性能對(duì)系統(tǒng)廣播進(jìn)行了限制驶悟,應(yīng)用監(jiān)控手機(jī)開(kāi)機(jī)、解鎖屏材失、網(wǎng)絡(luò)連接狀態(tài)改變等有規(guī)律的系統(tǒng)廣播在android3.1以后痕鳍,首次安裝未啟動(dòng)或者用戶(hù)強(qiáng)制停止后,應(yīng)用無(wú)法監(jiān)聽(tīng)到。Android N取消了網(wǎng)絡(luò)切換廣播笼呆。
3.應(yīng)用之間互拉
利用不同的app進(jìn)程使用廣播來(lái)進(jìn)行相互喚醒熊响,比如支付寶、淘寶诗赌、天貓汗茄、等阿里系的app,如果打開(kāi)其中任意一個(gè)應(yīng)用境肾,其它阿里系的app也會(huì)喚醒了剔难,其實(shí)BAT系都差不多。另外現(xiàn)在很多推送sdk也會(huì)喚醒a(bǔ)pp奥喻。
【可行性】多個(gè)app應(yīng)用喚醒需要相互之間有關(guān)聯(lián)才能實(shí)現(xiàn)偶宫,推送sdk應(yīng)用間喚醒當(dāng)用戶(hù)強(qiáng)制停止后無(wú)法喚醒。
4.利用Android系統(tǒng)提供的帳號(hào)和同步機(jī)制實(shí)現(xiàn)
在應(yīng)用中建立一個(gè)帳號(hào)环鲤,然后開(kāi)啟自動(dòng)同步并設(shè)置同步間隔時(shí)間纯趋,利用同步喚醒a(bǔ)pp。賬號(hào)建立后在手機(jī)設(shè)置-賬號(hào)中能看到應(yīng)用的賬號(hào)冷离,用戶(hù)可能會(huì)刪除賬號(hào)或者停止同步吵冒,故需要經(jīng)常檢測(cè)賬號(hào)是否能正常同步。
//建立賬號(hào)
AccountManager accountManager = AccountManager.get(mContext);
Account riderAccount = new Account(mContext.getString(R.string.app_name), Constant.ACCOUNT_TYPE);
accountManager.addAccountExplicitly(riderAccount, mContext.getString(R.string.app_name), null);
ContentResolver.setIsSyncable(riderAccount, Constant.ACCOUNT_AUTHORITY, 1);
ContentResolver.addPeriodicSync(riderAccount, Constant.ACCOUNT_AUTHORITY, new Bundle(), 60);
//開(kāi)啟同步
ContentResolver.setSyncAutomatically(riderAccount, Constant.ACCOUNT_AUTHORITY, true);