极光推送-点击通知栏跳到指定页面
2016-10-11 10:12
344 查看
在MyReceiver接收器里面,添加以下代码:
由于是在广播接收器里面启动Activity,所以要添加Flag:FLAG_ACTIVITY_NEW_TASK,表示新创建一个task来存放启动的Activity。那为什么就要设置这么一个Flag呢,不能引用原来的task吗,答案是确实不能。普通情况下,要有前一个Activity的Context才能启动另外一个Activity。startActivity()源码中有这么一个描述:
如果要跳转到该Activity时,并清除掉之前的Activity,那么就可以将跳转到的Activity启动模式设置为singleTask。
-------20170414更新---------
最近发现了一个问题,就是如果我们的应用已经退出了,但极光推送的服务还在运行,这时候推了一条通知过来,这时我们是否应该要判断一下应用是否还在运行?因为你如果不去判断的话,比如此时应该退出了,但你点击通知,直接打开文章详情Activity,就会比原来流程少了启动页->主页(->文章详情),你肯定会在启动页或主页做一些初始化的,这时直接跳过初始化肯定会有问题的。所以我们要做应用是否还在运行的判断,看到网上有一些是用进程(5.0以上)和任务栈(5.0以下)去判断,我觉得没必要这样,因为利用进程去判断时,明明应用已经退出,但进程还在,会导致误判。我们可以换另外一种思路来判断应用是否正在运行:去判断任务栈中存在的Activity个数,如果Activity数都为0了,那应用肯定退出了,不再运行了。而判断Activity数可以自己创建一个类去管理Activity,代码如下:
(1),在BaseActivity的生命周期中调用
(2),通过实现Application.ActivityLifecycleCallbacks里面的两个方法,并在MyApplication中去注册这个回调
a,在自己的MyApplication中添加回调:
registerActivityLifecycleCallbacks(this);b,实现的相关方法中添加以下代码:
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
MyActivityManager.addActivity(activity);
}
@Override
public void onActivityDestroyed(Activity activity) {
MyActivityManager.removeActivity(activity);
}这样,我们新启动或销毁Activity就会自己调用实现的方法。
if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) { Log.d(TAG, "[MyReceiver] 用户点击打开了通知"); //打开自定义的Activity Intent i = new Intent(context, ArticleActivity.class); i.putExtras(bundle); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); }
由于是在广播接收器里面启动Activity,所以要添加Flag:FLAG_ACTIVITY_NEW_TASK,表示新创建一个task来存放启动的Activity。那为什么就要设置这么一个Flag呢,不能引用原来的task吗,答案是确实不能。普通情况下,要有前一个Activity的Context才能启动另外一个Activity。startActivity()源码中有这么一个描述:
* Note that if this method is being called from outside of an * {@link android.app.Activity} Context, then the Intent must include * the {@link Intent#FLAG_ACTIVITY_NEW_TASK} launch flag. This is because, * without being started from an existing Activity, there is no existing * task in which to place the new activity and thus it needs to be placed * in its own separate task.设置该Flag的效果与模式设置为SingleTask的效果是一样。
如果要跳转到该Activity时,并清除掉之前的Activity,那么就可以将跳转到的Activity启动模式设置为singleTask。
<!--主页面--> <activity android:name=".activity.MainActivity" android:launchMode="singleTask"/>
-------20170414更新---------
最近发现了一个问题,就是如果我们的应用已经退出了,但极光推送的服务还在运行,这时候推了一条通知过来,这时我们是否应该要判断一下应用是否还在运行?因为你如果不去判断的话,比如此时应该退出了,但你点击通知,直接打开文章详情Activity,就会比原来流程少了启动页->主页(->文章详情),你肯定会在启动页或主页做一些初始化的,这时直接跳过初始化肯定会有问题的。所以我们要做应用是否还在运行的判断,看到网上有一些是用进程(5.0以上)和任务栈(5.0以下)去判断,我觉得没必要这样,因为利用进程去判断时,明明应用已经退出,但进程还在,会导致误判。我们可以换另外一种思路来判断应用是否正在运行:去判断任务栈中存在的Activity个数,如果Activity数都为0了,那应用肯定退出了,不再运行了。而判断Activity数可以自己创建一个类去管理Activity,代码如下:
package com.wesdom.realstuffshop.utils; import android.app.Activity; import java.util.ArrayList; import java.util.List; /** * Activity管理器 * Created by sen young on 2017/5/18 11:25. * 邮箱:595327086@qq.com. */ public class MyActivityManager { private static List<Activity> activityList = new ArrayList<Activity>(); private static MyActivityManager instance; public static MyActivityManager getInstance() { if (instance == null) { instance = new MyActivityManager(); } return instance; } /** * 添加 Activity 到列表 * * @param activity activity */ public static void addActivity(Activity activity) { if (activityList == null) { activityList = new ArrayList<Activity>(); } activityList.add(activity); } /** * 获取界面数量 * * @return activity size */ public static int getActivitySize() { if (activityList != null) { return activityList.size(); } return 0; } /** * 获取当前 Activity - 堆栈中最后一个压入的 * * @return current Activity */ public static Activity getCurrentActivity() { if (activityList != null && activityList.size() > 0) { Activity activity = activityList.get(activityList.size() - 1); return activity; } return null; } /** * 获取指定类名的 Activity * * @param cls 指定的类 * @return Activity */ public static Activity getActivity(Class<?> cls) { if (activityList == null) { return null; } for (Activity activity : activityList) { if (activity.getClass().equals(cls)) { return activity; } } return null; } /** * 结束指定的 Activity * * @param activity Activity */ public static void removeActivity(Activity activity) { if (activity != null) { activityList.remove(activity); } } /** * 结束指定类名的 Activity * * @param cls 指定的类 */ public static void removeActivity(Class<?> cls) { if (activityList == null) { return; } for (Activity activity : activityList) { if (activity.getClass().equals(cls)) { activityList.remove(activity); } } } /** * 结束所有Activity */ public static void finishAllActivity() { if (activityList == null) { return; } int size = activityList.size(); for (int i = 0; i < size; i++) { if (null != activityList.get(i)) { activityList.get(i).finish(); } } activityList.clear(); } /** * 结束其他所有的Activity * * @param activity 不需要销毁的Activity */ public static void finishOtherAllActivity(Activity activity) { if (activityList == null) { return; } for (int i = 0, size = activityList.size(); i < size; i++) { if (activity != activityList.get(i)) { activityList.get(i).finish(); activityList.remove(i); } } } }使用这个类有两种方法:
(1),在BaseActivity的生命周期中调用
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { MyActivityManager.addActivity(this); }
@Override protected void onDestroy() { MyActivityManager.removeActivity(this); }
(2),通过实现Application.ActivityLifecycleCallbacks里面的两个方法,并在MyApplication中去注册这个回调
a,在自己的MyApplication中添加回调:
registerActivityLifecycleCallbacks(this);b,实现的相关方法中添加以下代码:
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
MyActivityManager.addActivity(activity);
}
@Override
public void onActivityDestroyed(Activity activity) {
MyActivityManager.removeActivity(activity);
}这样,我们新启动或销毁Activity就会自己调用实现的方法。
相关文章推荐
- iOS APNS 极光推送 点击通知栏跳转应用相应页面
- 收到推送通知后页面跳转,当程序在后台,无论进入后台之前在哪个界面,点击收到的推送,跳转到指定界面的2个思路:
- iOS开发 极光推送收到通知后跳转到指定页面
- 极光推送怎么点击通知跳转页面?
- 极光推送点击消息栏跳转到指定页面、设置标签或别名
- iOS 远程推送(极光推送) 根据后台推送内容的不同跳转指定页面(不断更新)
- iOS 点击推送消息跳到应用指定页面的实例
- 极光推送 根据服务器返回内容跳转指定页面
- iOS开发中点击推送跳转到指定页面
- 极光推送注册、接收、点击打开推送通知
- iOS点击推送消息跳到应用指定页面方法
- iOS极光推送 点击推送消息跳转页面
- iOS极光推送 点击推送消息跳转页面
- IOS 通知栏点击跳转指定页面
- Android 根据消息推送内容跳转至指定页面(极光推送)
- iOS点击推送消息跳到应用指定页面
- iOS 点击通知栏消息跳转到指定的页面
- iOS极光推送 点击推送消息跳转页面
- iOS 点击远程通知消息,跳转到指定页面 (控制器)
- 极光推送点击通知弹出toast+不能被取消的通知