使用ActivityLifecycleCallbacks管理Activity

Android在API14之后添加了用于监听应用Activity生命周期的回调接口ActivityLifecycleCallbacks,使用时需要在Application中进行注册。
这里写图片描述
可以看到ActivityLifecycleCallbacks中的方法跟Activity生命周期方法基本是一致的。

ActivityLifecycleCallbacks的注册与取消注册

public class MyApplication extends Application {
    public static final String TAG = MyApplication.class.getSimpleName();

    /** Activity监听回调 */
    private ActivityLifecycleCallbacks activityLifecycleCallbacks = new ActivityLifecycleCallbacks() {
        ....
    };

    @Override
    public void onCreate() {
        super.onCreate();

        //可注册多次,注册多个生命周期回调
        registerActivityLifecycleCallbacks(activityLifecycleCallbacks);
        //Activity管理
        registerActivityLifecycleCallbacks(ActivityManager.getInstance());
    }

    @Override
    public void onTerminate() {
        super.onTerminate();
        //Android API中没有对此方法的过多解释,不过通常此方法会在app退出是被调用(并不是100%)

        unregisterActivityLifecycleCallbacks(activityLifecycleCallbacks);
    }
}

需要注意的是Android允许注册多个ActivityLifecycleCallbacks,并且同时生效。

使用ActivityLifecycleCallbacks优雅的管理Activity
实现ActivityLifecycleCallbacks接口,并创建Activity的任务栈,通过监听回调实现Activity的进栈和出栈。需要在Application中进行注册。

/**
 * Activity管理类<br/>
 * 需要在Application中调用registerActivityLifecycleCallbacks注册
 */
public class ActivityManager implements Application.ActivityLifecycleCallbacks {
    //Activity栈
    private Stack<Activity> activities = new Stack<>();
    private static ActivityManager activityManager;

    private ActivityManager(){
    }

    /**
     * 单例
     * @return activityManager instance
     */
    public static ActivityManager getInstance(){
        if(activityManager == null){
            synchronized (ActivityManager.class){
                if(activityManager == null){
                    activityManager = new ActivityManager();
                }
            }
        }

        return activityManager;
    }

    /**
     * 获取Activity任务栈
     * @return activity stack
     */
    public Stack<Activity> getActivityStack(){
        return activities;
    }

    /**
     * Activity 入栈
     * @param activity Activity
     */
    public void addActivity(Activity activity){
        activities.add(activity);
    }

    /**
     * Activity出栈
     * @param activity Activity
     */
    public void removeActivity(Activity activity){
        if(activity != null){
            activities.remove(activity);
        }
    }

    /**
     * 结束某Activity
     * @param activity Activity
     */
    public void finishActivity(Activity activity){
        if(activity != null){
            removeActivity(activity);
            activity.finish();
        }
    }

    /**
     * 获取当前Activity
     * @return current activity
     */
    public Activity getCurrentActivity(){
        return activities.lastElement();
    }

    /**
     * 结束当前Activity
     */
    public void finishActivity(){
        finishActivity(activities.lastElement());
    }

    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        addActivity(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) {
        removeActivity(activity);
    }
}

通过上面的Activity管理栈可以扩展实现如下需求:

  • 监听应用中集成的第三方SDK中的Activity的启动。
  • 可以控制应用中某个Activity被初始化的数量,如商城应用中的商品详情页,避免无限制的创建Activity。
  • 判断应用是否处于前台可见状态,通过onActivityResumed和onActivityPaused回调方法实现。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值