Android Activity 全局管理 終極解決方案
管理Activity的好處
在Android 開發中 Activity 的管理 對于一個App是至關重要的,管理所有Activity 不僅能實現在應用推出時關閉所有activity,還能實現獲取當前Activity上一個Activity、尋找某個類型的Activity、結束某個Activity,以及Activity之間的跳轉等多種交互操作。
傳統的實現方式
之前管理Activity 的方式是在BaseActivity onCreate 方法中將Activity 實例存入工具類 或者BaseActivity 中維護的一個List或stack中,這樣能應對多數情況下的問題,但假如有Activity沒有繼承封裝的BaseActivity,那每個Activity 就都要在onCreate方法中寫添加到維護list的代碼,同時當Activity銷毀時,也要從list中將Activity移除,等等,邏輯可謂復雜,代碼也較難維護。
終極解決方案
所幸的是,自Android 4.0(API-14)開始,Application 中多了一個方法,可以設置全局監聽Activity的生命周期。這個方法就是:registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks activityLifecycleCallbacks)在傳入的參數 activityLifecycleCallbacks 能得到全局所有Activity 生命周期的回調,因此 我們可以從Application中全局監聽所有Activity 并對其進行管理,再也不用在Activity中處理那些扯淡的邏輯,不廢話,直接上代碼:
package com.kevin.baselibrary.app;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import com.kevin.baselibrary.utils.LogUtils;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
/**
* Created by bailiangjin on 16/4/11.
*/
public abstract class AbsSuperApplication extends Application {
protected static Context context;
protected static String appName;
/**
* 維護Activity 的list
*/
private static List<Activity> mActivitys = Collections
.synchronizedList(new LinkedList<Activity>());
@Override
public void onCreate() {
super.onCreate();
context = this.getApplicationContext();
appName = getAppNameFromSub();
registerActivityListener();
}
public static String getAppName() {
return appName;
}
public static Context getContext() {
return context;
}
protected abstract String getAppNameFromSub();
/**
* @param activity 作用說明 :添加一個activity到管理里
*/
public void pushActivity(Activity activity) {
mActivitys.add(activity);
LogUtils.d("activityList:size:"+mActivitys.size());
}
/**
* @param activity 作用說明 :刪除一個activity在管理里
*/
public void popActivity(Activity activity) {
mActivitys.remove(activity);
LogUtils.d("activityList:size:"+mActivitys.size());
}
/**
* get current Activity 獲取當前Activity(棧中最后一個壓入的)
*/
public static Activity currentActivity() {
if (mActivitys == null||mActivitys.isEmpty()) {
return null;
}
Activity activity = mActivitys.get(mActivitys.size()-1);
return activity;
}
/**
* 結束當前Activity(棧中最后一個壓入的)
*/
public static void finishCurrentActivity() {
if (mActivitys == null||mActivitys.isEmpty()) {
return;
}
Activity activity = mActivitys.get(mActivitys.size()-1);
finishActivity(activity);
}
/**
* 結束指定的Activity
*/
public static void finishActivity(Activity activity) {
if (mActivitys == null||mActivitys.isEmpty()) {
return;
}
if (activity != null) {
mActivitys.remove(activity);
activity.finish();
activity = null;
}
}
/**
* 結束指定類名的Activity
*/
public static void finishActivity(Class<?> cls) {
if (mActivitys == null||mActivitys.isEmpty()) {
return;
}
for (Activity activity : mActivitys) {
if (activity.getClass().equals(cls)) {
finishActivity(activity);
}
}
}
/**
* 按照指定類名找到activity
*
* @param cls
* @return
*/
public static Activity findActivity(Class<?> cls) {
Activity targetActivity = null;
if (mActivitys != null) {
for (Activity activity : mActivitys) {
if (activity.getClass().equals(cls)) {
targetActivity = activity;
break;
}
}
}
return targetActivity;
}
/**
* @return 作用說明 :獲取當前最頂部activity的實例
*/
public Activity getTopActivity() {
Activity mBaseActivity = null;
synchronized (mActivitys) {
final int size = mActivitys.size() - 1;
if (size < 0) {
return null;
}
mBaseActivity = mActivitys.get(size);
}
return mBaseActivity;
}
/**
* @return 作用說明 :獲取當前最頂部的acitivity 名字
*/
public String getTopActivityName() {
Activity mBaseActivity = null;
synchronized (mActivitys) {
final int size = mActivitys.size() - 1;
if (size < 0) {
return null;
}
mBaseActivity = mActivitys.get(size);
}
return mBaseActivity.getClass().getName();
}
/**
* 結束所有Activity
*/
public static void finishAllActivity() {
if (mActivitys == null) {
return;
}
for (Activity activity : mActivitys) {
activity.finish();
}
mActivitys.clear();
}
/**
* 退出應用程序
*/
public static void appExit() {
try {
LogUtils.e("app exit");
finishAllActivity();
} catch (Exception e) {
}
}
private void registerActivityListener() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
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);
}
}
});
}
}
}
下面是運行App時 全局監聽 添加或者移除Activity的回調時打下的維護的list中Activity數量的變動日志:
工程源碼:
點擊此處 查看該示例Github工程源碼
其他文章推薦:
Android網絡請求發展簡史和RxJava+Retrofit+OkHttp實踐
Android BaseAdapter的極簡封裝