Notification--通知

来源:互联网 发布:php博客聊天源码 编辑:程序博客网 时间:2024/05/22 08:08

Notification是一种在你APP常规UI外用来指示某个事件发生的用户交互元素。用户可以在使用其它apps时查看notification,并在方便的时候做出回应。

通过builder来构造通知显示内容,用PendingIntent 来构造点击通知的响应事件,builder.setContentIntent(pendingIntent);添加到builder中

manager.notify(id,notification);//notification=builder.build();

通知的消失:

每条通知都有一个指定的id,id相同会更新,id不同会发布另一条通知

manager.cancel();/manager.cancel(id);

builder.setOnGoing(true/false);//设置它在任务栏可否一直存在,true表示一存在,不会被清除

但是如果有builder.setAutoCancel(true);发生响应后 OnGoing(true)不会有效

分类:

1.常规通知

用到的类:
NotificationCompat.Builder = new NotificatoinCompat.Builder(context);
PendingIntent = PendingIntent.getActivity(context,id,intent);
NotificationManager = ()getSystemManager(NOTIFICATION_SERVERCE);//参数引用的封装好的“notification”

<span style="white-space:pre"><span style="font-size:14px;"></span></span><span style="font-size:14px;">NotificationCompat.Builder builder = new NotificationCompat.Builder(NotificationActivity.this);/* 通知内容 */builder.setSmallIcon(R.drawable.ic_launcher);//通知图标builder.setTicker("你有一条新消息");// 收到通知提示builder.setContentTitle("双十一大会场");// 通知的标题builder.setContentText("全场5折,欢迎抢购");// 通知内容// 通知信息的详细内容,威武text的右边,太长,text会显示不完全builder.setContentInfo("content info");</span>
<span style="font-size:14px;"><span style="white-space:pre"></span>builder.setSound(Uri.parse("file://mnt/sdcard/Adele - Someone Like You.mp3"));</span>
<span style="font-size:14px;">builder.setAutoCancel(true);// 响应后自动消失/* 通知行为 */Intent intent = new Intent(NotificationActivity.this,DefinedActivity.class);PendingIntent pendingIntent = PendingIntent.getActivity(NotificationActivity.this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);builder.setContentIntent(pendingIntent);// 发送通知</span>
<span style="font-size:14px;">NotificationManager manager = (NotificationManager) getSystemService("notification");manager.notify(NORMAL_NOTIFY_ID, builder.build());</span>


2.progress通知(进度条下载)

下面以确定性为例

builder.setProgress(max,progress,inderminate);//indeterminate:true 不确定性,false为确定性
加载完成之后,用builder.setProgress(0,0,false);

<span style="white-space:pre"></span><span style="font-size:14px;">NotificationCompat.Builder builder = new NotificationCompat.Builder(NotificationActivity.this);//构造内容builder.setSmallIcon(R.drawable.meituan_image6);builder.setTicker("正在下载...");builder.setContentTitle("下载通知");builder.setContentText("下载中");//线程模拟进度条的加载new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 100; i++) {builder.setProgress(100, i, false);manager.notify(11, builder.build());try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}}//加载完成后进度天的消失builder.setProgress(0, 0, false);builder.setContentText("下载完成");//text的更新//NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);manager.notify(11, builder.build());}</span>}).start();


3.导航通知

指点击某条通知,跳到一个界面后,按返回键会返回到你指定的一个父Activity,比如你有一条新短信,你点开后按返回键会回到短信列表
这个需要在manifest中声明层级关系
这里就要注意常规和特定activity的区别了
常规activity:是工作流的一部份
特定activity:只能从notification启动,才能看见//intent.setFlag(Intent.FLAG_ACTIVITY_NEWTASK|Intent.FLAG_CLEAR_ALL);
TaskStackBuilder taskBuilder = TaskStackBuilder.create(context);
taskBuilder.addParentStask( .class);//这个class就是intent里面的class
taskBuilder.addNextIntent(intent);
PendingIntent pendingIntent = taskBuilder.getPendingIntent(id,FLAG);

