//学习本章内容你要知道的知识两个重要知识点内容!
1.自定义通知不显示的问题
解决方法:
(1)忘写了notify()通知方法
(2)请设置icon小图标
2.如果API是16请将getNotification()换成build()
2.PendingIntent有一个getActivity方法
PendingIntent有一个getActivity方法,第一个参数是上下文,第二个参数 requestCode,第三个参数是 Intent,用来存储信息,第四个参数是对参数的操作标识,常用的就是FLAG_CANCEL_CURRENT和FLAG_UPDATE_CURRENT。
当使用FLAG_UPDATE_CURRENT时:
PendingIntent.getActivity(context, 0, notificationIntent,PendingIntent.FLAG_CANCEL_CURRENT时);
FLAG_UPDATE_CURRENT会更新之前PendingIntent的消息,比如,你推送了消息1,并在其中的Intent中putExtra了一个值“ABC”,在未点击该消息前,继续推送第二条消息,并在其中的Intent中putExtra了一个值“CBA”,好了,这时候,如果你单击消息1或者消息2,你会发现,他俩个的Intent中读取过来的信息都是“CBA”,就是说,第二个替换了第一个的内容
当使用FLAG_CANCEL_CURRENT时:
依然是上面的操作步骤,这时候会发现,点击消息1时,没反应,第二条可以点击。
导致上面两个问题的原因就在于第二个参数requestCode,当requestCode值一样时,后面的就会对之前的消息起作用,所以为了避免影响之前的消息,requestCode每次要设置不同的内容。
直接上源码:
代码很长,但是注释很详细:
package com.example.notifications;
import android.annotation.SuppressLint;
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.View;
import android.widget.RemoteViews;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//发送一个普通视图通知的方法
public void button1(View v) {
//
Notification.Builder Builder=new Notification.Builder(this);
//设置一个小图标
Builder.setSmallIcon(R.drawable.ic_launcher);
//设置标题
Builder.setContentTitle("我是一个普通通知抽屉");
//设置内容信息
Builder.setContentInfo("点击我可以打开一个新的界面");
//设置常驻通知,注意常驻通知和自动清除最好不要一起用
// Builder.setOngoing(true);
//设置点击通知后自动清除
Builder.setAutoCancel(true);
/*
* 设置通知的声音+震动+呼吸灯,注意!!!设置这个值要增加系统震动的权限,
* <uses-permission android:name="android.permission.VIBRATE"></uses-permission>
* 否则模拟器就会程序异常退出
*/
Builder.setDefaults(Notification.DEFAULT_ALL);
//设置通知到了第几条消息
Builder.setNumber(10);
//设置通知抽屉还没有下拉时通知的文字
Builder.setTicker("新消息");
/*
* 给抽屉通知设置一个点击事件
* 定义一个意图,当打开一个通知时要打开一个界面(Activity);
* getActivities的参数:
* 参数1(上下文)参数二(通知请求码),参数三(封装好的Intent对象)参数四(一个标记)
* 通过getActivities打开一个Activity
*/
Intent intent=new Intent(this,open_Activity.class);
PendingIntent pi=PendingIntent.getActivity(this,1,intent,PendingIntent.FLAG_UPDATE_CURRENT);
Builder.setContentIntent(pi);//参数pi是一个pendingIntent意图对象
//开始把设置好的消息构建为一个通知对象
Notification n=Builder.build();
//获取系统的通知管理器,通过系统的管理器发送消息
NotificationManager nm=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
//发送通知,参数(一个通知的编号,要发送的通知对象)
nm.notify(1,n);
}
//发送一个大视图通知的方法
@SuppressLint("NewApi")
public void button2(View v) {
Notification.Builder Builder=new Notification.Builder(this);
//设置一个小图标
Builder.setSmallIcon(R.drawable.ic_launcher);
//设置标题
Builder.setContentTitle("我是一个大视图通知抽屉");
//设置内容信息
Builder.setContentInfo("欢迎使用通知抽屉");
//设置大视图的样式!!!
Notification.InboxStyle style=new Notification.InboxStyle();
//设置大视图内容的标题
style.setBigContentTitle("蒲公英妈妈");
//设置注解
style.setSummaryText("作者:文龙");
//设置每一行的文本
style.addLine("蒲公英妈妈给自己的孩子准备了降落伞");
style.addLine("只要风儿轻轻吹过");
style.addLine("孩子就随风儿飘走");
//把定义好的style设置给通知
Builder.setStyle(style);
Notification nf =Builder.build();
NotificationManager nm=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(2,nf);
}
//发送一个进度条视图通知的方法
public void button3(View v) {
final Notification.Builder Builder=new Notification.Builder(this);
//设置一个小图标
Builder.setSmallIcon(R.drawable.ic_launcher);
//设置标题
Builder.setContentTitle("我是一个进度条通知");
//设置内容信息
Builder.setContentInfo("模拟下载");
//构建发送通知的管理器
final NotificationManager nm=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
//模拟下载的线程
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for(int prograss=0;prograss<=100;prograss+=5) {
//参数(最大进度,当前进度,是否为不确定的进度)
Builder.setProgress(100,prograss,false);
//每次跟新完成进度都要发送通知
nm.notify(3,Builder.build());
//每加5都要休眠500毫秒
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//下载完成之后:
Builder.setProgress(0,0, false);
Builder.setContentText("模拟下载完成!!!");
nm.notify(3, Builder.build());
//最后千万不要忘了!!!!!!!线程start()
}
}).start();;
}
//发送一个自定义视图通知的方法
public void button4(View v) {
Notification.Builder Builder=new Notification.Builder(this);
//!!!!切记如果不设置一个小图标,自定义通知是显示不出来的
//设置一个小图标
Builder.setSmallIcon(R.drawable.ic_launcher);
/*
* RemoteViews(中文意思标识 远程 意见)
* 创建一个远程的视图 参数1(自定义Layout视图布局文件所在包名,自定义视图Layout布局文件的id)
*/
RemoteViews views=new RemoteViews(getPackageName(),R.layout.notice_layout);
//通过这个方法可以通过一个TextView的id或者Button的id给它们设置文本
views.setTextViewText(R.id.tv1,"沧海笑");
//这个方法可以给按钮设置点击事件,不过具体的用法我还不知道,现在把他给注释掉
// views.setOnClickPendingIntent(viewId, pendingIntent);
//把远程视图通过setContent方法设置到通知里去
Builder.setContent(views);
Builder.setTicker("我自定义了一个通知(文龙播放器)");
//通过,通知管理器发送通知
NotificationManager nm=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(4, Builder.build());
Toast.makeText(getApplicationContext(), "hello",1000).show();
}
}