【Android开发那点破事】消息推送BroadcastReceiver,点击通知打开两次Activity问题

Android开发中,通常会使用BroadcastReceiver来接受Push推送消息。当APP收到推送通知时,我们需要在通知的点击事件中加入自己的逻辑。比如跳转到MainActivity。
比如下面的代码(注意红色部分):

public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
            String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);
            Log.d(TAG, "[JPushReceiver] 接收Registration Id : " + regId);
            //send the Registration Id to your server...

        } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
        	Log.d(TAG, "[JPushReceiver] 接收到推送下来的自定义消息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE));

        } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
            Log.d(TAG, "[JPushReceiver] 接收到推送下来的通知");
            int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);
            Log.d(TAG, "[JPushReceiver] 接收到推送下来的通知的ID: " + notifactionId);

        } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
            Log.d(TAG, "[JPushReceiver] 用户点击打开了通知");
            JPushInterface.reportNotificationOpened(context, bundle.getString(JPushInterface.EXTRA_MSG_ID));

        	// 打开自定义的Activity
        	Intent i = new Intent(context, MainTabActivity.class);
        	i.putExtras(bundle);
        	i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        	context.startActivity(i);

        } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {
            Log.d(TAG, "[MyReceiver] 用户收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA));
            //在这里根据 JPushInterface.EXTRA_EXTRA 的内容处理代码,比如打开新的Activity, 打开一个网页等..

        } else {
        	Log.d(TAG, "[MyReceiver] Unhandled intent - " + intent.getAction());
        }
}

使用Activity以外的content来startActivity,必须指定为Intent.FLAG_ACTIVITY_NEW_TASK。

i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

我们可以尝试下使用Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT,会抛出以下异常:

ERROR/AndroidRuntime(7557): java.lang.RuntimeException: Unable to start receiver com.wcc.Wakeup: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

更多关于Intent的flag,可以参考:http://developer.android.com/reference/android/content/Intent.html

所以只能使用FLAG_ACTIVITY_NEW_TASK。使用这个还有个问题,就是会新打开一个MainActivity。如何解决这个问题?
其实很简单在AndroidManifest.xml中将MainActivity定义为:
 android:launchMode="singleTask" 即可:

<activity android:name="com.withiter.quhao.activity.MainTabActivity" android:launchMode="singleTask" android:label="@string/app_name" android:screenOrientation="portrait">

这样每次打开推送,就不会出现2个activity的情况了。

更多关于activity的launchMode可以参考:http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

好了今天这个破事就到这里,其实android开发就这么点破事。关于其他破事,见专栏:

更多Android开发的破事,请看专栏:《Android开发那点破事》

【Android开发那点破事】消息推送BroadcastReceiver,点击通知打开两次Activity问题,布布扣,bubuko.com

时间: 2024-08-05 09:48:03

【Android开发那点破事】消息推送BroadcastReceiver,点击通知打开两次Activity问题的相关文章

[Android开发那点破事]解决android.os.NetworkOnMainThreadException

[Android开发那点破事]解决android.os.NetworkOnMainThreadException 昨天和女朋友换了手机,我的iPhone 4S 换了她得三星I9003.第一感觉就是好卡,果断刷机.以前是Android 2.3的系统.回来刷成了4.4. 好了,问题来了.在我用手机测试我们的APP的时候,抛出一个如题的异常:android.os.NetworkOnMainThreadException 第一次看到这异常,字面意思是说:在主线程中的网络异常.然后我就去了解了下这个异常,

【Android开发那点破事】Android 真机调试之甩开USB线

生命在于折腾,前段时间把服务器代码收拾的差不多了,现在又来开始捣鼓我们可爱的Android了. 当第一眼看到这长长的USB连接线我就烦躁,无线网络都那么普遍了,为什么我调试个程序还得连着USB线呢?现在连无线鼠标都甩开了,就剩个无线电源了.现在搞跟长长的USB线连着电脑,用着非常不爽.本着一颗不爽的心就尝试查找了下如何利用wifi调试我们的代码.结果还真找到了. 步骤如下: 1.在android手机里安装一个叫adbWireless的app,自己去搜下,这里我也给个连接:http://www.c

Android与iOS系统的消息推送机制

