利用Appliaton的ActivityLifecycleCallbacks管理Activity

文章目录

1 简介

有时候我们是需要管理应用的 Activitiy,作一些统计、退出应用等操作。通常我们会写一个工具类,使用一个栈 Stack 管理所有的 Activity,需要在 BaseActivity 中重写 onCreate 方法,使用工具类将 Activity 添加到栈中,在结束页面时要将 Activity 从栈中移除。

其实 Application 有一个内部类 ActivityLifecycleCallbacks ,我们可以在 Application 中注册这个回调(registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks) 方法),用于监听应用中所有 Activity 的生命周期,这个非常有用,我们同样可以用一个 栈 Stack 结合 ActivityLifecycleCallbacks 的回调方法,来管理应用的 Activity。

2 代码

利用 Appliaton 的 ActivityLifecycleCallbacks 管理 Activity,参考代码如下:

import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;

import java.util.Stack;

public class BaseApplication extends Application {
    
    
    public static BaseApplication mApp;
    private static Stack<Activity> mActivityStack;
    private int mForegroundActivityCount = 0;

    public static Context getAppContext() {
    
    
        return mApp.getApplicationContext();
    }

    public static BaseApplication getApp() {
    
    
        return mApp;
    }


    @Override
    public void onCreate() {
    
    
        super.onCreate();
        mApp= this;
        mActivityStack = new Stack<>();
        initRegister();
    }

    private void initRegister() {
    
    
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
    
    
            @Override
            public void onActivityCreated(Activity activity, Bundle bundle) {
    
    
                mActivityStack.add(activity);
            }

            @Override
            public void onActivityStarted(Activity activity) {
    
    
                mForegroundActivityCount++;
            }

            @Override
            public void onActivityResumed(Activity activity) {
    
    
            }

            @Override
            public void onActivityPaused(Activity activity) {
    
    
            }

            @Override
            public void onActivityStopped(Activity activity) {
    
    
                mForegroundActivityCount--;
            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
    
    
            }

            @Override
            public void onActivityDestroyed(Activity activity) {
    
    
                mActivityStack.remove(activity);
            }
        });
    }
    /**
     * 前台Activity的个数
     * @return > 0,处于前台;= 0,退到后台。
     */
    public int getForegroundActivityCount(){
    
    
        return mForegroundActivityCount;
    }

    /**
     * 是否在后台
     * @return
     */
    public boolean isInBackground() {
    
    
        return mForegroundActivityCount <= 0;
    }


    /**
     * 当前Activity
     */
    public static Activity getCurrActivity() {
    
    
        return mActivityStack.lastElement();
    }


    /**
     * 退出应用
     */
    public void exitApp() {
    
    
        finishAllActivities();
        killProcess();
    }

    /**
     * 关闭所有Activity
     */
    public void finishAllActivities() {
    
    
        // 先打印当前容器内的Activity列表
        for (Activity activity : mActivityStack) {
    
    
            Log.d("Application", activity.getLocalClassName());
        }

        // 逐个退出Activity
        for (Activity activity : mActivityStack) {
    
    
            activity.finish();
        }

    }

    public void killProcess() {
    
    
        // 方式1:android.os.Process.killProcess()
        android.os.Process.killProcess(android.os.Process.myPid());

        // 方式2:System.exit()
        // System.exit() = Java中结束进程的方法:关闭当前JVM虚拟机
        System.exit(0);

        // System.exit(0)和System.exit(1)的区别
        // 1. System.exit(0):正常退出;
        // 2. System.exit(1):非正常退出,通常这种退出方式应该放在catch块中。

    }

    @Override
    public void onTerminate() {
    
    
        super.onTerminate();
        mActivityStack = null;
        mApp = null;
    }
}

另参考:https://blog.csdn.net/u010072711/article/details/77090313

猜你喜欢

转载自blog.csdn.net/wangxiaocheng16/article/details/91971322
今日推荐