神奇的ActivityLifecycleCallbacks,解决Activity管理的后顾之忧

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaoyantan/article/details/70337980

最近做项目,在极光推送收到通知时,经常要各种跳转。那么一大堆问题来了:收到通知时,应用是否打开?应用打开了是否处于前台(有没有按Home键之类的)?处于栈顶的Activity是否是你要跳转的Activity?栈顶的Activity是否又是登录页面等等…下面带大家看看如何有效使用ActivityLifecycleCallbacks来解决这一系列问题。

public class ActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks, ActivityState {

    private List<Activity> activityList=new ArrayList<>();
    private List<Activity> resumeActivity=new ArrayList<>();

    @Override
    public int count() {
        return activityList.size();
    }
    @Override
    public boolean isFront() {
        return resumeActivity.size() > 0;
    }
    @Override
    public Activity current() {
        return activityList.size()>0 ? activityList.get(0): null;
    }

    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        activityList.add(0, activity);
    }
    @Override
    public void onActivityStarted(Activity activity) {
    }

    @Override
    public void onActivityResumed(Activity activity) {
        if (!resumeActivity.contains(activity)) {
            resumeActivity.add(activity);
        }
    }

    @Override
    public void onActivityPaused(Activity activity) {
    }

    @Override
    public void onActivityStopped(Activity activity) {
        resumeActivity.remove(activity);
    }

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

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

}

接口ActivityState

public interface ActivityState {
    /**
     * 得到当前Activity
     * @return
     */
    Activity current();

    /**
     * 任务栈中Activity的总数
     * @return
     */
    int count();
    /**
     * 判断应用是否处于前台,即是否可见
     * @return
     */
    boolean isFront();
}

如何在Application中初始化:

public class MyApplication extends Application {
    public ActivityLifecycleCallbacks activityLifecycleCallbacks = new ActivityLifecycleCallbacks();
     @Override
    public void onCreate() {
        super.onCreate();
    this.registerActivityLifecycleCallbacks(activityLifecycleCallbacks);
   、、、
 }

使用,简单列举一些,其他的大家可以根据自己的情况判断使用。

public class JPushReceiver extends BroadcastReceiver{

        private Context context;
        private ActivityLifecycleCallbacks activityLifecycleCallbacks;

        @Override
        public void onReceive(Context context, Intent intent) {
            this.context = context;
            MyApplication application = (MyApplication) context.getApplicationContext();
            activityLifecycleCallbacks = application.activityLifecycleCallbacks;
//            如果应用处于前台做某些操作(一般此时,收到通知和点击通知栏做相同的操作)
            if (activityLifecycleCallbacks.isFront()) {
                if (activityLifecycleCallbacks.current() instanceof SomeActivity) {
//                    如果当前Activity是要跳转的Activity,做某些操作,一般不跳转,可用EventBus
                    、、、
                } else {
//                    否则执行跳转或其他相关操作等
                   、、、
                }
                、、、
            }else  if ("cn.jpush.android.intent.NOTIFICATION_OPENED".equals(intent.getAction())){
//                应用处于不可见状态,一般点击通知栏是跳转到某个页面
                、、、
            }
        }
}

当然还有ActivityLifecycleCallbacks还有其他作用,等着大家去发现

猜你喜欢

转载自blog.csdn.net/xiaoyantan/article/details/70337980