app退出应用,很多时候采用关闭当前进程的方式:
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
经测试发现这种方式不能正真退出进程,安卓系统在退出进程后会自动检查应用是否还有activity或service,如果有activity还在返回栈中或者service没有退出的话,会重新开启app,application的onCreate()方法会再次执行,并且系统会试图回到上一次退出时的activity。所以用这种方式不能完全退出应用。
目前比较流行的做法是在application中registerActivityLifecycleCallbacks,自己创建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) {
/**
* 监听到 Activity创建事件 将该 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)) {
/**
* 监听到 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