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