用过安卓的应该对通知栏消息都很熟悉了,下面是演示通知栏消息的一个Demo,首先来看一下界面,后面是代码,解释就都放在代码里了.

java代码

package jason.notification;import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;public class MainActivity extends Activity {Button button;int id = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button = (Button) findViewById(R.id.notify);button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {//获得通知管理器NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);//构建一个通知对象(需要传递的参数有三个,分别是图标,标题和 时间)Notification notification = new Notification(R.drawable.ic_launcher,"通知",System.currentTimeMillis());Intent intent = new Intent(MainActivity.this,MainActivity.class);PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this,0,intent,0);                                               notification.setLatestEventInfo(getApplicationContext(), "通知标题", "通知显示的内容", pendingIntent);notification.flags = Notification.FLAG_AUTO_CANCEL;//点击后自动消失notification.defaults = Notification.DEFAULT_SOUND;//声音默认manager.notify(id, notification);//发动通知,id由自己指定,每一个Notification对应的唯一标志//其实这里的id没有必要设置,只是为了下面要用到它才进行了设置}});}
}

对于通知的结构下面有个图很好的进行了标注;

以下是每个部分的说明:

1. 内容标题

2. 大型icon

3. 内容text

4. 内容info

5. 小型icon

6. 发布通知的时间。你能使用setWhen()设置一个明确的值。

下面再具体的记录一下其他细节

我们可以为Notification指定它的图标,标题,时间,提醒方式,点击之后的动作。还能做什么呢

1、由于每个Notification的ID是唯一的,所以我们可以删除某些通知:

manager.cancel(id, notification);

2、同理,通过重复发送相同ID的Notification,我们还可以更新某些通知:

manager.notify(id, new_notification);

3由于Notification的包装内容为Intent,我们就可以方便地为通知被点击的触发的事件传值:

现在回到下面的位置来

PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this,0,new Intent(MainActivity.this,MainActivity.class),0);

注意最后一个“0”,0表示什么?表示什么都不做,下次你传进来的Intent,如果被发现是同一个Intent,则所有通知都保持为同一个Intent,只是新来的Extra被保留了。

我们应该期望每个Notification都能干点不一样的事情,按上面的方式这样来,每个具备相同Intent的Notification相互之间,其实是毫无区别的。

好,我们来看下除了0以外Android还有什么设置:

1、PendingIntent.FLAG_UPDATE_CURRENT

如果该PendingIntent已经存在,则用新传入的Intent的Extra更新当前的数据。

2、PendingIntent.FLAG_ONE_SHOT

send()只能被执行一次,即是说,假如该通知点击后不消失,那么再次点击不会发生任何事。

3、PendingIntent.FLAG_NO_CREATE

如果该PendingIntent不存在,直接返回null而不是创建一个PendingIntent.

4、PendingIntent.FLAG_CANCEL_CURRENT

如果该PendingIntent已经存在,则在生成新的之前取消当前的。

嗯,明显都不是我们想要的。

其实答案根本不在PendingIntent包装上。

PendingIntent所做的全部事情都只是对同样的Intent进行处理,关键词,在于“同样的”

既然每次你打开的都是同一个Intent,那区分PendingIntent就没有意义了

所以,在Intent定义的时候,你还需要区分Intent

推荐方式:

intent.setData(Uri.parse("custom://"+System.currentTimeMillis()));

这样就实现了Intent的区别化,以后每次传入的Intent都会具备不同的Extra,当然,PendingIntent需要定义为PendingIntent.FLAG_UPDATE_CURRENT

到这个地方,其实还剩下一个问题,很快你就会发现

每次点击通知,都正确的弹出你要的Activity,但是之前的打开的Activity依旧存在

方法有二:

1、在Activity的onPause()方法体中增加:

finish();

这样,在打开新的Activity的时候,旧的就进入了暂停态,启动onPause(),然后执行finish(),活动结束

好吧,这是个蠢办法,请不要使用

2、设置Intent:

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

是的,这句就够了,这里我得说一下Activity的栈机制:

我们先来看看Intent的结构new Intent(MainActivity.this,MainActivity.class);

第一个参数为产生该意图(Intent)的活动,这个逻辑再清晰不过了,要做的事情得有个发出的主体

第二个参数为该意图的对象,即是这个意图是什么,我们来看看。

呃!??这里没有对象……

是的,我们只有了一个对象的类名,但远远不是某个具体的对象,这是反射么?反射能通过一个类名来找到某个特定的类实例么?

事实如下:

Android有一个栈机制,每个产生的活动在过了产生期后,都会进入这个栈,新的活动压着旧的活动,每一次寻找类名的时候,都默认提取的是栈顶的活动。这也是为什么Android能快捷的执行返回操作。

