-
2022-01-09 23:34:16
通过继承 NotificationListenerService实现, 它允许应用程序在创建或删除时接收有关通知的信息。
class MyNotificationListenerService : NotificationListenerService() { private val pkgName = this.javaClass.name /** * 接收任何到通知 * @param sbn StatusBarNotification */ override fun onNotificationPosted(sbn: StatusBarNotification?) { val extras = sbn?.notification?.extras extras?.let { val title = it.getString(NotificationCompat.EXTRA_TITLE, "") val content = it.getString(NotificationCompat.EXTRA_TEXT, "") Log.d(pkgName, "**********************") Log.d(pkgName, "包名:${sbn.packageName}") Log.d(pkgName, "标题:$title") Log.d(pkgName, "内容:$content") Log.d(pkgName, "**********************") } } /** * 首次连接 */ override fun onListenerConnected() { super.onListenerConnected() } }
在清单文件声明service,并声明权限和优先级
<service android:name=".service.MyNotificationListenerService" android:exported="true" android:label="@string/app_name" android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"> <intent-filter android:priority="1000"> <action android:name="android.service.notification.NotificationListenerService" /> </intent-filter> </service>
更多相关内容 -
Android 通知栏Notification的全面整合学习(完整项目源码)附配套博文
2014-05-15 07:59:00这个是通知栏框架(Notificaiton)的全面学习,里面把大概所有的情况都列了出来,通过一个DEMO让你了解它的大致所有使用过程。 可以通过以下博文进行配套了解(有效果图): ... -
一文彻底玩转Android通知栏消息通知
2021-12-09 19:58:20Google为什么要引入消息渠道这个,因为在之前版本的Android通知管理中,通知消息要么全部接收,要么全部屏蔽,然而消息渠道改变了这一特点。 就是每条通知都要属于一个对应的渠道。每个App都可以自由地创建当前App...消息渠道
Google为什么要引入消息渠道这个,因为在之前版本的Android通知管理中,通知消息要么全部接收,要么全部屏蔽,然而消息渠道改变了这一特点。
就是每条通知都要属于一个对应的渠道。每个App都可以自由地创建当前App拥有哪些通知渠道,但是这些通知渠道的控制权都是掌握在用户手上的。用户可以自由地选择这些通知渠道的重要程度,是否响铃、是否振动、或者是否要关闭这个渠道的通知。
以小米手机上的微信为例
API介绍
不带 channelId 已被废弃,慎用!!!
当然,Google也并没有完全做绝,即使方法标为了废弃,但还是可以正常使用的。可是如果你将项目中的targetSdkVersion指定到了26或者更高,那么Android系统就会认为你的App已经做好了8.0系统的适配工作,当然包括了通知栏的适配。这个时候如果还不使用通知渠道的话,那么你的App的通知将完全无法弹出。因此这里给大家的建议就是,一定要适配。
创建通知渠道
package com.wust.notifydemo; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.NotificationCompat; import android.annotation.TargetApi; import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; import android.os.Build; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initNotificationChannel(); } /** * 初始化消息渠道 */ private void initNotificationChannel() { // 要确保的是当前手机的系统版本必须是Android 8.0系统或者更高, // 因为低版本的手机系统并没有通知渠道这个功能, // 不做系统版本检查的话会在低版本手机上造成崩溃。 if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) { // 创建一个通知渠道至少需要渠道ID、渠道名称以及重要等级这三个参数 // 渠道ID可以随便定义,只要保证全局唯一性就可以 String channelId = "chat"; // 渠道名称是给用户看的,需要能够表达清楚这个渠道的用途 String channelName = "聊天消息"; // 重要等级的不同则会决定通知的不同行为,重要等级还可以设置为IMPORTANCE_LOW、IMPORTANCE_MIN,分别对应了更低的通知重要程度。 int importance = NotificationManager.IMPORTANCE_HIGH; createNotificationChannel(channelId, channelName, importance); channelId = "subscribe"; channelName = "订阅消息"; importance = NotificationManager.IMPORTANCE_DEFAULT; createNotificationChannel(channelId, channelName, importance); } } @TargetApi(Build.VERSION_CODES.O) private void createNotificationChannel(String channelId, String channelName, int importance) { // 创建 channel NotificationChannel channel = new NotificationChannel(channelId, channelName, importance); // 获取 notificationManager NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); // 注册 channel notificationManager.createNotificationChannel(channel); } }
运行代码,可以在 对应应用的 应用信息 =》 通知管理 =》 通知类别下看到我们创建的两个 channel ,效果如下:
刚才我们创建的两个通知渠道这里已经显示出来了。可以看到,由于这两个通知渠道的重要等级不同,通知的行为也是不同的,聊天消息可以发出提示音并在屏幕上弹出通知,而订阅消息只能发出提示音。
当然,用户还可以点击进去对该通知渠道进行任意的修改,比如降低聊天消息的重要等级,甚至是可以完全关闭该渠道的通知。
至于创建通知渠道的这部分代码,你可以写在MainActivity中,也可以写在Application中,实际上可以写在程序的任何位置,只需要保证在通知弹出之前调用就可以了。并且创建通知渠道的代码只在第一次执行的时候才会创建,以后每次执行创建代码系统会检测到该通知渠道已经存在了,因此不会重复创建,也并不会影响任何效率。
发送通知
触发通知的代码和之前版本基本是没有任何区别的,只是在构建通知对象的时候,需要多传入一个通知渠道ID,表示这条通知是属于哪个渠道的。
- 布局文件
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:id="@+id/btn_send_chat" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="发送聊天消息" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/btn_send_subscribe" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="发送订阅消息" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/btn_send_chat" /> </androidx.constraintlayout.widget.ConstraintLayout>
- 发送消息逻辑
btn_send_chat.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //第一步:获取 NotificationManager NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); //第二步:创建 Notification notification = new NotificationCompat.Builder(MainActivity.this, "chat") .setContentTitle("收到一条聊天消息") .setContentText("在干嘛呢?") .setWhen(System.currentTimeMillis()) .setSmallIcon(R.drawable.bb) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.bb)) .setAutoCancel(true) .build(); //第三步:发送 notificationManager.notify(1, notification); } }); btn_send_subscribe.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //第一步:获取 NotificationManager NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); //第二步:创建 Notification notification = new NotificationCompat.Builder(MainActivity.this, "subscribe") .setContentTitle("收到一条订阅消息") .setContentText("你买的彩票中了2个亿?") .setWhen(System.currentTimeMillis()) .setSmallIcon(R.drawable.bb) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.bb)) .setAutoCancel(true) .build(); //第三步:发送 notificationManager.notify(2, notification); } });
管理通知渠道
btn_send_chat.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //第一步:获取 NotificationManager NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); //第四步:检测 "chat" 这个通道的消息等级 if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) { NotificationChannel channel = notificationManager.getNotificationChannel("chat"); if (channel.getImportance() != NotificationManager.IMPORTANCE_HIGH) { Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS); intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName()); intent.putExtra(Settings.EXTRA_CHANNEL_ID, channel.getId()); startActivity(intent); Toast.makeText(MainActivity.this, "请手动将通知打开", Toast.LENGTH_SHORT).show(); } } //第二步:创建 Notification notification = new NotificationCompat.Builder(MainActivity.this, "chat") .setContentTitle("收到一条聊天消息") .setContentText("在干嘛呢?") .setWhen(System.currentTimeMillis()) .setSmallIcon(R.drawable.bb) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.bb)) .setAutoCancel(true) .build(); //第三步:发送 notificationManager.notify(1, notification); } });
测试条件:你将 聊天消息 重要程度 手动设置为 低,当你点击发送聊天消息的时候,代码会引导你设置聊天消息等级
显示未读角标
修改两个地方
第一是在创建通知渠道的时候,调用了NotificationChannel的setShowBadge(true)方法,表示允许这个渠道下的通知显示角标。第二是在创建通知的时候,调用了setNumber()方法,并传入未读消息的数量。
-
Android通知栏微技巧,8.0系统中通知栏的适配
2018-04-17 07:39:11大家好,今天我们继续来学习Android 8.0系统的适配。...在上一篇文章当中,我们学习了Android 8.0系统应用图标的适配,那么本篇文章,我们自然要将重点放在通知栏上面了,学习一下Android 8.0系统的通知栏适配转载请注明出处:https://blog.csdn.net/guolin_blog/article/details/79854070
本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每个工作日都有文章更新。
大家好,今天我们继续来学习Android 8.0系统的适配。
之前我们已经讲到了,Android 8.0系统最主要需要进行适配的地方有两处:应用图标和通知栏。在上一篇文章当中,我们学习了Android 8.0系统应用图标的适配,还没有看过这篇文章的朋友可以先去阅读 Android应用图标微技巧,8.0系统中应用图标的适配 。
那么本篇文章,我们自然要将重点放在通知栏上面了,学习一下Android 8.0系统的通知栏适配。
其实在8.0系统之前,还有一次通知栏变动比较大的版本,就是5.0系统。关于5.0系统需要对通知栏进行适配的内容,我也整理了一篇文章,感兴趣的朋友可以去阅读 Android通知栏微技巧,那些你所没关注过的小细节 。
那么下面我们就开始进入本篇文章的正题。
为什么要进行通知栏适配?
不得不说,通知栏真是一个让人又爱又恨的东西。
通知栏是Android系统原创的一个功能,虽说乔布斯一直认为Android系统是彻彻底底抄袭iOS的一个产品,但是通知栏确实是Android系统原创的,反而苹果在iOS 5之后也加入了类似的通知栏功能。
通知栏的设计确实非常巧妙,它默认情况下不占用任何空间,只有当用户需要的时候用手指在状态栏上向下滑动,通知栏的内容才会显示出来,这在智能手机发展的初期极大地解决了手机屏幕过小,内容展示区域不足的问题。
可是随着智能手机发展的逐渐成熟,通知栏却变得越来越不讨人喜欢了。各个App都希望能抢占通知栏的空间,来尽可能地宣传和推广自己的产品。现在经常是早上一觉醒来拿起手机一看,通知栏上全是各种APP的推送,不胜其烦。
我个人虽然是Android应用开发者,但同时也是Android手机的资深用户。我已经使用了8年的Android手机,目前我对于通知栏的这种垃圾推送是零容忍的。现在每当我安装一个新的App时,我都会先到设置里面去找一找有没有推送开关,如果有的话我会第一时间把它关掉。而如果一个App经常给我推送垃圾信息却又无法关闭时,我会直接将它的通知总开关给关掉,如果还不是什么重要的App的话,那么我可能就直接将它卸载掉了。
为什么一个很好的通知栏功能现在却变得这么遭用户讨厌?很大一部分原因都是因为开发者没有节制地使用导致的。就好像App保活一样,直到今天还是不断有人问我该如何保活App,试想如何每个人都能保活自己的App,那么最终受害的人是谁?还不是使用Android手机的用户。大家的手机只会越来越卡,最后只想把手机丢掉,变成iPhone用户了。也是因为开发者没节制地使用,Android现在的每个版本都会不断收缩后台权限。
回到通知栏上也是一样,每个开发者都只想着尽可能地去宣传自己的App,最后用户的手机就乱得跟鸡窝一样了。但是通知栏又还是有用处的,比如我们收到微信、短信等消息的时候,确实需要通知栏给我们提醒。因此分析下来,通知栏目前最大的问题就是,无法让用户对感兴趣和不感兴趣的消息进行区分。就比如说,我希望淘宝向我推送卖家发货和物流的相关消息,但是我不想收到那些打折促销或者是让我去买衣服的这类消息。那么就目前来说,是没有办法对这些消息做区分的,我要么同意接受所有消息,要么就屏蔽所有消息,这是当前通知栏的痛点。
那么在Android 8.0系统中,Google也是从这个痛点开始下手的。
8.0系统的通知栏适配
从Android 8.0系统开始,Google引入了通知渠道这个概念。
什么是通知渠道呢?顾名思义,就是每条通知都要属于一个对应的渠道。每个App都可以自由地创建当前App拥有哪些通知渠道,但是这些通知渠道的控制权都是掌握在用户手上的。用户可以自由地选择这些通知渠道的重要程度,是否响铃、是否振动、或者是否要关闭这个渠道的通知。
拥有了这些控制权之后,用户就再也不用害怕那些垃圾推送消息的打扰了,因为用户可以自主地选择自己关心哪些通知、不关心哪些通知。举个具体的例子,我希望可以即时收到支付宝的收款信息,因为我不想错过任何一笔收益,但是我又不想收到支付宝给我推荐的周围美食,因为我没钱只吃得起公司食堂。这种情况,支付宝就可以创建两种通知渠道,一个收支,一个推荐,而我作为用户对推荐类的通知不感兴趣,那么我就可以直接将推荐通知渠道关闭,这样既不影响我关心的通知,又不会让那些我不关心的通知来打扰我了。
对于每个App来说,通知渠道的划分是非常需要仔细考究的,因为通知渠道一旦创建之后就不能再修改了,因此开发者需要仔细分析自己的App一共有哪些类型的通知,然后再去创建相应的通知渠道。这里我们来参考一下Twitter的通知渠道划分:
可以看到,Twitter就是根据自己的通知类型,对通知渠道进行了非常详细的划分,这样用户的自主选择性就比较高了,也就大大降低了用户不堪其垃圾通知的骚扰而将App卸载的概率。
我一定要适配吗?
Google这次对于8.0系统通知渠道的推广态度还是比较强硬的。
首先,如果你升级了appcompat库,那么所有使用appcompat库来构建通知的地方全部都会进行废弃方法提示,如下所示:
上图告诉我们,此方法已废弃,需要使用带有通知渠道的方法才行。
当然,Google也并没有完全做绝,即使方法标为了废弃,但还是可以正常使用的。可是如果你将项目中的targetSdkVersion指定到了26或者更高,那么Android系统就会认为你的App已经做好了8.0系统的适配工作,当然包括了通知栏的适配。这个时候如果还不使用通知渠道的话,那么你的App的通知将完全无法弹出。因此这里给大家的建议就是,一定要适配。
好了,前面向大家介绍了这么多的背景知识,那么现在开始我们就正式进入正题,来学习一下如何进行8.0系统中通知栏的适配。
创建通知渠道
首先我们使用Android Studio来新建一个项目,就叫它NotificationTest吧。
创建好项目之后,打开app/build.gradle文件检查一下,确保targetSdkVersion已经指定到了26或者更高,如下所示:
apply plugin: 'com.android.application' android { compileSdkVersion 26 defaultConfig { applicationId "com.example.notificationtest" minSdkVersion 15 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } }
可以看到,这里我在创建新项目的时候默认targetSdkVersion就是26,如果你是低于26的话,说明你的Android SDK有些老了,最好还是更新一下。当然如果你懒得更新也没关系,手动把它改成26就可以了。
接下来修改MainActivity中的代码,如下所示:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { String channelId = "chat"; String channelName = "聊天消息"; int importance = NotificationManager.IMPORTANCE_HIGH; createNotificationChannel(channelId, channelName, importance); channelId = "subscribe"; channelName = "订阅消息"; importance = NotificationManager.IMPORTANCE_DEFAULT; createNotificationChannel(channelId, channelName, importance); } } @TargetApi(Build.VERSION_CODES.O) private void createNotificationChannel(String channelId, String channelName, int importance) { NotificationChannel channel = new NotificationChannel(channelId, channelName, importance); NotificationManager notificationManager = (NotificationManager) getSystemService( NOTIFICATION_SERVICE); notificationManager.createNotificationChannel(channel); } }
代码不长,我来简单解释下。这里我们在MainActivity中创建了两个通知渠道,首先要确保的是当前手机的系统版本必须是Android 8.0系统或者更高,因为低版本的手机系统并没有通知渠道这个功能,不做系统版本检查的话会在低版本手机上造成崩溃。
创建一个通知渠道的方式非常简单,这里我封装了一个createNotificationChannel()方法,里面的逻辑相信大家都看得懂。需要注意的是,创建一个通知渠道至少需要渠道ID、渠道名称以及重要等级这三个参数,其中渠道ID可以随便定义,只要保证全局唯一性就可以。渠道名称是给用户看的,需要能够表达清楚这个渠道的用途。重要等级的不同则会决定通知的不同行为,当然这里只是初始状态下的重要等级,用户可以随时手动更改某个渠道的重要等级,App是无法干预的。
上述代码我是模拟了这样一个场景。想象一下我们正在开发一个类似于微信的App,其中App通知主要可以分为两类,一类是我和别人的聊天消息,这类消息非常重要,因此重要等级我设为了IMPORTANCE_HIGH。另一类是公众号的订阅消息,这类消息不是那么重要,因此重要等级我设为了IMPORTANCE_DEFAULT。除此之外,重要等级还可以设置为IMPORTANCE_LOW、IMPORTANCE_MIN,分别对应了更低的通知重要程度。
现在就可以运行一下代码了,运行成功之后我们关闭App,进入到设置 -> 应用 -> 通知当中,查看NotificationTest这个App的通知界面,如下图所示:
刚才我们创建的两个通知渠道这里已经显示出来了。可以看到,由于这两个通知渠道的重要等级不同,通知的行为也是不同的,聊天消息可以发出提示音并在屏幕上弹出通知,而订阅消息只能发出提示音。
当然,用户还可以点击进去对该通知渠道进行任意的修改,比如降低聊天消息的重要等级,甚至是可以完全关闭该渠道的通知。
至于创建通知渠道的这部分代码,你可以写在MainActivity中,也可以写在Application中,实际上可以写在程序的任何位置,只需要保证在通知弹出之前调用就可以了。并且创建通知渠道的代码只在第一次执行的时候才会创建,以后每次执行创建代码系统会检测到该通知渠道已经存在了,因此不会重复创建,也并不会影响任何效率。
让通知显示出来
触发通知的代码和之前版本基本是没有任何区别的,只是在构建通知对象的时候,需要多传入一个通知渠道ID,表示这条通知是属于哪个渠道的。
那么下面我们就来让通知显示出来。
首先修改activity_main.xml中的代码,如下所示:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="发送聊天消息" android:onClick="sendChatMsg" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="发送订阅消息" android:onClick="sendSubscribeMsg" /> </LinearLayout>
这里我们在布局文件中加入了两个按钮,很显然,一个是用于触发聊天消息渠道通知的,一个是用于触发订阅消息渠道通知的。
接下来修改MainActivity中的代码,如下所示:
public class MainActivity extends AppCompatActivity { ... public void sendChatMsg(View view) { NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); Notification notification = new NotificationCompat.Builder(this, "chat") .setContentTitle("收到一条聊天消息") .setContentText("今天中午吃什么?") .setWhen(System.currentTimeMillis()) .setSmallIcon(R.drawable.icon) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.icon)) .setAutoCancel(true) .build(); manager.notify(1, notification); } public void sendSubscribeMsg(View view) { NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); Notification notification = new NotificationCompat.Builder(this, "subscribe") .setContentTitle("收到一条订阅消息") .setContentText("地铁沿线30万商铺抢购中!") .setWhen(System.currentTimeMillis()) .setSmallIcon(R.drawable.icon) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.icon)) .setAutoCancel(true) .build(); manager.notify(2, notification); } }
这里我们分别在sendChatMsg()和sendSubscribeMsg()方法中触发了两条通知,创建通知的代码就不再多做解释了,和传统创建通知的方法没什么两样,只是在NotificationCompat.Builder中需要多传入一个通知渠道ID,那么这里我们分别传入了chat和subscribe这两个刚刚创建的渠道ID。
现在重新运行一下代码,并点击发送聊天消息按钮,效果如下图所示:
由于这是一条重要等级高的通知,因此会使用这种屏幕弹窗的方式来通知用户有消息到来。然后我们可以下拉展开通知栏,这里也能查看到通知的详细信息:
用户可以通过快速向左或者向右滑动来关闭这条通知。
接下来点击发送订阅消息按钮,你会发现现在屏幕上不会弹出一条通知提醒了,只会在状态栏上显示一个小小的通知图标:
因为订阅消息通知的重要等级是默认级别,这就是默认级别通知的展示形式。当然我们还是可以下拉展开通知栏,查看通知的详细信息:
不过上面演示的都是通知栏的传统功能,接下来我们看一看Android 8.0系统中通知栏特有的功能。
刚才提到了,快速向左或者向右滑动可以关闭一条通知,但如果你缓慢地向左或者向右滑动,就会看到这样两个按钮:
其中,左边那个时钟图标的按钮可以让通知延迟显示。比方说这是一条比较重要的通知,但是我暂时没时间看,也不想让它一直显示在状态栏里打扰我,我就可以让它延迟一段后时间再显示,这样我就暂时能够先将精力放在专注的事情上,等过会有时间了这条通知会再次显示出来,我不会错过任何信息。如下所示:
而右边那个设置图标的按钮就可以用来对通知渠道进行屏蔽和配置了,用户对每一个App的每一个通知渠道都有绝对的控制权,可以根据自身的喜好来进行配置和修改。如下所示:
比如说我觉得订阅消息老是向我推荐广告,实在是太烦了,我就可以将订阅消息的通知渠道关闭掉。这样我以后就不会再收到这个通知渠道下的任何消息,而聊天消息却不会受到影响,这就是8.0系统通知渠道最大的特色。
另外,点击上图中的所有类别就可以进入到当前应用程序通知的完整设置界面。
管理通知渠道
在前面的内容中我们已经了解到,通知渠道一旦创建之后就不能再通过代码修改了。既然不能修改的话那还怎么管理呢?为此,Android赋予了开发者读取通知渠道配置的权限,如果我们的某个功能是必须按照指定要求来配置通知渠道才能使用的,那么就可以提示用户去手动更改通知渠道配置。
只讲概念总是不容易理解,我们还是通过具体的例子来学习一下。想一想我们开发的是一个类似于微信的App,聊天消息是至关重要的,如果用户不小心将聊天消息的通知渠道给关闭了,那岂不是所有重要的信息全部都丢了?为此我们一定要保证用户打开了聊天消息的通知渠道才行。
修改MainActivity中的代码,如下所示:
public class MainActivity extends AppCompatActivity { ... public void sendChatMsg(View view) { NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel channel = manager.getNotificationChannel("chat"); if (channel.getImportance() == NotificationManager.IMPORTANCE_NONE) { Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS); intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName()); intent.putExtra(Settings.EXTRA_CHANNEL_ID, channel.getId()); startActivity(intent); Toast.makeText(this, "请手动将通知打开", Toast.LENGTH_SHORT).show(); } } Notification notification = new NotificationCompat.Builder(this, "chat") ... .build(); manager.notify(1, notification); } ... }
这里我们对sendChatMsg()方法进行了修改,通过getNotificationChannel()方法获取到了NotificationChannel对象,然后就可以读取该通知渠道下的所有配置了。这里我们判断如果通知渠道的importance等于IMPORTANCE_NONE,就说明用户将该渠道的通知给关闭了,这时会跳转到通知的设置界面提醒用户手动打开。
现在重新运行一下程序,效果如下图所示:
可以看到,当我们将聊天消息的通知渠道关闭后,下次再次发送聊天消息将会直接跳转到通知设置界面,提醒用户手动将通知打开。
除了以上管理通知渠道的方式之外,Android 8.0还赋予了我们删除通知渠道的功能,只需使用如下代码即可删除:
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); manager.deleteNotificationChannel(channelId);
但是这个功能非常不建议大家使用。因为Google为了防止应用程序随意地创建垃圾通知渠道,会在通知设置界面显示所有被删除的通知渠道数量,如下图所示:
这样是非常不美观的,所以对于开发者来说最好的做法就是仔细规划好通知渠道,而不要轻易地使用删除功能。
显示未读角标
前面我们提到过,苹果是从iOS 5开始才引入了通知栏功能,那么在iOS 5之前,iPhone都是怎么进行消息通知的呢?使用的就是未读角标功能,效果如下所示:
实际上Android系统之前是从未提供过这种类似于iOS的角标功能的,但是由于很多国产手机厂商都喜欢跟风iOS,因此各种国产手机ROM都纷纷推出了自己的角标功能。
可是国产手机厂商虽然可以订制ROM,但是却没有制定API的能力,因此长期以来都没有一个标准的API来实现角标功能,很多都是要通过向系统发送广播来实现的,而各个手机厂商的广播标准又不一致,经常导致代码变得极其混杂。
值得高兴的是,从8.0系统开始,Google制定了Android系统上的角标规范,也提供了标准的API,长期让开发者头疼的这个问题现在终于可以得到解决了。
那么下面我们就来学习一下如何在Android系统上实现未读角标的效果。
修改MainActivity中的代码,如下所示:
public class MainActivity extends AppCompatActivity { ... @TargetApi(Build.VERSION_CODES.O) private void createNotificationChannel(String channelId, String channelName, int importance) { NotificationChannel channel = new NotificationChannel(channelId, channelName, importance); channel.setShowBadge(true); NotificationManager notificationManager = (NotificationManager) getSystemService( NOTIFICATION_SERVICE); notificationManager.createNotificationChannel(channel); } public void sendSubscribeMsg(View view) { NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); Notification notification = new NotificationCompat.Builder(this, "subscribe") ... .setNumber(2) .build(); manager.notify(2, notification); } }
可以看到,这里我们主要修改了两个地方。第一是在创建通知渠道的时候,调用了NotificationChannel的setShowBadge(true)方法,表示允许这个渠道下的通知显示角标。第二是在创建通知的时候,调用了setNumber()方法,并传入未读消息的数量。
现在重新运行一下程序,并点击发送订阅消息按钮,然后在Launcher中找到NotificationTest这个应用程序,如下图所示:
可以看到,在图标的右上角有个绿色的角标,说明我们编写的角标功能已经生效了。
需要注意的是,即使我们不调用setShowBadge(true)方法,Android系统默认也是会显示角标的,但是如果你想禁用角标功能,那么记得一定要调用setShowBadge(false)方法。
但是未读数量怎么没有显示出来呢?这个功能还需要我们对着图标进行长按才行,效果如下图所示:
这样就能看到通知的未读数量是2了。
可能有些朋友习惯了iOS上的那种未读角标,觉得Android上这种还要长按的方式很麻烦。这个没有办法,因为这毕竟是Android原生系统,Google没有办法像国内手机厂商那样可以肆无忌惮地模仿iOS,要不然可能会吃官司的。但是我相信国内手机厂商肯定会将这部分功能进行定制,风格应该会类似于iOS。不过这都不重要,对于我们开发者来说,最好的福音就是有了统一的API标准,不管国内手机厂商以后怎么定制ROM,都会按照这个API的标准来定制,我们只需要使用这个API来进行编程就可以了。
好的,关于Android 8.0系统适配的上下两篇文章到这里就结束了,感谢大家阅读。
文章中的示例源码点击 这里 下载。
关注我的技术公众号,每天都有优质技术文章推送。关注我的娱乐公众号,工作、学习累了的时候放松一下自己。
微信扫一扫下方二维码即可关注:
-
android 通知提示 右上角 小图标
2013-04-28 08:58:17android 主图标 右上角 小图标 提示效果 -
Android 通知监听服务、NotificationListenerService使用方式(详细步骤+源码)
2021-08-05 18:59:23NotificationListenerService 通知监听服务,就是监听手机上的广播通知,这个在纯App开发中用的比较少,但是在智能穿戴领域用的很多,比如我有一个智能手表,然后有一个配套的App应用,有时候在上班路上,手机...NotificationListenerService使用
前言
今天是七夕,深圳又在下雨,庆幸的是单身狗不用出门,苦涩。NotificationListenerService 通知监听服务,就是监听手机上的广播通知,这个在纯App开发中用的比较少,但是在智能穿戴领域用的很多,比如我有一个智能手表,然后有一个配套的App应用,有时候在上班路上,手机放在口袋里,要接受到手机上的通知消息,例如QQ、微信、来电、短信等。智能手表上显示有新消息,如果手表上有屏幕的话,还能显示消息的内容。这就很Nice了不是吗?
先看看效果图:
正文
下面进入正式的使用,我先说一下使用的思路,NotificationListenerService 是一个服务,服务更多的是在后台运行,其次由于这个需要进行通知监听,会涉及到一个动态权限请求。第三就是手机上是否安装了微信、QQ等应用。
一、配置项目
新建项目NotifyListenerDemo。
主要是项目依赖库的添加,打开工程的build.gradle的repositories{}闭包下添加依赖库:maven {url "https://jitpack.io"}
然后在app模块的build.gradle中添加依赖:
//简单工具类库 implementation 'com.github.lilongweidev:EasyLibrary:1.0.4'
然后Sync,同步项目添加依赖库。
二、通知监听服务
创建一个服务,然后将服务注册在AndroidManifest.xml中。创建一个NotifyService类,里面的代码如下:
public class NotifyService extends NotificationListenerService { public static final String TAG = "NotifyService"; public static final String QQ = "com.tencent.mobileqq";//qq信息 public static final String WX = "com.tencent.mm";//微信信息 public static final String MMS = "com.android.mms";//短信 public static final String HONOR_MMS= "com.hihonor.mms";//荣耀短信 public static final String MESSAGES = "com.google.android.apps.messaging";//信息 public static final String IN_CALL = "com.android.incallui";//来电 - /** * 发布通知 * @param sbn 状态栏通知 */ @Override public void onNotificationPosted(StatusBarNotification sbn) { switch (sbn.getPackageName()){ case MESSAGES: case MMS: case HONOR_MMS: Log.d(TAG,"收到短信"); break; case QQ: Log.d(TAG,"收到QQ消息"); break; case WX: Log.d(TAG,"收到微信消息"); break; case IN_CALL: Log.d(TAG,"收到来电"); break; default:break; } } /** * 通知已删除 * @param sbn 状态栏通知 */ @Override public void onNotificationRemoved(StatusBarNotification sbn) { switch (sbn.getPackageName()){ case MESSAGES: case MMS: case HONOR_MMS: Log.d(TAG,"移除短信"); break; case QQ: Log.d(TAG,"移除QQ消息"); break; case WX: Log.d(TAG,"移除微信消息"); break; case IN_CALL: Log.d(TAG,"移除来电"); break; default:break; } } /** * 监听断开 */ @Override public void onListenerDisconnected() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // 通知侦听器断开连接 - 请求重新绑定 requestRebind(new ComponentName(this, NotificationListenerService.class)); } } }
这个类继承了NotificationListenerService,里面里面几个方法,都已经注释过了,这里设置通知栏上应用的包名,由于国产厂商对于Android做了定制化,因此各个厂商的系统App软件的包名就不会是一致的,例如我用的是荣耀,那么我监听到的通知短信是com.hihonor.mms,来电是com.android.incallui。这个地方需要开发者自行去适配。不过QQ和微信这种App的包名是固定的,可以放心使用。
下面将这个服务注册在AndroidManifest.xml中。
<!--通知监听服务--> <service android:name=".NotifyService" android:enabled="true" android:label="测试通知服务" android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"> <intent-filter> <action android:name="android.service.notification.NotificationListenerService" /> </intent-filter> </service>
服务配置完成了,下面进行具体的打开服务操作。
三、打开通知服务监听
使用这个通知服务其实就是打开一个手机上应用的开关,效果上和打开蓝牙差不多,下面先写一个方法检查当前应用是否开启这个服务。方法代码如下:
/** * 是否启用通知监听服务 * @return */ public boolean isNLServiceEnabled() { Set<String> packageNames = NotificationManagerCompat.getEnabledListenerPackages(this); if (packageNames.contains(getPackageName())) { return true; } return false; }
这里还对应一个方法就是设置服务是否运行,如下:
/** * 切换通知监听器服务 * * @param enable */ public void toggleNotificationListenerService() { PackageManager pm = getPackageManager(); pm.setComponentEnabledSetting(new ComponentName(getApplicationContext(), NotifyService.class), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); pm.setComponentEnabledSetting(new ComponentName(getApplicationContext(), NotifyService.class), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); }
现在方法有了需要一个地方去触发,通过按钮来进行,在activity_main.xml添加一个按钮。
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="请求权限" android:onClick="requestPermission" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView" /> </androidx.constraintlayout.widget.ConstraintLayout>
在MainActivity中添加一个方法:
private static final int REQUEST_CODE = 9527; /** * 请求权限 * * @param view */ public void requestPermission(View view) { if (!isNLServiceEnabled()) { startActivityForResult(new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"), REQUEST_CODE); } else { showMsg("通知服务已开启"); toggleNotificationListenerService(true); } }
这个还有一个showMsg方法:
private void showMsg(String msg) { Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); }
然后是页面返回:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE) { if (isNLServiceEnabled()) { showMsg("通知服务已开启"); toggleNotificationListenerService(true); } else { showMsg("通知服务未开启"); toggleNotificationListenerService(false); } } }
下面就可以先运行一下:
现在就可以测试数据,这里建议你找一个朋友给你发消息,保持电脑上没有登录微信和QQ,然后手机上的微信和QQ保持后台运行就可以了,下面让你的朋友给你发QQ消息、微信消息。这是我这里测试的数据,控制打印出来:
QQ、微信、短信、来电都监听到了。四、页面显示消息类型
现在只是在NotifyService中可以打印出来,那么Activity并不知道,但是实际的UI操作又是在Activity里面,因此需要将消息传递到Activity,这种方式很多,我这里使用接口回调的方式来进行。下面新建一个接口,代码如下:
public interface NotifyListener { /** * 接收到通知栏消息 * @param type */ void onReceiveMessage(int type); /** * 移除掉通知栏消息 * @param type */ void onRemovedMessage(int type); }
然后再写一个NotifyHelper帮助类,用于实现接口的回调处理。
public class NotifyHelper { private static NotifyHelper instance; public static final int N_MESSAGE = 0; public static final int N_CALL = 1; public static final int N_QQ = 2; public static final int N_WX = 3; private NotifyListener notifyListener; public static NotifyHelper getInstance() { if (instance == null) { instance = new NotifyHelper(); } return instance; } /** * 收到消息 * @param type 消息类型 */ public void onReceive(int type) { if (notifyListener != null) { notifyListener.onReceiveMessage(type); } } /** * 移除消息 * @param type 消息类型 */ public void onRemoved(int type) { if (notifyListener != null) { notifyListener.onRemovedMessage(type); } } /** * 设置回调方法 * * @param notifyListener 通知监听 */ public void setNotifyListener(NotifyListener notifyListener) { this.notifyListener = notifyListener; } }
最后收到服务中收到通知进行调用。
移除通知进行调用
最后只要在MainActivity中实现接口。
这里实现接口,然后将收到的结果显示在TextView上,实现接口中的两个回调方法。/** * 收到通知 * @param type 通知类型 */ @Override public void onReceiveMessage(int type) { switch (type) { case N_MESSAGE: textView.setText("收到短信消息"); break; case N_CALL: textView.setText("收到来电消息"); break; case N_WX: textView.setText("收到微信消息"); break; case N_QQ: textView.setText("收到QQ消息"); break; default: break; } } /** * 移除通知 * @param type 通知类型 */ @Override public void onRemovedMessage(int type) { switch (type) { case N_MESSAGE: textView.setText("移除短信消息"); break; case N_CALL: textView.setText("移除来电消息"); break; case N_WX: textView.setText("移除微信消息"); break; case N_QQ: textView.setText("移除QQ消息"); break; default: break; } }
下面再运行一下:
可以看到,现在通过接口想消息类型的结果显示到页面上来了。五、页面显示消息内容、时间
现在的很多带屏幕的手环都做到了这一点,可以显示消息内容,这个说起来很高大上,实际上很简单,还是之前的那个地方,那个位置,为了更够更好的显示内容,我还是用代码来说明一下。
首先在NotifyListener增加接口中的方法。
/** * 接收到通知栏消息 * @param sbn */ void onReceiveMessage(StatusBarNotification sbn); /** * 移除掉通知栏消息 * @param sbn */ void onRemovedMessage(StatusBarNotification sbn);
与之前的方法中的参数不同,当然图方便也可以只用这个新增的,把之前的可以去掉,因为现在的这个拿到的信息要比之前多,只不过需要再对消息做进一步的处理。
接口方法写好了,在NotifyHelper中新增两个方法对刚才的接口方法进行调用。
/** * 收到消息 * @param sbn 状态栏通知 */ public void onReceive(StatusBarNotification sbn) { if(notifyListener != null) { notifyListener.onReceiveMessage(sbn); } } /** * 移除消息 * @param sbn 状态栏通知 */ public void onRemoved(StatusBarNotification sbn) { if (notifyListener != null) { notifyListener.onRemovedMessage(sbn); } }
这里和之前的接口方法如出一辙,最后就是在NotifyService中调用NotifyHelper中的两个方法即可。
最后只要在MainActivity中实现接口回调方法就可以了。
代码如下:/** * 收到通知 * * @param sbn 状态栏通知 */ @Override public void onReceiveMessage(StatusBarNotification sbn) { if (sbn.getNotification() == null) return; //消息内容 String msgContent = ""; if (sbn.getNotification().tickerText != null) { msgContent = sbn.getNotification().tickerText.toString(); } //消息时间 String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINESE).format(new Date(sbn.getPostTime())); textView.setText(String.format(Locale.getDefault(), "应用包名:%s\n消息内容:%s\n消息时间:%s\n", sbn.getPackageName(), msgContent, time)); } /** * 移除通知 * * @param sbn 状态栏通知 */ @Override public void onRemovedMessage(StatusBarNotification sbn) { textView.setText("通知移除"); }
运行一下:
这个图就说明了消息的内容,在通知栏上并不是所有通知都有内容的,例如手机屏幕录制是没有通知内容的,然后后面我收到一条QQ消息就会显示出消息内容,那么本篇文章就到这里了,山高水长,后会有期~六、源码
GitHub:NotifyListenerDemo
CSDN:NotifyListenerDemo.rar -
Android通知栏-Notification(通知消息)
2019-05-29 22:29:081.概述 当应用程序在后台运行,希望向用户发出一些提示学习,就需要借助Notification(通知)来实现。在发出一条通知后,手机最上方的状态栏会显示一个通知的图标,下拉状态栏后就可以...标准视图在Android中各... -
Android开发之获取通知栏的内容源码
2018-11-03 16:55:13Android开发之获取通知栏的内容更多查看我博客:https://blog.csdn.net/xiayiye5/article/details/83688396 -
Android通知栏介绍与适配总结
2017-09-14 10:40:51由于历史原因,Android在发布之...本文总结了Android通知栏的版本迭代过程,在通知栏开发过程中所遇到的各种各样的坑,以及一些解决技巧,特别的,对于大众期盼的Android 7.0的到来,通知栏又会发生怎样的改变呢?接下 -
Android通知的使用及设置
2019-05-31 00:49:12Android使用通知一、通知的简介二、通知的用法1.通知的基本用法2.通知的进阶用法3.通知的高级用法 一、通知的简介 通知(Notification)是Android系统中比较有特色的一个功能,当某个应用程序希望向用户发出提示... -
Android 通知栏自定义样式
2019-11-10 17:40:568.0系统的通知栏适配 在8.0之前我们通知栏的使用: notification = new NotificationCompat.Builder(mContext) .setWhen(System.currentTimeMillis()) .setSmallIcon(R.drawable.small_icon) ... -
android 通知设置选项怎么默认打开
2019-04-12 15:56:34!... !... 手机是小米手机 系统8.0,我截了2张图,一张是我自己的应用,一张是微信的应用,图中的几个选项我的默认都没有打开,为什么微信的都是默认打开的,怎么做的?最重要的是其他应用显示桌面图标角标都是打开的,... -
关于Android通知的浮动通知(横幅)不显示的解决方法
2019-11-25 00:28:27关于Android通知的浮动通知(横幅)不显示的解决方法 大家在学习Android的通知的时候,可能会遇到浮动通知不显示的问题. 下面给大家介绍初步的解决方案. 相信大家查询解决方案的时候,多少有了解如何修改代码解决,csdn的... -
Android 通知栏图标
2019-02-26 16:14:004、Android8.0 通知分渠道了,通知栏的图标显示也是setLargeIcon的值 5、36氪的App 在P10(M3F4)型号Android7.1.2 Api25的手机显示的是材料设计图片 透明+白色图片,但是在MI MAX Android7.0 api24 显示的确实... -
Android通知消息总结
2016-10-18 10:20:47Notification是一种具有全局效果的通知,它展示在屏幕的顶端,首先会表现为一个图标的形式,当用户向下滑动的时候,展示出通知具体的内容。 本文介绍了Notification的相关知识和使用的方法,最后展示通知的使用效果... -
Android 通知(关闭声音和震动)
2020-05-16 09:22:34参考博客:https://www.jianshu.com/p/b9a1975bc4b7 参考博客:... 1、 8.0版本以下 //单个设置 mBuilder.setVibrate(null); mBuilder.setVibrate(new long[]{0l}) mBuilder.setSound(null);...mBuil -
Android通知权限设置(8.0上下兼容)
2019-06-18 11:23:39记录开发中通知权限使用 public class NotificationAccess { private static final String TAG = "NotificationAccess"; public static final String ENABLED_NOTIFICATION_LISTENERS = "enabled_notification_... -
android系统通知栏提示消息
2015-06-24 19:32:03android设备在系统通知栏处提示有新消息,同时也有声音通知 -
Flutter 原生通信 (二) - Android通知Flutter
2019-02-14 16:42:56原生通信系列 1. Flutter 调用 Android 2. Android 通知 Flutter 3. Flutter 调用 iOS 4. iOS 通知 Flutter 项目地址 第二篇介绍的是原生通知 dart 开篇就是灵魂流程图,自己体会吧 -
Android 自定义通知栏 更新通知栏进度条
2014-10-29 12:01:17Android 实现自定义通知栏,并不断更新通知栏的进度条,模拟下载效果。 注:只是模拟下载进度,没有下载功能。 -
android通知栏的消息通知(Notification)
2017-03-19 10:44:56转载请注明出处:http://blog.csdn.net/xiaohao0724/article/details/63682146在...通知栏消息通知的使用步骤一般可以分为以下步骤: 1. 首先需要一个NotificationManager对通知进行管理 2. 为了兼容低版本使用v4包 -
Android通知的简单使用、摄像头和相册
2022-04-02 15:37:01Android 8.0 引入了通知渠道的概念 * 首先需要一个NotificationManager对通知进行管理,调用context的getSystemService()获取 * 此方法接收一个字符串参数用于确定获取系统的哪个服务,这里传入Context.... -
解决android 通知不显示问题
2019-08-13 22:46:17解决办法:android 8.0 在NotificationCompat.Builder()中添加了一个chanlId参数在写的时候添加上。 在每次使用通知时对系统版本进行判断(否则会报错)8.0及以上需要设好“channelId”(唯一与后面的Not... -
android NotificationListenerService监听通知栏(qq 微信 短信)
2017-09-04 16:08:15android NotificationListenerService 监听通知栏,android NotificationListenerService 监听通知栏 android NotificationListenerService 监听通知栏 -
Android 通知渠道Notification Channel
2019-01-11 13:54:39Android8.0也就是API26开始要求通知设置Channel,否则会报错 查看官方通知: 通知 在 Android 8.0 中,我们已重新设计通知,以便为管理通知行为和设置提供更轻松和更统一的方式。这些变更包括: Android ... -
Android通知Notification合并问题App的消息通知超过3条时会合并到一起
2019-04-06 11:52:38问题描述: 在Android 7.0以上的版本, 同一个App的消息通知超过3条时会合并到一起, 经过我对部分机型的测试, 目前只发现小米手机在点击合并到一起的消息时会将消息列表展开, 其他品牌都是启动App, 不能跳转到我们需要... -
Android通知Notification详解
2016-06-20 16:11:15Notification的使用大体步骤 ...更新与移除通知 设定提示响应 附录Notification的使用大体步骤:1、 获取状态通知栏管理 2、 实例化通知栏构造器 3、 设置NotificationCompat.Builder 4、 设置PendingIntent -
Android通知栏点击事件
2017-07-21 02:24:55最近在做一个混合开发项目,给本地通知栏发送消息,并且在点击通知栏时不去跳转到某一activity界面,而是通过cordova调用js事件。 大致可将这个问题分成三个部分来解决:1.给本地通知栏发送消息2.获取通知栏点击事件... -
Android通知(Notification)详细解读一——基本使用
2018-11-28 10:15:34Notification,是一种具有全局效果的通知,可以在系统的通知栏中显示。当 APP 向系统发出通知时,它将先以图标的形式显示在通知栏中。用户可以下拉通知栏查看通知的详细信息。通知栏和抽屉式通知栏均是由系统控制,... -
Android通知使用权(NotificationListenerService)的使用
2019-08-28 16:20:00简介 当下不少第三方安全APP都有消息...Android4.3后加入了通知使用权NotificationListenerService,就是说当你开发的APP拥有此权限后便可以监听当前系统的通知的变化,在Android4.4后还扩展了可以获取通知详情信...