检测App是否在后台期间被销毁
添加一个null值的Object标记对象到Application,并在App运行期间赋值一个非null任意对象,如果App在后台期间被OS销毁,则该对象会被清空(适用于static和非static类型)
但该Application对象不一定会从内存销毁(尤其定制化版本系统),当App进程被OS终止,并重新从最近运行列表中恢复时,Application的onCreate使用的对象引用可能依旧为进程终止前的Application地址,因此不可以此为依据判断是否被系统终止进程。
重启App
最终能否成功重启App依据所使用设备及其OS而定,非Android提供标准功能,不保证平台一致性体验,并且正常情况下不推荐重启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变量会保留上次运行的状态值。完全的重启App需要调用
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系统上,貌似表现为finish掉当前Activity并启动一个新的Activity覆盖在前一个Activity栈上,按Back键会回到上次启动的app。
System.exit(0);
貌似不起作用,应该使用finish()
来做关闭。
部分设备无法表现出重启App行为。
System.exit(0);
会对多线程程序产生不可预料的恶性后果,尤其其他线程在操作I/O的时候。
杀死当前进程,也可使用 android.os.Process.killProcess(android.os.Process.myPid())
实现。