消息栏通知(Notification)介绍

用过安卓的应该对通知栏消息都很熟悉了,下面是演示通知栏消息的一个Demo,首先来看一下界面,后面是代码,解释就都放在代码里了.java代码package jason.notification;import android.app.Activity;import android.app.Notification;import android.app.Notificat

大家好,又见面了,我是全栈君。

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

消息栏通知(Notification)介绍消息栏通知(Notification)介绍

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;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		button = (Button) findViewById(R.id.notify);
		button.setOnClickListener(new OnClickListener() {
			
			@Override
			public 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没有必要设置,只是为了下面要用到它才进行了设置

			}
		});
	}
}


 

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

消息栏通知(Notification)介绍

以下是每个部分的说明:

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);

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/121458.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 软件工程中的需求分析(软件工程需求分析任务)

    第一部分需求规格说明书1.引言1.1编写目的1.2项目背景1.3定义1.4参考资料1.1编写目的目前我校的校园二手交易市场多是利用超级课程表上的“跳蚤市场”以及本校的贴吧进行,两者都形成了一定的规模。但是贴吧上的交易不够规范,而超级课程表改版之后对“跳蚤市场”这一模块也不够重视,对其入口进行了更改,进入不方便了,导致流量减少,目前在上面发布交易信息的人寥寥无几。…

    2022年4月9日
    102
  • 微信小程序–获取已发布微信小游戏和小程序源码「建议收藏」

    最近一直在做微信小游戏的开发,发现了一个好玩的事,在这里记录一下。这段时间一直在做一些小游戏,小程序的开发,但有的时候会发现性能上总是不那么的尽如人意(毕竟我这小菜鸟水平有限),于是就想到,想要看看别的大神们是怎么处理这些问题的(其实就是想看一下大神们的代码怎么写!)。但是,有一个问题就是小游戏或者小程序和H5、网页不一样,不能直接F12看代码,要怎么才能拿他们的代码呢?  …

    2022年4月14日
    132
  • pychar激活码【注册码】「建议收藏」

    pychar激活码【注册码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    36
  • 大文件或目录复制时的信息统计脚本

    大文件或目录复制时的信息统计脚本

    2021年8月26日
    48
  • allow_url_fopen 和 allow_url_include[通俗易懂]

    allow_url_fopen 和 allow_url_include[通俗易懂]一、在本地php.ini文件中将allow_url_fopen设置为On,重启Apache后,file_get_contents()就能读远程文件。1.读取本地php文件,当文本来解析,并没有执行读

    2022年7月4日
    30
  • python下载及安装教程[通俗易懂]

    python下载及安装教程[通俗易懂]   Python目前已支持所有主流操作系统,在Linux,Unix,Mac系统上自带Python环境,一般默认装的是Python2版本,Windows系统上没有Pyhton环境,需要我们手动安装一下,现在一般都是python,目前最新是python3.9.7,下面就让跟着我进行安装吧!下载python安装包进入python官网下载(官网https://www.python.org/)。鼠标指向Downloads(不用点击)会弹出下拉框,直接点击windows下的Python3.9.7可直接下载

    2022年5月18日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号