<span style="white-space:pre"><span style="font-size:14px;"></span></span><span style="font-size:14px;">builder.setSmallIcon(R.drawable.meituan_image8);builder.setTicker("你有一条导航通知");builder.setContentTitle("导航通知: 双十一大会场");builder.setContentText("全场5折,欢迎抢购");builder.setContentInfo("content info");builder.setAutoCancel(true);builder.setSound(Uri.parse("file://mnt/sdcard/Adele - Someone Like You.mp3"));intent = new Intent(this, DefinedActivity.class);TaskStackBuilder sBuilder = TaskStackBuilder.create(this);</span>
<span style="font-size:14px;"><span style="white-space:pre"></span>//注意:这里的的parentStack不是指返回的activity,sBuilder.addParentStack(DefinedActivity.class);sBuilder.addNextIntent(intent);PendingIntent pIntent = sBuilder.getPendingIntent(1,PendingIntent.FLAG_UPDATE_CURRENT);builder.setContentIntent(pIntent);manager = (NotificationManager) getSystemService("notification");manager.notify(GUIDE_NOTIFY_ID, builder.build());</span>

在响应的activity中声明他的父activity,

4.1以前是使用下列方法声明

<span style="font-size:14px;"><activity            android:name="com.scxh.android.listview.DefinedActivity"            android:label="自定义适配器" >            <meta-data                android:name="android.support.PARENT_ACTIVITY"                android:value=".MainActivity" />        </activity></span>

4.1以后

<span style="font-size:14px;"><activity            android:name="com.scxh.android.listview.DefinedActivity"</span>
<span style="font-size:14px;"><span style="white-space:pre"></span>    android:parentActivityName=".MainActivity"</span>
<span style="font-size:14px;">            android:label="自定义适配器"/>            </span>

4.BigView通知( 4.1版本 后才有的)

builder.setStyle(new NotificationCompat.BigTextStyle().bigText("text"));//text:显示的内容
builder.addAction(int icon,"name",pendingIntent);

下面是与service进行了交互的代码
PendingIntent pendingIntent = PendingIntent.getService(context,id,FLAG);

builder.setSmallIcon(R.drawable.meituan_image1);

builder.setTicker("你有一条big消息");builder.setContentTitle("元旦");builder.setContentText("新年新气象,又该添新衣了");// builder.setAutoCancel(true);
builder.setStyle(new NotificationCompat.BigTextStyle().bigText("music"));//注意一定要给intent设置action,他传的参数才能被接收到Intent startIntent = new Intent(this, MusicService.class);startIntent.setAction("music_start");startIntent.putExtra("music_state", 0);// 0 palyingPendingIntent pStartIntent = PendingIntent.getService(this, 1,startIntent, PendingIntent.FLAG_UPDATE_CURRENT);Intent pauseIntent = new Intent(this, MusicService.class);pauseIntent.setAction("music_pause");pauseIntent.putExtra("music_state", 1);// 1 pausePendingIntent pPauseIntent = PendingIntent.getService(this, 1,pauseIntent, PendingIntent.FLAG_UPDATE_CURRENT);<span style="white-space:pre"></span>//点击开始,会执行pStartIntent的代码builder.addAction(R.drawable.ic_menu_user_on, "开始", pStartIntent);builder.addAction(R.drawable.ic_menu_user_off, "暂停", pPauseIntent);manager.notify(BIGVIEW_NOTIFY_ID, builder.build());


5.自定义通知

RemoteViews view = new RemoteViews(getPackageName(),layout);
监听 view.setOnClickPendingIntent(R.id.palying_btn, pendingIntent);
其他跟bigview处理一样
builder.setContent(view);
<span style="white-space:pre"></span>builder.setSmallIcon(R.drawable.meituan_image1);builder.setContentTitle("元旦");//将自定义布局转换成RemoteView,调用builder.setContent(view);注:通知是具有一定高度的,RemoteViews view = new RemoteViews(getPackageName(),R.layout.defined_notification_layout);//构造要某个view的响应事件Intent playIntent = new Intent(this, MusicService.class);playIntent.setAction("music_start");playIntent.putExtra("music_state", 0);// 0 palyingPendingIntent pPlayIntent = PendingIntent.getService(this, 1,playIntent, PendingIntent.FLAG_UPDATE_CURRENT);//对自定义通知布局中的一个button进行点击处理,view.setOnClickPendingIntent(R.id.palying_btn, pPlayIntent);Intent pauseIntent = new Intent(this, MusicService.class);pauseIntent.setAction("music_pause");pauseIntent.putExtra("music_state", 1);// 1 pausePendingIntent pPauseIntent = PendingIntent.getService(this, 1,pauseIntent, PendingIntent.FLAG_UPDATE_CURRENT);view.setOnClickPendingIntent(R.id.next_song_btn, pPauseIntent);builder.setContent(view);manager.notify(15, builder.build());break;





0 0