版权声明:本文为博主原创文章,未经博主允许不得转载。 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还有其他作用,等着大家去发现