消息推送打开应用之判断app状态,running or exit?
在开发过程中往往会有这样一个需求,消息推送过来,点击notification,跳转到指定页面,这样就会出现一个问题,你跳转的逻辑是怎么样的?有些应用比较简单,直接重新打开应用,这样体验并不好,如果应用已经打开了,只是home出去了。
正确的逻辑应该是这样:
- 判断应用是否在运行。
- 如果No直接打开应用跳转到指定页面,Yes 正在运行,不用重新启动一遍应用。
- 判断当前页面是否是需要跳转的页面:如果不是,发意图跳转到指定页;如果在当前页,可能会刷新当前页更新内容等等,根据具体需求来定。
下面是部分代码示例
public class MyReceiver extends BroadcastReceiver {
//省略部分无关代码
private boolean isRunning;
private ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
@Override
public void onReceive(Context context, Intent intent) {
if(JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
DLog.i(TAG, "[MyReceiver] 用户点击打开了通知");
isRunning = isAppRunning(context);
if(isRunning){
//在这里判断当前activity的name是否是要跳转的
ComponentName cn = activityManager.getRunningTasks(1).get(0).topActivity;
if(!cn.getClassName().equals("你要跳转的页面包名全路径"){
//不是的话,直接跳转
...
}else{
//是的话,进行更新页面操作等
...
}
}
}
/**
* 判断app是否正在运行
* @param context
* @return 运行状态
*/
private boolean isAppRunning(Context context) {
List<RunningTaskInfo> appTasks = activityManager.getRunningTasks(100);
boolean isAppRunning = false;
String MY_PKG_NAME = "com.xywy.askforexpert";
for (RunningTaskInfo info : appTasks) {
if (info.topActivity.getPackageName().equals(MY_PKG_NAME) || info.baseActivity.getPackageName().equals(MY_PKG_NAME)) {
isAppRunning = true;
Log.i(TAG,info.topActivity.getPackageName() + " info.baseActivity.getPackageName()="+info.baseActivity.getPackageName());
break;
}
}
return isAppRunning;
}
}