您的位置:首页 > 移动开发 > Android开发

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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Notificati