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

檢測App是否在后臺期間被銷毀

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

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

重啟App

最終能否成功重啟App依據(jù)所使用設(shè)備及其OS而定,非Android提供標(biāo)準(zhǔ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);

這份代碼會重演App啟動過程,但 不會 重新初始化程序,因此static變量會保留上次運行的狀態(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并啟動一個新的Activity覆蓋在前一個Activity棧上,按Back鍵會回到上次啟動的app。
System.exit(0); 貌似不起作用,應(yīng)該使用 finish() 來做關(guān)閉。
部分設(shè)備無法表現(xiàn)出重啟App行為。
System.exit(0); 會對多線程程序產(chǎn)生不可預(yù)料的惡性后果,尤其其他線程在操作I/O的時候。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容