回到原点来,我们为Intent添加:

openintent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

之后,这个意图一旦产生,就会自动清除栈顶的活动,即是说,上一个被打开的活动会被终结掉,于是就实现了没有两个相同的活动被同时打开。

消息栏通知(Notification)介绍相关推荐

  1. android11通知栏按钮,android开发(11) 消息栏通知(Notification)

    android 的消息通知还是很方便的,它会出现在窗体的顶部,并给出提示.常见的短信就是这样的通知方式.本文我们尝试实现一个这样的演示. 演示截图: 实现步骤: 1.获得NotificationMan ...

  2. 最好用的 6 款 Vue 实时消息提示通知(Message/Notification)组件推荐与测评

    本文完整版:<最好用的 6 款 Vue 实时消息提示通知(Message/Notification)组件推荐与测评> Vue 实时消息提示通知 Vue-notification - 专注实 ...

  3. android activity 被notification启动,Android通知Notification全面剖析

    原标题:Android通知Notification全面剖析 通知 通知是您可以在应用的常规 UI 外部向用户显示的消息.当您告知系统发出通知时,它将先以图标的形式显示在通知区域中.用户可以打开抽屉式通 ...

  4. 利用android的通知Notification来实现msn的登录状态

    Notification,状态栏.看得出来就是和我们PC机一样,在某一区域有个标志,需要请求它就去点这个标志就可以打开这个程序了. 先来介绍下需要用到的一些属于android下的类:Intent.No ...

  5. 安全狗导致网站程序池被禁用_如何在Microsoft Office程序中禁用安全警告消息栏...

    安全狗导致网站程序池被禁用 Macros in Microsoft Office programs allow you to automate repetitive tasks, but some m ...

  6. 8.Android学习之消息、通知、广播与闹钟(二)

    目录 8.消息.通知.广播与闹钟(二) 3.使用Notification类在状态栏上显示通知 4.BroadcastReceiver类的使用 4-1.BroadcastReceiver类简介 4-2. ...

  7. 适配 通知 Notification 通知渠道 前台服务 MD

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

  8. C#实现类似QQ的任务栏通知窗口

             http://download.csdn.net/detail/u010484683/6377607 这个例子的可运行项目实例! 简介 QQ和MSN的任务栏通知窗口很人性化,它可以在 ...

  9. c#缩小至任务栏窗体弹出_C#实现任务栏通知窗口

    想必大部分网友都使用过QQ.MSN等聊天程序,它们的界面都相当华丽,尤其是当网友上线以及消息提示时会有一个浮动的窗体从屏幕的右下方缓慢升起,既美观又人性化.本文主要讲解用C#来实现任务栏通知窗口. 简 ...

最新文章

  1. jupyter nootbook本地使用指南
  2. IP Cam须改原厂密码防黑客
  3. 去除桌面图标的小箭头
  4. 基于Android的人事管理系统开发与设计源码(一)
  5. App架构设计经验谈:服务端接口的设计
  6. 企业上云计算最大的障碍是什么?
  7. windows启动winload.exe的数字签名错误问题
  8. VTK读取rawdata
  9. 助你提高PS效率的32个常用快捷键及对应作用
  10. 分类器交叉验证java_使用交叉验证和F1分数选择SVM参数
  11. 产品经理求职方法指南:面试通关
  12. js中返回今天是星期几的方法
  13. CSS层叠样式表Cascading Style Sheets(2021.10.05)
  14. 图书馆信息管理系统文档
  15. 【自动控制原理】——第二章——数学模型【时域】【复频域】【梅森增益公式】
  16. 我的星座图 php,星座图映射
  17. POJO VO PO DTO 和JavaBean
  18. html用divagt;做个按钮,Diva验证工具使用说明:
  19. linux如何访问公司网盘,Linux部署私有企业网盘
  20. DevOps工具链 - 2021

热门文章

  1. TortoiseGit assume-unchanged的文件怎么恢复
  2. 数据清洗 Chapter07 | 简单的数据缺失处理方法
  3. 计算机专业知识教学,2016计算机专业知识:计算机的分类(一)
  4. Node.js基础入门
  5. MusicXML 3.0 (2) - 调号
  6. python求斜边上的高是多少厘米_已知一个直角三角形的两条直角边,如何求斜边上的高的长度...
  7. 解密!区块链BaaS是什么?
  8. 【C++---16】常指针和常引用
  9. 关于Mifare Classic Tool (MTC)工具的秘钥包
  10. ElasticSearch wildcard查询(英文检索)