到此。就创建出来一个通知了。我们可以在8.0以上的手机找到设置--》应用和通知---》应用信息---》找到你的那个应用---》应用通知就可以看到会有个类别。这里面的列表就是我们在应用里面创建的应用通道。你可以点击通道查看详情。
点击运行,我们可以看到通知可以正常的弹出来。可是对比一下就可以看到。在8以下的系统上。消息的震动我们是可以控制的。以前我们只要把:
builder.setVibrate(new long[]{1000, 500, 2000});修改成builder.setVibrate(new long[]{0});
就可以不震动了。可是这个方法在8.0的设备上并没有起作用。写了以后还是会震动。最后通过查看资料发现。8.0以后。消息的震动就不再是修改builder就可以的。我们需要修改消息通道的属性,代码如下:
@TargetApi(Build.VERSION_CODES.O) private void createNotificationChannel(boolean isVibrate, String channelId, String channelName, int importance) { NotificationChannel channel = new NotificationChannel(channelId, channelName, importance); //NotificationChannel channel = new NotificationChannel(channelId, channelName, importance); if (isVibrate) { // 设置通知出现时的震动(如果 android 设备支持的话) channel.enableVibration(true); channel.setVibrationPattern(pattern); } else { // 设置通知出现时不震动 channel.enableVibration(false); channel.setVibrationPattern(new long[]{0}); } notificationManager.createNotificationChannel(channel); }
8.0以下的还是
builder.setVibrate(new long[]{0});
即可。
然后我又发现一个问题。就是channel一旦createNotificationChannel出来以后。你通过代码再去修改他的属性就不再起作用。
因为我界面上有个checkBox。我想实现。勾选以后接受通知的时候就是震动的。不勾选就是不震动的。
刚开始的思路是在cb的setOnCheckedChangeListener方法里面。去修改channel的enableVibration和setVibrationPattern两个属性的值。发现没有任何作用。后来我思考是不是。因为。channel一旦生产出来就是在系统里面了。不能修改了。于是我又在修改之前。根据channelId先去查看查找有没有。如果有。
notificationManager.deleteNotificationChannel(channelId);
我就先删除掉。然后我再重新new.并且create.即代码修改成了:
cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { setChannerl(b); Log.e("zmm", "onCheckedChanged------------>" + b); } });private void setChannerl(boolean checked) { channelId = "chat";//消息通道的id,以后可以通过该id找到该消息通道 String channelName = "聊天消息";//消息通道的name int importance = NotificationManager.IMPORTANCE_MAX;//通知的优先级 // .具体的请自行百度。作用就是优先级的不同。可以导致消息出现的形式不一样。 // MAX是会震动并且出现在屏幕的上方。设置优先级为low或者min时。来通知时都不会震动, // 且不会直接出现在屏幕上方 createNotificationChannel(checked, channelId, channelName, importance); }@TargetApi(Build.VERSION_CODES.O) private void createNotificationChannel(boolean isVibrate, String channelId, String channelName, int importance) { //先删除之前的channelId对应的消息通道. notificationManager.deleteNotificationChannel(channelId); //重新new一个消息通道。 NotificationChannel channel = new NotificationChannel(channelId, channelName, importance); //是否震动 if (isVibrate) { // 设置通知出现时的震动(如果 android 设备支持的话) channel.enableVibration(true); channel.setVibrationPattern(pattern); } else { // 设置通知出现时不震动 channel.enableVibration(false); channel.setVibrationPattern(new long[]{0}); } notificationManager.createNotificationChannel(channel); }
删除app.然后重新运行。我第一次进来。发消息是没有震动的。正确。然后勾选cb。然后重新点击发送通知。结果通知是接受到了。可是没有震动。。。。气人不!!!气人。。。
仔细看了下。代码。确定不是因为我自己的粗心哪里写错了。那就是我用的哪个方法肯定没有作用。
经过一杯茶的冷静。我在思考会不会是channelId的原因。因为虽然我删除掉了 。但是系统会不会是像一般的后台一样是个假删除。然后再用相同的id去new的时候。系统又把之前的消息通道拿出来了。如果是这样的话。那属性是没办法修改的。为了测试。我把channelId修改成动态的了。我每次勾选cb的时候。i++。然后channelid="chat"+i;为了防止越来越多的channel.我用beforeId记录之前的channelId。然后再新建的时候。先去删除beforeId.然后再新建。代码如下:
cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { i++; setChannerl(b); Log.e("zmm", "onCheckedChanged------------>" + b); } });private void setChannerl(boolean checked) { channelId = "chat" + i;//消息通道的id,以后可以通过该id找到该消息通道 String channelName = "聊天消息" + i;//消息通道的name int importance = NotificationManager.IMPORTANCE_MAX;//通知的优先级 // .具体的请自行百度。作用就是优先级的不同。可以导致消息出现的形式不一样。 // MAX是会震动并且出现在屏幕的上方。设置优先级为low或者min时。来通知时都不会震动, // 且不会直接出现在屏幕上方 createNotificationChannel(checked, channelId, channelName, importance); beforeChannelId = channelId; }@TargetApi(Build.VERSION_CODES.O) private void createNotificationChannel(boolean isVibrate, String channelId, String channelName, int importance) { if (!TextUtils.isEmpty(beforeChannelId)) { //先删除之前的channelId对应的消息通道. notificationManager.deleteNotificationChannel(beforeChannelId); } //重新new一个消息通道。 NotificationChannel channel = new NotificationChannel(channelId, channelName, importance); //是否震动 if (isVibrate) { // 设置通知出现时的震动(如果 android 设备支持的话) channel.enableVibration(true); channel.setVibrationPattern(pattern); } else { // 设置通知出现时不震动 channel.enableVibration(false); channel.setVibrationPattern(new long[]{0}); } notificationManager.createNotificationChannel(channel); }
别忘了修改createNotification()方法里面的
if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.O) { builder =newNotificationCompat.Builder(this,channelId);//该处写的应该是当前的channelId。 }else{ builder =newNotificationCompat.Builder(this); }
然后重新运行。第一次。发通知。没有震动。OK的。勾选震动。发通知。震动了。OK的!
至此问题就解决了。为了一探究竟。想看下deleteNotificationChannel源码的实现。发现我没有下载源码。所以看不了。于是去官方文档看了下。
。英语不好就不翻译了。但是还是能看到的。如果你新建的channel和要删除的channel是同一个channelId的话。新建的channel的属性和要删除的那个channel是相同的。。。。。我境界还没达到。不知道这样设计的目的。但是应该有他们的原因。。。
重点1:8.0以上消息震动是通过修改channel来实现的:
if(isVibrate) {// 设置通知出现时的震动(如果 android 设备支持的话) channel.enableVibration(true); channel.setVibrationPattern(pattern); }else{// 设置通知出现时不震动 channel.enableVibration(false); channel.setVibrationPattern(new long[]{0}); }
重点2:channel一旦被create出来。修改属性没有作用,可以通过删除掉。再重新create。但是要记得要删除的channelId和要新建的channelId不能一致.
我也好久没写博客了。。之前一个月。忙着交接工作。辞职。搬家。找工作。好在。一切都再慢慢步入正轨。从一个城市到另一个城市。说后悔谈不上。不舍却有的。只是在想。是不是当初可以有更好的选择。不过回到合肥以后。确定开心了很多。在这个城市。有很多我熟悉的朋友。还有一个待我很好的朋友。总是去她家蹭饭。而且一次噩梦也没有做过。离家也近了很多。而且。在这里。我不会觉得害怕。不会觉得孤单。虽然。新公司里面我还不熟悉。但是大家看着就是很好的人。我应该可以和他们好好好相处。。最后但愿我在新公司里面可以多学点东西。嗯。接下来的日子请继续加油!!!
每日语录:
决心走一条路的时候,就不要左顾右盼,风景再美也别流连,你应当清楚自己的目的,你应当清楚你心如钢铁地追求的东西是什么,在哪里,时不时给自己提个醒。加油!
单曲循环《这些年来》
看了很多文章写了怎么取消通知栏的,自己试了就是取消不掉。后来尝试之后实现了,代码写错了。 public class LoginSuccess extends Activity {	@Override protected void onCreate(Bundle ...
看了很多文章写了怎么取消通知栏的,自己试了就是取消不掉。后来尝试之后实现了,代码写错了。
public class LoginSuccess extends Activity {	@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.success_login); Toast.makeText(LoginSuccess.this, "登陆成功", 2000).show(); NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setContentTitle("通知栏标题 ")	.setContentText("通知内容") //	.setContentIntent(getDefalutIntent(Notification.FLAG_AUTO_CANCEL))//点击意图	.setTicker("通知首次出现在通知栏,带上升动画效果的")	.setWhen(System.currentTimeMillis())//通知产生的时间,会在通知信息里显示,一般是系统获取到的时间	.setPriority(Notification.PRIORITY_DEFAULT)	.setAutoCancel(true)//用户点击就自动消失	.setOngoing(true)//ture,设置他为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)	.setDefaults(Notification.DEFAULT_VIBRATE)//向通知添加声音、闪灯和振动效果的最简单、最一致的方式是使用当前的用户默认设置,使用defaults属性,可以组合	//Notification.DEFAULT_ALL Notification.DEFAULT_SOUND 添加声音 // requires VIBRATE permission	.setSmallIcon(R.drawable.taobao);//设置通知小ICON Notification notification = builder.build(); notification.flags = Notification.FLAG_AUTO_CANCEL; notificationManager.notify(100, notification); // notificationManager.cancel(100);//通知以后自动消失了 }	}
错误的代码是:其实已经不是一个对象了。
Notification notification = builder.build(); notification.flags = Notification.FLAG_AUTO_CANCEL; notificationManager.notify(100, builder.build());
Android系统有个通知栏的管理,里面可以对app的通知栏进行关闭或者开启,现在需要开启自己App的通知栏,要如何通过代码开启呢。。
Android实现后台通知栏下载并可以取消的Demo
Android-系统自带通知栏and自定义通知栏
在使用android手机时,大家一定都会接触过系统通知栏提示的消息,如图。。。 我们在开发android程序时也经常会用到这个技术,先奉上初始化的函数一个	private void initNotify(){	mNotificationManager...
我创建通知通道,以在Android 8.0中显示通知,如下所示NotificationChannel uploadChannel = new NotificationChannel(Constants.NOTIFICATION_CHANNEL_UPLOAD_ID,"Uploads", NotificationManager.IMPORTANCE_LOW);...
Android通知系统源码解析1. 概述2. 流程图2.1....取消通知:3.1.4. 创建通知源码解析:3.2. 管理通知--SystemServer进程3.2.1. 发送通知:3.2.2. Service处理和推送通知:3.3. 展示--SystemUI进程 1. 概...
一、通知灯应用程序的编写 1、首先实现一个按钮功能 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="...
去除Android系统应用的通知功能 Android手机上,当有其他录音软件正在录音,打开系统录音软件开始录音时会发生录音冲突,弹出对话框提示“无法开始新的录制,其他应用程序已在录制” ,如下图所示。(测试机...
浅析Android 4.0的通知系统() ...通过手机的通知系统,可以将应用程序的一些重要消息告知给用户。...在对《Android Design》进行翻译时发现:Android系统已经提出了一些关于通知消息的设计建议,
如何去掉Android系统自带的标题栏以及设置全屏。。。
Android通知(Notification)是Android操作系统中比较特点的一个功能,用于某个应用程序向用户发送提示信息,发送一条信息后,手机状态栏会显示发送通知的应用程序图标,下拉状态栏会显示详细的通知内容,现...
通过手机的通知系统,可以将应用程序的...在对《Android Design》进行翻译时发现:Android系统已经提出了一些关于通知消息的设计建议,故在此分享给大家。 一、何时使用通知?通知主要用于对时间敏感(Time Sensit
Android从服务端下载文件,布局中有三个按钮,分别是“开始下载”“暂停下载”和“取消下载”。该项目支持断点续传。并且项目使用了OkHttp,通过设置下载监听类(DownLinstener)能将下载进度实时显示在系统通知栏里...
前言通知(Notification)可为是Android系统中富含特色的一个功能,从Android的第一个版本到Android N,通知这个功能也发生了巨大的变化,Google几乎每个版本对通知模块都做了更新升级,可见通知在Android系统中发挥...
Android中的通知(Notification)是Android中的重要一部分,应用程序通过通知来提醒用户或者向用户传达信息,下面让我们来看一下怎么在我们的程序中使用通知和自定义通知的布局。首先我们来看一下怎么向通知栏中发送...
一、Notification 概述 Notification,俗称通知...通知渠道是 Google 在Android O 中新增加的功能,新的版本中把振动、音效和灯效等相关效果放在了通知渠道中控制,这样用户就可以有选择的控制应用的某一类通知的通知
最近在开发电子白板项目,系统用的是Android8.0 最近一个需求是:系统自带的应用和预装的应用可以弹出通知,其他应用不能弹出 8.0的通知使用可以查看Android8.0中通知无法正常使用问题 要弹出通知,会使用到...
一开始是在service里面写的代码,在service里面采用广播来监听应用安装的广播。...importandroid.app.AlarmManager; importandroid.app.LightManager; importandroid.app.PendingIntent; import an...
最近几天碰到一个郁闷的问题,在有些机型上面使用PendingIntent.getActivity(context, 0, intent, 0)的方式打开一个指定的Activity后,通知栏并不主动折叠,让我一度的以为使用PendingIntent.getActivity()的方式...
1 找到通知栏对应的包名 包名为 com.android.systemui 在源码frameworks\base\中搜索”手电筒“,发现文件在frameworks\base\packages\SystemUI\res中2找到包名对应的java源码 在frameworks\base\packages\System...
文章目录通知通道...Badge显示、更新通知取消通知注意事项参考文档 通知通道(Channel) 从Android 8.0 开始,显示通知必须先创建通道: NotificationManager notificationManager = (NotificationManager) getSy