app退出應用桦沉,很多時候采用關閉當前進程的方式:
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
經(jīng)測試發(fā)現(xiàn)這種方式不能正真退出進程刺洒,安卓系統(tǒng)在退出進程后會自動檢查應用是否還有activity或service阴幌,如果有activity還在返回棧中或者service沒有退出的話诀拭,會重新開啟app鸵荠,application的onCreate()方法會再次執(zhí)行炬藤,并且系統(tǒng)會試圖回到上一次退出時的activity晾捏。所以用這種方式不能完全退出應用样屠。
目前比較流行的做法是在application中registerActivityLifecycleCallbacks穿撮,自己創(chuàng)建activity的管理棧。退出時finish掉所有的activity痪欲,如果要徹底退出的話再關閉掉所有的seveice:
在application中:
private static ListmActivitys =Collections.synchronizedList(new LinkedList());
@Override
public void onCreate() {
super.onCreate();
?registerActivityListener();
}
private void registerActivityListener() {
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
? ? ? ? public void onActivityCreated(Activity activity,Bundle savedInstanceState) {
/**
? ? ? ? ? ? *? 監(jiān)聽到 Activity創(chuàng)建事件 將該 Activity 加入list
*/
? ? ? ? ? ? pushActivity(activity);
}
@Override
? ? ? ? public void onActivityStarted(Activity activity) {
}
@Override
? ? ? ? public void onActivityResumed(Activity activity) {
}
@Override
? ? ? ? public void onActivityPaused(Activity activity) {
}
@Override
? ? ? ? public void onActivityStopped(Activity activity) {
}
@Override
? ? ? ? public void onActivitySaveInstanceState(Activity activity,Bundle outState) {
}
@Override
? ? ? ? public void onActivityDestroyed(Activity activity) {
if (null ==mActivitys &&mActivitys.isEmpty()) {
return;
}
if (mActivitys.contains(activity)) {
/**
? ? ? ? ? ? ? ? *? 監(jiān)聽到 Activity銷毀事件 將該Activity 從list中移除
? ? ? ? ? ? ? ? */
? ? ? ? ? ? ? ? popActivity(activity);
}
}
});
}
/**
* @param activity 作用說明 :添加一個activity到管理里
*/
public void pushActivity(Activity activity) {
mActivitys.add(activity);
RYLogUtils.d(TAG,"activityList:size:" +mActivitys.size());
}
/**
* @param activity 作用說明 :刪除一個activity在管理里
*/
public void popActivity(Activity activity) {
mActivitys.remove(activity);
RYLogUtils.d(TAG,"activityList:size:" +mActivitys.size());
}
/**
* 結束所有Activity
*/
public static void finishAllActivity() {
if (mActivitys ==null) {
return;
}
for (Activity activity :mActivitys) {
activity.finish();
}
mActivitys.clear();
}
/**
* 退出應用程序
*/
public void appExit() {
try {
RYLogUtils.e(TAG,"app exit");
finishAllActivity();
stopService(new Intent(this,xxxxx.class));
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
}catch (Exception e) {
}
}
這樣就可以完全退出app