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();