Android调用消息栏通知(Notification)

本文详细介绍了安卓系统中通知栏消息的实现方法,包括如何创建通知、设置图标、标题及内容等。此外还讲解了如何更新和删除通知,以及如何为通知设置点击后的动作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用过安卓的应该对通知栏消息都很熟悉了,下面是演示通知栏消息的一个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;
        @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没有必要设置,只是为了下面要用到它才进行了设置

                        }
                });
        }
}

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



以下是每个部分的说明:
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_SHOTsend()只能被执行一次,即是说,假如该通知点击后不消失,那么再次点击不会发生任何事。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);之后,这个意图一旦产生,就会自动清除栈顶的活动,即是说,上一个被打开的活动会被终结掉,于是就实现了没有两个相同的活动被同时打开。

原文:http://www.apkbus.com/android-4875-1.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值