监听APP前后台切换

环境

Android Studio 3.5

问题描述

APP需要在退到后台,或者从后台回到前台时执行操作。因此需要监听APP前后台切换

问题解决

通过网络查找,得到如下在Application中判断的方法,另外为优化使用,结合了广播方式,将前后台切换通过广播外发,解决Application职责过重缺陷。具体而言就是使用Android 提供的 Application.ActivityLifecycleCallbacks 接口。水平有限,不在这里分析原理,只放实现代码。
具体步骤:

  1. 在继承自Application的类中复写onCreate()方法,
  2. 在该方法中调用registerActivityLifecycleCallbacks方法注册ActivityLifecycleCallbacks

具体代码如下:

public class MyApplication extends Application {

    /**
     * 当前Activity个数
     */
    private int activityCount = 0;
	
	private static MyApplication instance;

    @Override
    public void onCreate() {
        super.onCreate();
	    instance = this;
	   registerActivityLifecycleCallbacks(activityLifecycleCallbacks);
    }

    ActivityLifecycleCallbacks activityLifecycleCallbacks = new ActivityLifecycleCallbacks() {
        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

        }

        @Override
        public void onActivityStarted(Activity activity) {
            if (activityCount == 0) {
                //从后台进入前台
 LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(new Intent(Consts.BROADCAST_APP_FROEGROUND));
            }
            activityCount++;
        }

        @Override
        public void onActivityResumed(Activity activity) {

        }

        @Override
        public void onActivityPaused(Activity activity) {

        }

        @Override
        public void onActivityStopped(Activity activity) {
            activityCount--;
            if (activityCount == 0) {
                //进入后台
                LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(new Intent(Consts.BROADCAST_APP_BACKROUND));
            }
        }

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

        }

        @Override
        public void onActivityDestroyed(Activity activity) {

        }
    };

	public static MyApplication getInstance() {
		return instance;
	}

	public int getActivityCount() {
		return activityCount;
	}
}

参考其他博文,该接口可监控所有Activity状态切换,所以也在特定Activity状态变化时执行想要的操作。我这里是在一个Service里面接收该广播。

补充说明

对于 MyApplication 获取其实例方法 getInstance() ,应该使用如上初始化和获取方式,不能单使用如下方式:

	public static MyApplication getInstance() {
		if (instance == null) {
			instance = new MyApplication();
		}
		return instance;
	}

如果这样做,会导致获取 getActivityCount() 始终为0。这是因为通过 new 实际会获取到一个新的实例对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值