数据发送方:

public static void notify(Context context, TxrjMessage msg) {
    NotificationManager notifiMgr = (NotificationManager) context
            .getSystemService(Context.NOTIFICATION_SERVICE);
    /*Notification notifi = new Notification(R.drawable.sms_icon,
            "短信", System.currentTimeMillis());    */
    Notification notifi = new Notification();
    notifi.icon = R.drawable.sms_icon;
    notifi.tickerText = msg.getBody();
    notifi.when = System.currentTimeMillis();
    /*notifi.flags = Notification.FLAG_ONGOING_EVENT
            | Notification.FLAG_NO_CLEAR | Notification.FLAG_SHOW_LIGHTS;*/
    notifi.defaults = Notification.DEFAULT_ALL;
    Intent it = new Intent(context, MessageListActivity.class);
    it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    String displayName = TextUtils.isEmpty(msg.getName()) ? msg.getNumber() : msg.getName();
    it.putExtra(TxrjConstant.EXTRA_THREAD_DISPLAY_NAME, displayName);
    it.putExtra(TxrjConstant.EXTRA_THREAD_NUMBER, msg.getNumber());
    notificationId++;
    it.putExtra(TxrjConstant.EXTRA_NOTIFICATION_ID, notificationId);
    PendingIntent pendIt = PendingIntent.getActivity(context,
            TxrjConstant.REQUEST_READ_NOTIFICATION,
            it, PendingIntent.FLAG_UPDATE_CURRENT);
    notifi.setLatestEventInfo(context, displayName, msg.getBody(), pendIt);
    notifiMgr.notify(notificationId, notifi);
}

数据接收方:

mThreadId = getIntent().getLongExtra(TxrjConstant.EXTRA_THREAD_ID, -1);
mDisplayName = getIntent().getStringExtra(TxrjConstant.EXTRA_THREAD_DISPLAY_NAME);
mName = getIntent().getStringExtra(TxrjConstant.EXTRA_THREAD_NAME);
mNumber = getIntent().getStringExtra(TxrjConstant.EXTRA_THREAD_NUMBER);
int notifiId = getIntent().getIntExtra(TxrjConstant.EXTRA_NOTIFICATION_ID, -1);
if(notifiId != -1) {
    NotificationManager notifiMgr = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
    notifiMgr.cancel(notifiId);
}

如果使用PendingIntent.FLAG_UPDATE_CURRENT,那么每次notifiId都是相同的数字,说明PendingIntent是一个,旧的参数被更新了。

如果使用PendingIntent.FLAG_ONE_SHOT,那么PendingIntent只是第一次有效,后来再点击别的Notification就无效了。

是否和getActivity的第2个参数有关系呢?

确实如此,第2个参数如果不同,那么表示PendingIntent不同,就不会出现上述两种情况。

将发送方蓝色部分代码改成

PendingIntent pendIt = PendingIntent.getActivity(context,
        notificationId, it,
        PendingIntent.FLAG_ONE_SHOT);

这里使用FLAG_ONE_SHOT是正确有效的。如日志所示。

07-21 02:59:52.154: E/txrjsms(17085): ShowSmsActivity.onDestroy
07-21 02:59:57.749: E/txrjsms(17085): MessageListActivity.onCreate
07-21 02:59:57.910: I/txrjsms(17085): notifiId:1
07-21 02:59:58.260: E/txrjsms(17085): MessageListActivity.onStart
07-21 02:59:58.260: E/txrjsms(17085): MessageListActivity.onResume
07-21 03:00:01.353: E/txrjsms(17085): MessageListActivity.onPause
07-21 03:00:01.943: E/txrjsms(17085): MessageListActivity.onStop
07-21 03:00:01.943: E/txrjsms(17085): MessageListActivity.onDestroy
07-21 03:00:04.536: E/txrjsms(17085): MessageListActivity.onCreate
07-21 03:00:04.726: I/txrjsms(17085): notifiId:2
07-21 03:00:04.956: E/txrjsms(17085): MessageListActivity.onStart
07-21 03:00:04.956: E/txrjsms(17085): MessageListActivity.onResume
07-21 03:00:06.748: E/txrjsms(17085): MessageListActivity.onPause
07-21 03:00:07.279: E/txrjsms(17085): MessageListActivity.onStop
07-21 03:00:07.279: E/txrjsms(17085): MessageListActivity.onDestroy
07-21 03:00:09.541: E/txrjsms(17085): MessageListActivity.onCreate
07-21 03:00:09.591: I/txrjsms(17085): notifiId:3
07-21 03:00:09.941: E/txrjsms(17085): MessageListActivity.onStart
07-21 03:00:09.951: E/txrjsms(17085): MessageListActivity.onResume
07-21 03:00:12.213: E/txrjsms(17085): MessageListActivity.onPause
07-21 03:00:12.844: E/txrjsms(17085): MessageListActivity.onStop
07-21 03:00:12.844: E/txrjsms(17085): MessageListActivity.onDestroy

