通知可以在活动、广播接收器,服务里创建
一、通知基本用法
- 用
Context.getSystemService(Context.NOTIFICATION_SERVICE)
获取到NotificationManager
对通知管理:
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)
- 用
Builder构造器
创建Notification
对象,channelId
用来表示消息通道的ID,自定义一个填上即可
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "unique");
- 基本设置
builder.setContentTitle("这是标题")
.setAutoCancel(true)
.setContentText("这是文本")
.setContentInfo("这是内容")
.setSubText("这是小字")
.setTicker("滚动消息......")
.setWhen(System.currentTimeMillis()) // 出现时间
.setSmallIcon(R.mipmap.ic_launcher) //小图标
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)); // 大图标
// 大于Android 8.0的版本适配
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
NotificationChannel notificationChannel = null;
notificationChannel = new NotificationChannel("unique", "TEST", NotificationManager.IMPORTANCE_HIGH);
notificationChannel.enableLights(true); //LED灯
notificationChannel.setLightColor(Color.YELLOW);
manager.createNotificationChannel(notificationChannel);
}
- 显示通知,第一个参数是自定义的
id
,第二个参数是对象
Notification notification = builder.build();
manager.notify(1, notification);
新建一个空项目
day14_NotificationTest
主布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/send_notice"
android:text="发起通知"/>
</LinearLayout>
主活动:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button_sendNotice = findViewById(R.id.send_notice);
button_sendNotice.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.send_notice:
Intent intent = new Intent(this, NotificationActivity.class);
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "unique");
builder.setContentTitle("这是标题")
.setAutoCancel(true)
.setContentText("这是文本")
.setContentInfo("这是内容")
.setSubText("这是小字")
.setTicker("滚动消息......")
.setWhen(System.currentTimeMillis()) // 出现时间
.setSmallIcon(R.mipmap.ic_launcher) //小图标
.setContentIntent(pi) //大图标
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)); // 大图标
Notification notification = builder.build();
manager.notify(1, notification);
break;
default:
break;
}
}
}
三、通知的响应
通知响应依赖于PendingIntent
,分别用于活动,广播,和服务,其对应静态方法:getActivity()
,getBroadcast()
,getService()
- 第一个参数:
Context
- 第二个参数:通常直接写
0
- 第三个参数:
Intent
- 第四个参数:可以选择四个:
FLAG_ONE_SHOT
,FLAG_NO_CREATE
,FLAG_CANCEL_CURRENT
,FLAG_UPDATE_CURRENT
。但通常写0
新建一个空活动
NotificationActivity
,对应布局notification_layout
通知布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textSize="24sp"
android:text="这一页是通知布局"/>
</RelativeLayout>
主活动给通知加入点击功能:
public void onClick(View v) {
switch (v.getId()) {
case R.id.send_notice:
Intent intent = new Intent(this, NotificationActivity.class);
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "001");
builder.setContentTitle("这是标题")
.setContentText("这是文本")
.setContentInfo("这是内容")
.setSubText("这是小字")
.setTicker("滚动消息......")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setContentIntent(pi)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
。。。。。。
运行:
让通知消失的两种方法:
- 在
NotificationCompat.Builder
中连缀一个setAutoCancel(true)
方法,通知被点击后就会自动清除:
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "001").setAutoCancel(true);
- 显示调用
NotificationManger
的cancel()
将它取消:
public class NotificationActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.notification_layout);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.cancel(1);
}
}
这里的 1
,是通知的id,之前设置好的。
四、通知的进阶技巧
设置通知的音效:
builder.setSound(Uri.fromFile(new File("铃声路径")));
设置振动【偶数表示振动的毫秒数,奇数表示接着静止的毫秒数】:
builder.setVibrate(new long[]{0, 1000, 1000, 1000});
// 8.0 以上要添加这个:
channel.setVibrationPattern(pattern);
不过设置振动需要先添加权限:
<uses-permission android:name="android.permission.VIBRATE"/>
显示长文字:
builder.setStyle(new NotificationCompat.BigTextStyle().bigText("唧唧复唧唧,木兰当户织。不闻机杼声,惟闻女叹息。\n" +
"问女何所思,问女何所忆。女亦无所思,女亦无所忆。昨夜见军帖,可汗大点兵,军书十二卷,卷卷有爷名。阿爷无大儿,木兰无长兄,愿为市鞍马,从此替爷征。\n" +
"东市买骏马,西市买鞍鞯,南市买辔头,北市买长鞭。旦辞爷娘去,暮宿黄河边,不闻爷娘唤女声,但闻黄河流水鸣溅溅。旦辞黄河去,暮至黑山头,不闻爷娘唤女声,但闻燕山胡骑鸣啾啾。\n" +
"万里赴戎机,关山度若飞。朔气传金柝,寒光照铁衣。将军百战死,壮士十年归。\n" +
"归来见天子,天子坐明堂。策勋十二转,赏赐百千强。可汗问所欲,木兰不用尚书郎,愿驰千里足,送儿还故乡。\n" +
"爷娘闻女来,出郭相扶将;阿姊闻妹来,当户理红妆;小弟闻姊来,磨刀霍霍向猪羊。开我东阁门,坐我西阁床,脱我战时袍,著我旧时裳。当窗理云鬓,对镜帖花黄。出门看火伴,火伴皆惊忙:同行十二年,不知木兰是女郎。\n" +
"雄兔脚扑朔,雌兔眼迷离;双兔傍地走,安能辨我是雄雌?"))
显示图片:
builder.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(), R.drawable.cat)))
设置重要程度:
builder.setPriority(NotificationCompat.PRIORITY_MAX)