前言
在android開發中我們都會遇到一個需求,那就是退出應用,那么我們都會退出所有的activity。
我們一般常用的方式有下面幾種:
第一種方式
我們寫一個BaseActivity,在activity的創建的時候添加當前activity到集合中,在activity銷毀的時候把當前activity移除出activity集合。退出應用時直接遍歷activity集合,然后分別調用activity的finish()方法。
package com.huangjie.exitapplication;
import android.app.Activity;
import java.util.ArrayList;
/**
* 應用管理類
*/
public class ActivityManager {
private static ArrayList<Activity> mActivityList;
private ActivityManager() {
}
/**
* 添加activity
*
* @param activity
*/
public static void addActivity(Activity activity) {
if (mActivityList == null) {
mActivityList = new ArrayList<>();
}
mActivityList.add(activity);
}
/**
* 移除activity
*
* @param activity
*/
public static void removeActivity(Activity activity) {
mActivityList.remove(activity);
}
/**
* 退出應用
*/
public static void exit() {
for (Activity activity : mActivityList) {
activity.finish();
}
mActivityList.clear();
}
}
package com.huangjie.exitapplication;
import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
/**
* Activity基類
*/
public class BaseActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityManager.addActivity(this);
}
@Override
protected void onDestroy() {
ActivityManager.removeActivity(this);
super.onDestroy();
}
}
第二種方式廣播式
BaseActivity中注冊一個廣播接收器,在廣播接收器中finish掉當前activity。所有的Activity繼承BaseActivity。
package com.huangjie.exitapplication;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.annotation.Nullable;
public class BaseActivity extends Activity {
private static String ACTION = "activity_exit";
private BroadcastReceiver mExitReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
finish();
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION);
registerReceiver(mExitReceiver, filter);
}
@Override
protected void onDestroy() {
unregisterReceiver(mExitReceiver);
super.onDestroy();
}
}
還有殺進程的方式。拋異常方式等等,這些都不夠優雅,第一種方式如果當一個activity異常退出,是不會回掉onDestroy()方法,也就意味我們靜態Activity集合無法移除當前activity,會導致內存泄漏。android 系統為每個應用分配的內存都是有限的,如果內存泄漏到一定程度就會導致應用崩潰。
第三種方式
ActivityLifecycleCallbacks 這個接口看著名字大概都能猜出來他是activity生命周期回掉接口。
public interface ActivityLifecycleCallbacks {
void onActivityCreated(Activity activity, Bundle savedInstanceState);
void onActivityStarted(Activity activity);
void onActivityResumed(Activity activity);
void onActivityPaused(Activity activity);
void onActivityStopped(Activity activity);
void onActivitySaveInstanceState(Activity activity, Bundle outState);
void onActivityDestroyed(Activity activity);
}
當我們一旦給應用注冊了ActivityLifecycleCallbacks,那么上面接口中對應的方法都是應用中所有activity的生命周期都會回掉的方法。不管是我們寫的activity,還是我們引用的第三方庫中activity的生命周期都會回掉這些方法。那么我們我們可以在這里做處理。
package com.huangjie.exitapplication;
import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import java.util.ArrayList;
public class MyApplication extends Application {
private ActivityLifecycleCallbacks mcallBack;
private static ArrayList<Activity> mActiivtyList;
@Override
public void onCreate() {
super.onCreate();
initLifeCallBack();
registerActivityLifecycleCallbacks(mcallBack);
}
private void initLifeCallBack() {
mcallBack = new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
if (mActiivtyList == null) {
mActiivtyList = new ArrayList<>();
}
mActiivtyList.add(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 bundle) {
}
@Override
public void onActivityDestroyed(Activity activity) {
mActiivtyList.remove(activity);
}
};
}
/**
* 退出應用程序
*/
public static void exit() {
for (Activity activity : mActiivtyList) {
activity.finish();
}
mActiivtyList.clear();
}
}