Android之Notification抽屉通知详解
2017-09-08 03:56
323 查看
//学习本章内容你要知道的知识两个重要知识点内容!
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(); } }
相关文章推荐
- Android状态栏通知Notification、NotificationManager详解
- Android 状态栏通知Notification、NotificationManager详解
- Android Notification通知详解
- Android通知Notification详解
- Android中Notification通知用法详解
- Android中的Notification通知详解
- Android中通知的使用-----Notification详解
- Android UI控件详解-Notification(通知)
- notification android原生消息通知代码详解
- Android基础—Notification(状态栏通知)详解
- Android开发之Notification通知用法详解
- Android 状态栏通知Notification、NotificationManager详解
- Android Notification 通知详解
- Android 通知Notification详解
- Android Notification通知详解
- 详解Android中使用Notification实现进度通知栏(示例三)
- 【Android】状态栏通知Notification、NotificationManager详解
- android 通知Notification详解及实例代码
- 【Android】状态栏通知Notification、NotificationManager详解
- Android Notification通知栏开发详解