Android Activity 全局管理 终极解决方案
2016-07-29 20:40
477 查看
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工程源码
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories