android 4.0以后,在Application中提供了activity生命周期的统一管理。首先,建立一个ActivityManager类用于全局管理Activity。话不多说,直接上代码。
package com.example.wmk.utils; import android.app.Activity; import com.lidroid.xutils.util.LogUtils; import java.util.Collections; import java.util.LinkedList; import java.util.List; /** * Created by 老王 on 2016/12/1. */ public class ActivityManager { /** * ActivityManager */ private static ActivityManager MANAGER = null; /** * 维护Activity的list */ private List<Activity> mActivitys = null; public List<Activity> getActivitys() { return mActivitys; } /** * Get Instance * * @return ActivityManager */ public static ActivityManager getInstance() { if (MANAGER == null) { MANAGER = new ActivityManager(); } return MANAGER; } private ActivityManager() { mActivitys = Collections.synchronizedList(new LinkedList<Activity>()); } /** * @param activity 作用说明 :添加一个activity到管理里 */ public void pushActivity(Activity activity) { mActivitys.add(activity); LogUtils.i("activityList:size:" + mActivitys.size()); } /** * @param activity 作用说明 :删除一个activity在管理里 */ public void popActivity(Activity activity) { mActivitys.remove(activity); LogUtils.i("activityList:size:" + mActivitys.size()); } /** * @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 void finishAllActivity() { if (mActivitys == null) { return; } for (Activity activity : mActivitys) { activity.finish(); } mActivitys.clear(); } /** * 退出应用程序 */ public void appExit() { try { LogUtils.i("app exit"); finishAllActivity(); } catch (Exception e) { e.printStackTrace(); } } /** * 强行退出程序(异常) */ public void appExceptionExit() { try { LogUtils.e("app exception exit"); finishAllActivity(); // 退出程序 System.exit(0); android.os.Process.killProcess(android.os.Process.myPid()); } catch (Exception e) { e.printStackTrace(); } } }
其次,在Application中调用ActivityManager进行activity统一管理。
package com.example.wmk; import android.app.Activity; import android.app.Application; import android.os.Build; import android.os.Bundle; import com.example.wmk.utils.ActivityManager; import com.example.wmk.utils.ProjectUtils; import com.lidroid.xutils.util.LogUtils; /** * Created by 老王 on 2016/12/1. */ public class WMKApplication extends Application { ActivityManager mActivityManager; @Override public void onCreate() { super.onCreate(); //init ActivityManager mActivityManager = ActivityManager.getInstance(); // 注册activity监听器 registerActivityListener(); if (ProjectUtils.init()) { LogUtils.d("初始化成功!"); } else { mActivityManager.appExceptionExit(); } } 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 */ mActivityManager.pushActivity(activity); /** * 栈顶元素名称 */ LogUtils.d("TopActivityName:" + mActivityManager.getTopActivityName()); } @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 == mActivityManager.getActivitys() && mActivityManager.getActivitys().isEmpty()) { return; } if (mActivityManager.getActivitys().contains(activity)) { /** * 监听到 Activity销毁事件 将该Activity 从list中移除 */ mActivityManager.popActivity(activity); } } }); } } }
最后,在清单文件中调用WMKApplication,代码如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.wmk"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <application android:name=".WMKApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".activity.MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
项目中导入了第三方xUtils-2.6.14.jar包用于打印Log。