将FLAG_ONE_SHOT改FLAG_UPDATE_CURRENT测验一下!

PendingIntent pendIt = PendingIntent.getActivity(context,
        notificationId, it,
        // PendingIntent.FLAG_ONE_SHOT);
        PendingIntent.FLAG_UPDATE_CURRENT);

下面的日志表示:FLAG_UPDATE_CURRENT照样OK!

07-21 03:07:03.034: E/txrjsms(18079): MessageListActivity.onCreate // 准备发送短信
07-21 03:07:03.174: I/txrjsms(18079): notifiId:-1
07-21 03:07:03.224: E/txrjsms(18079): MessageListActivity.onStart
07-21 03:07:03.224: E/txrjsms(18079): MessageListActivity.onResume
07-21 03:07:15.757: E/txrjsms(18079): MessageListActivity.onPause
07-21 03:07:17.268: E/txrjsms(18079): MessageListActivity.onStop
07-21 03:07:17.268: E/txrjsms(18079): MessageListActivity.onDestroy // 关闭信息列表界面

07-21 03:08:01.621: E/txrjsms(18079): ShowSmsActivity.onDestroy // 关闭新信息的弹窗

07-21 03:09:39.917: E/txrjsms(18079): MessageListActivity.onCreate // 查看第3个短信通知
07-21 03:09:40.047: I/txrjsms(18079): notifiId:3
07-21 03:09:40.378: E/txrjsms(18079): MessageListActivity.onStart // onCreate之后就是onStart
07-21 03:09:40.378: E/txrjsms(18079): MessageListActivity.onResume

07-21 03:10:28.835: E/txrjsms(18079): MessageListActivity.onPause // 展开状态栏
07-21 03:10:28.835: E/txrjsms(18079): MessageListActivity.onNewIntent // 查看第2个短信通知
07-21 03:10:28.835: I/txrjsms(18079): notifiId:2
07-21 03:10:28.965: E/txrjsms(18079): MessageListActivity.onResume // onNewIntent之后就是onResume

07-21 03:12:48.401: E/txrjsms(18079): MessageListActivity.onPause // 展开状态栏
07-21 03:12:48.401: E/txrjsms(18079): MessageListActivity.onNewIntent // 查看第1个短信通知
07-21 03:12:48.401: I/txrjsms(18079): notifiId:1
07-21 03:12:48.561: E/txrjsms(18079): MessageListActivity.onResume // onNewIntent之后就是onPause

07-21 03:14:31.242: E/txrjsms(18079): MessageListActivity.onPause // 点击HOME键
07-21 03:14:31.712: E/txrjsms(18079): MessageListActivity.onStop

07-21 03:15:02.332: E/txrjsms(18079): MessageListActivity.onRestart // 点击应用图标,启动栈顶的那个Activity
07-21 03:15:02.332: E/txrjsms(18079): MessageListActivity.onStart
07-21 03:15:02.332: E/txrjsms(18079): MessageListActivity.onResume

07-21 03:16:38.286: E/txrjsms(18079): MessageListActivity.onPause // 点击BACK键
07-21 03:16:38.826: E/txrjsms(18079): MessageListActivity.onStop
07-21 03:16:38.826: E/txrjsms(18079): MessageListActivity.onDestroy

