版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HUandroid/article/details/79753935
Activity进行全局管理
经常会用到app退出的功能,一般实现为以下几种:
- System.exit(0) 使用系统的方法,强制退出 太暴力
- 抛出异常,强制退出 体验更差
- 广播退出 性能浪费
- Application退出 比较常用的方法
优点:当应用程序启动时,会自动帮我们创建一个Application,而且一个应用程序只能存在一个Application,它的生命周期也是跟应用同步的,所以这里可以对activity进行全局管理:创建一个维护activity的list,创建activity就往里面添加,退出activitiy就移除activity。看代码:
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);
Loger.d("activityList:size:"+mActivitys.size());
}
/**
* @param activity 作用说明 :删除一个activity在管理里
*/
public void popActivity(Activity activity) {
mActivitys.remove(activity);
Loger.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 {
Loger.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);
}
}
});
}
}
}
部分解释:
1.private static List mActivitys = Collections
.synchronizedList(new LinkedList());`
使用Collections.synchronizedList可以保证线程安全
2.registerActivityLifecycleCallbacks为activity的生命周期监听的回调方法。
3.
退出应用,循环遍历finish关掉所有activity,清空集合,使用try/catch防止退出方法异常。
/**
* 退出应用程序
*/
public static void appExit() {
try {
Loger.e("app exit");
finishAllActivity();
} catch (Exception e) {
}
}
/**
* 结束所有Activity
*/
public static void finishAllActivity() {
if (mActivitys == null) {
return;
}
for (Activity activity : mActivitys) {
activity.finish();
}
mActivitys.clear();
}
使用:创建其子类继承AbsSuperApplication,并实现其抽象方法就行了
@Override
protected String getAppNameFromSub() {
PackageManager pm = this.getPackageManager();
String appName = getApplicationInfo().loadLabel(pm).toString();
return appName;
}
全局管理好处可以帮助我们结束应用,或者创建全局Dialog。实现更加便捷