【Android】App在后臺(tái)被清理后的終極應(yīng)對(duì)手段——重啟應(yīng)用

檢測(cè)App是否在后臺(tái)期間被銷毀

添加一個(gè)null值的Object標(biāo)記對(duì)象到Application,并在App運(yùn)行期間賦值一個(gè)非null任意對(duì)象,如果App在后臺(tái)期間被OS銷毀,則該對(duì)象會(huì)被清空(適用于static和非static類型)

但該Application對(duì)象不一定會(huì)從內(nèi)存銷毀(尤其定制化版本系統(tǒng)),當(dāng)App進(jìn)程被OS終止,并重新從最近運(yùn)行列表中恢復(fù)時(shí),Application的onCreate使用的對(duì)象引用可能依舊為進(jìn)程終止前的Application地址,因此不可以此為依據(jù)判斷是否被系統(tǒng)終止進(jìn)程。

重啟App

最終能否成功重啟App依據(jù)所使用設(shè)備及其OS而定,非Android提供標(biāo)準(zhǔn)功能,不保證平臺(tái)一致性體驗(yàn),并且正常情況下不推薦重啟App。

版本1.a 版本1.b(108/115 Votes)

Intent i = getBaseContext().getPackageManager()
         .getLaunchIntentForPackage( getBaseContext().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);

這份代碼會(huì)重演App啟動(dòng)過程,但 不會(huì) 重新初始化程序,因此static變量會(huì)保留上次運(yùn)行的狀態(tài)值。完全的重啟App需要調(diào)用 System.exit(0)

版本2(172 Votes)

Intent mStartActivity = new Intent(context, StartActivity.class);
int mPendingIntentId = 123456;
PendingIntent mPendingIntent = PendingIntent.getActivity(context, mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManage+r mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
System.exit(0);

4.3、4.4系統(tǒng)上,貌似表現(xiàn)為finish掉當(dāng)前Activity并啟動(dòng)一個(gè)新的Activity覆蓋在前一個(gè)Activity棧上,按Back鍵會(huì)回到上次啟動(dòng)的app。
System.exit(0); 貌似不起作用,應(yīng)該使用 finish() 來做關(guān)閉。
部分設(shè)備無法表現(xiàn)出重啟App行為。
System.exit(0); 會(huì)對(duì)多線程程序產(chǎn)生不可預(yù)料的惡性后果,尤其其他線程在操作I/O的時(shí)候。

殺死當(dāng)前進(jìn)程,也可使用 android.os.Process.killProcess(android.os.Process.myPid()) 實(shí)現(xiàn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容