檢測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)。