PendingIntent传递数据注意参数RequestCode和Flag的更多相关文章

  1. [android] 在不同的activity之间传递数据

    新建一个activity,继承Activity 清单文件中进行配置,添加<activity/>节点 设置名称 android:name=”.类名” 点 代表的是当前包名,也可以不写 新建一 ...

  2. Servlet之初始化参数和传递数据(ServletConfig,ServletContext )

    ServletConfig 容器初始化一个Servlet的时候,会为这个Servlet建一个唯一的Servletconfig的对象(Servlet的配置对象) 容器会从部署的描述文件(web.xml) ...

  3. 探究Spring Boot中的接收参数问题与客户端发送请求传递数据

    结合此篇参考Spring框架学习笔记(9)--API接口设计相关知识及具体编码实现 在使用Spring Boot进行接收参数的时候,发现了许多问题,之前一直都很忙,最近才稍微有空研究一下此问题. 网上 ...

  4. Intent界面跳转与传递数据

    Activity跳转与传值,主要是通过Intent类,Intent的作用是激活组件和附带数据. intent可以激活Activity,服务,广播三类组件. 本博文讲的是显示意图激活Activity组件 ...

  5. Android Intent传递数据

    刚开始看郭大神的<>,实现以下里面的一些例子.Intent传递数据. 我们利用显示的方式进行Intent的启动. 1.启动intent并输入数据. Intent intent=new In ...

  6. Android基础知识04—Activity活动之间传递数据

    ------活动之间传递数据------ 向下一个活动传递数据: Intent中提供了一系列的putExtra()方法,可以把数据暂存到Intent中,启动另一个活动的时候就可以取出来. 代码: (存 ...

  7. 【Android基础】利用Intent在Activity之间传递数据

    前言: 上一篇文章给大家聊了Intent的用法,如何用Intent启动Activity和隐式Intent,这一篇文章给大家聊聊如何利用Intent在Activity之间进行沟通.   从一个Activ ...

  8. Android学习之基础知识四-Activity活动4讲(Intent传递数据)

    Intent除了可以开启一个活动,还能在启动活动的时候传递数据,此时Intent相当于一个保存数据的库,我们先把数据保存在Intent中,然后再根据各个activity的需要从其中取出数据.  一.使 ...

  9. Intent 简介 结构 传递数据 常见Action 常量 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

随机推荐

  1. 样条之EHMT插值函数

    核心代码: ////////////////////////////////////////////////////////////////////// // 埃特金插值 ////////////// ...

  2. linux 查看机器内存方法 (free命令)

    工作中遇到了统计机器内存的问题.记录一下. free命令可以查看那机器内存. 如下图单位是M 查看man free可以知道,也可以直接从/proc/meminfo文件中读取.

  3. 让Windows加入域的PowerShell

    $domain = "midrange.lab" $password = "MyPassword!" | ConvertTo-SecureString -asP ...

  4. CSS-页面滑屏滚动原理

    现在的网站有的时候为了简洁就是很多的单页滑屏滚动介绍,主要呈现方式有两种,一种是整体的元素一直排列下去,假设有五个需要展示的全屏页面,那么高度是500%,只是展示100%,剩下的可以通过transfo ...

  5. Distinct Subsequences leetcode java

    题目: Given a string S and a string T, count the number of distinct subsequences of T in S. A subseque ...

  6. 简短介绍 C# 6 的新特性

    几周前我在不同的地方读到了有关C#6的一些新特性.我就决定把它们都收集到一起,如果你还没有读过,就可以一次性把它们都过一遍.它们中的一些可能不会如预期那样神奇,但那也只是目前的更新. 你可以通过下载V ...

  7. 设置虚拟机IP

    重启虚拟机 重启后,查看虚拟机IP ip a 虚拟机已有自己的IP 输入虚拟机用户

  8. GPUImage API文档之GPUImageFramebufferCache类

    GPUImageFramebufferCache类负责管理GPUImageFramebuffer对象,是一个GPUImageFramebuffer对象的缓存. 方法 - (GPUImageFrameb ...

  9. Mybatis之使用注解开发CRUD

    上一篇演示了怎样使用XML来操作Mybatis实现CRUD,可是大量的XML配置文件的编写是很烦人的.因此 Mybatis也提供了基于注解的配置方式,以下我们来演示一下使用接口加注解来实现CRUD的的 ...

  10. C++代码复习笔记:第三章

    getline这个方法的使用, 可以获取用户输入的一行数据, 保存到数组中: #include <iostream> #include <string> int main() ...