Android ActivityLifecycleCallbacks 监听当前是否处于应用中的某些特定Activity界面

1.需求:

有一个新功能需要做一个悬浮球,在功能页面的时候,悬浮球隐藏,不在则显示。

因为这个功能代码是放在了SystemUI里面。不能直接判断当前的包名,只能判断当前的Activity是不是我们写的那几个。

2.代码实现:

判断当前Activity是不是我们写的那几个Activity,如果在不修改AMS的前提下可以通过注册一个ActivityLifecycleCallbacks 回调。注册完后。这个应用的所有Activity都会走里面相应的回调方法。

2.1注册(可以在MainActivity 的onCreate()里面注册,看个人需求)

ActivityLifeCycleMonitor.getInstance(this).register();

2.2.在回调里面做自己想要做的事情

ActivityLifeCycleMonitor.java
package XXXXXXX;

import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import A;
import B;
import C;

public class ActivityLifeCycleMonitor {

    private static final String TAG = "lssss";
    private int mStartCount = 0;
    private boolean mHasRegistered = false;

    private Application.ActivityLifecycleCallbacks mActivityLifecycleCallbacks;

    private static ActivityLifeCycleMonitor mInstance;
    private Context mContext;

    public static ActivityLifeCycleMonitor getInstance(Context context) {
        Log.i(TAG, "getInstance: context = "+context);
        if (mInstance == null) {
            mInstance = new ActivityLifeCycleMonitor(context);
        }
        return mInstance;
    }

    private ActivityLifeCycleMonitor(Context context) {
        this.mContext = context;
        mActivityLifecycleCallbacks = new Application.ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle bundle) {
            }

            @Override
            public void onActivityStarted(Activity activity) {
                Log.i(TAG,"onActivityStarted: isHideActivity(activity) = "+isHideActivity(activity));
                if (isHideActivity(activity)) {
                    mStartCount++;
                    Log.i(TAG, "onActivityStarted: mStartCount = "+mStartCount);
                    if (mStartCount == 1) {
                        isSmarttvOnForeground(true);
                    }
                }
            }

            @Override
            public void onActivityResumed(Activity activity) {
            }

            @Override
            public void onActivityPaused(Activity activity) {
                Log.i(TAG,"onActivityPaused: isHideActivity(activity) = "+isHideActivity(activity));
            }

            @Override
            public void onActivityStopped(Activity activity) {
                Log.i(TAG,"onActivityStopped: isHideActivity(activity) = "+isHideActivity(activity));
                if (isHideActivity(activity)) {
                    mStartCount--;
                    Log.i(TAG, "onActivityStopped: mStartCount = "+mStartCount);
                    if (mStartCount == 0) {
                        isSmarttvOnForeground(false);
                    }
                }
            }

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

            @Override
            public void onActivityDestroyed(Activity activity) {
            }
        };
    }

    public void register() {
        Log.i(TAG,"mHasRegistered = "+mHasRegistered);
        if (!mHasRegistered) {
            ((Application) mContext.getApplicationContext()).registerActivityLifecycleCallbacks(mActivityLifecycleCallbacks);
            mHasRegistered = true;
        }
    }

    public void unregister() {
        if (mHasRegistered) {
            ((Application) mContext.getApplicationContext()).unregisterActivityLifecycleCallbacks(mActivityLifecycleCallbacks);
            mHasRegistered = false;
        }

    }

    private boolean isHideActivity(Activity activity) {
        return activity instanceof A
                || activity instanceof B
                || activity instanceof C;
    }

    private void isSmarttvOnForeground(boolean isSmarttvOnForeground) {
        if(isSmarttvOnForeground){
            //在前台了,你要做么子
        } else {
           //不在前台了
        }
    }
}

3.找个合适的地方解注册

ActivityLifeCycleMonitor.getInstance(this).unregister();

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值