相信大家在使用iPhone版微信的时候都会有这样的经历,微信已经处于关闭状态了(后台进程运行一段时间就被系统杀掉),这时候我们收到了一个消息提醒,打开微信应用,微信显示“连接中…”和“收取中…”,然后再次显示一次刚才系统推送给我的消息通知.对这个现象比较好奇,于是去知乎上查一下资料,发现知乎上的热心人还真多,看了大家的回答之后,总结如下: [之所以去知乎查看技术问题,因为我并非技术人员,而知乎上很多开发人员是会用通俗易懂的方式解释好技术问题的,因为里面有不少大牛.] 先介绍一下两个重要的消息推送

Android开发记录18-集成极光推送的一点说明

Android开发记录18-集成推送服务的一点说明 关于推送服务,国内有很多选择,笔者也对它们进行了一个详细的对比,一般我们产品选择推送服务主要考量以下几个要素: 1.是否收费,如何收费? 2.推送内容是是什么(是否包含通知.消息.富媒体等等) 3.稳定性.及时性如何? 4.集成难度是否简单 5.支持平台有哪些(主流Android.IOS) 6.服务端支持语言(Java.C#.PHP.Python等) 下面笔者例举国内主要的一些推送服务: 来自Devstore的统计,共收录了国内21家推送服务,

IOS开发之实现App消息推送(最新)

好久没有写过博客啦,今天就由本菜鸟给大家做一个简单的IOSApp消息推送教程吧!一切从0开始,包括XCode6, IOS8, 以及苹果开发者中心最新如何注册应用,申请证书以及下载配置概要文件,相信很多刚开始接触ios的人会很想了解一下.(ps:网上看了一下虽然有很多讲述推送的好教程,我也是看着一步步学会的,但是这些教程的时间都是去年或者更早时期的,对引导新手来说不是很合适) 第一部分 首先第一步当然是介绍一下苹果的推送机制(APNS)咯(ps:其实每一篇教程都有),先来看一张苹果官方对其推送做出

iOS开发之实现App消息推送

本文将带大家做一个简单的IOSApp消息推送教程,包括XCode6, IOS8, 以及苹果开发者中心最新如何注册应用,申请证书以及下载配置概要文件,相信很多刚开始接触ios的人会很想了解一下.(ps:网上看了一下虽然有很多讲述推送的好教程,我也是看着一步步学会的,但是这些教程的时间都是去年或者更早时期的,对引导新手来说不是很合适) 第一部分 首先第一步当然是介绍一下苹果的推送机制(APNS)咯(ps:其实每一篇教程都有),先来看一张苹果官方对其推送做出解释的概要图. Provider是给你手机应

[转]iOS开发之实现App消息推送(最新)

转自:http://blog.csdn.net/shenjie12345678/article/details/41120637 好久没有写过博客啦,今天就由本菜鸟给大家做一个简单的IOSApp消息推送教程吧!一切从0开始,包括XCode6, IOS8, 以及苹果开发者中心最新如何注册应用,申请证书以及下载配置概要文件,相信很多刚开始接触ios的人会很想了解一下.(ps:网上看了一下虽然有很多讲述推送的好教程,我也是看着一步步学会的,但是这些教程的时间都是去年或者更早时期的,对引导新手来说不是很

IOS8开发之实现App消息推送

第一部分 首先第一步当然是介绍一下苹果的推送机制(APNS)咯(ps:其实每一篇教程都有),先来看一张苹果官方对其推送做出解释的概要图. Provider是给你手机应用发出推送消息的服务器,而APNS(Apple Push Notification Service)则是苹果消息推送服务器.你本地的服务器当需要给应用推送一条消息的时候,先要将消息发出到苹果推送服务器,然后再由苹果推送服务器将消息发到安装了该应用的手机. 接下来再看一张解释图: 根据上图的逻辑我来给大家解释一下: 1.你的IOS应用

xmpp关于后台挂起的消息接收,后台消息推送,本地发送通知

想问下,在xmpp即时通讯的项目中,我程序如果挂起了,后台有消息过来,我这边的推送不过来,所以我的通知就会收不到消息,当我重新唤醒应用的时候,他才会接收到通知,消息就会推送过来,我在plist哪里设置了他的电话服务,因为那是长连接不会睡眠,可是我上架AppStore的时候就会被拒绝了,说我没实现那个服务.就是 Required background modes 这个服务,但是只要我使用这个服务,他就必须要实现打电话功能,我项目中没有这个功能,不知道怎么解决后台挂起不让他进入睡眠状态,等接收到后台