android activity 全局,Android Activity 全局管理 终极解决方案

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 mActivitys = Collections

.synchronizedList(new LinkedList());

@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数量的变动日志:

47aa13162e3c

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值