Android通知监听服务、NotificationListenerService使⽤⽅式。。。NotificationListenerService使⽤
前⾔
今天是七⼣,深圳⼜在下⾬,庆幸的是单⾝狗不⽤出门,苦涩。NotificationListenerService 通知监听服务,就是监听⼿机上的⼴播通知,这个在纯App开发中⽤的⽐较少,但是在智能穿戴领域⽤的很多,⽐如我有⼀个智能⼿表,然后有⼀个配套的App应⽤,有时候在上班路上,⼿机放在⼝袋⾥,要接受到⼿机上的通知消息,例如QQ、、来电、短信等。智能⼿表上显⽰有新消息,如果⼿表上有屏幕的话,还能显⽰消息的内容。这就很Nice了不是吗?
先看看效果图:
正⽂
下⾯进⼊正式的使⽤,我先说⼀下使⽤的思路,NotificationListenerService 是⼀个服务,服务更多的是在后台运⾏,其次由于这个需要进⾏通知监听,会涉及到⼀个动态权限请求。第三就是⼿机上是否安装了、QQ等应⽤。
⼀、配置项⽬
新建项⽬NotifyListenerDemo。
主要是项⽬依赖库的添加,打开⼯程的adle的repositories{}闭包下添加依赖库:
maven {url "jitpack.io"}
然后在app模块的adle中添加依赖:
//简单⼯具类库
implementation 'com.github.lilongweidev:EasyLibrary:1.0.4'
然后Sync,同步项⽬添加依赖库。
⼆、通知监听服务
创建⼀个服务,然后将服务注册在l中。创建⼀个NotifyService类,⾥⾯的代码如下:public class NotifyService extends NotificationListenerService {
public static final String TAG ="NotifyService";
public static final String QQ ="bileqq";//qq信息
public static final String WX ="";//信息
public static final String MMS ="s";//短信
public static final String HONOR_MMS="s";//荣耀短信
public static final String MESSAGES ="le.ssaging";//信息
public static final String IN_CALL ="com.android.incallui";//来电 -
/**
* 发布通知
* @param sbn 状态栏通知
*/
@Override
public void onNotificationPosted(StatusBarNotification sbn){
PackageName()){
PackageName()){
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){
PackageName()){
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软件的包名就不会是⼀致的,例如我⽤的是荣耀,那么我监听到的通知短信是
s,来电是com.android.incallui。这个地⽅需要开发者⾃⾏去适配。不过QQ和这种App的包名是固定的,可以放⼼使⽤。
下⾯将这个服务注册在l中。
<!--通知监听服务-->
<service
name=".NotifyService"
enabled="true"
label="测试通知服务"
permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
<intent-filter>
<action name="ification.NotificationListenerService"/>
</intent-filter>
</service>
服务配置完成了,下⾯进⾏具体的打开服务操作。
三、打开通知服务监听
使⽤这个通知服务其实就是打开⼀个⼿机上应⽤的开关,效果上和打开蓝⽛差不多,下⾯先写⼀个⽅法检查当前应⽤是否开启这个服务。⽅法代码如下:
/**
* 是否启⽤通知监听服务
* @return
*/92油价今天多少
public boolean isNLServiceEnabled(){
Set<String> packageNames = EnabledListenerPackages(this);
ains(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);
}
现在⽅法有了需要⼀个地⽅去触发,通过按钮来进⾏,在l添加⼀个按钮。
<?xml version="1.0" encoding="utf-8"?>
&straintlayout.widget.ConstraintLayout android="schemas.android/apk/res/android"
app="schemas.android/apk/res-auto"
tools="schemas.android/tools"
layout_width="match_parent"
layout_height="match_parent"
context=".MainActivity">
<TextView
id="@+id/textView"
layout_width="wrap_content"
layout_height="wrap_content"
text="Hello World!"
layout_constraintBottom_toBottomOf="parent"
layout_constraintLeft_toLeftOf="parent"
layout_constraintRight_toRightOf="parent"
layout_constraintTop_toTopOf="parent"/>
<Button
layout_width="wrap_content"
layout_height="wrap_content"
text="请求权限"
onClick="requestPermission"
layout_constraintBottom_toBottomOf="parent"
layout_constraintEnd_toEndOf="parent"
layout_constraintStart_toStartOf="parent"
layout_constraintTop_toBottomOf="@+id/textView"/>
</straintlayout.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);
qq消息}
}
这个还有⼀个showMsg⽅法:
private void showMsg(String msg){
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}
然后是页⾯返回:
@Override
protected void onActivityResult(int requestCode,int resultCode, Intent data){
if(requestCode == REQUEST_CODE){
if(isNLServiceEnabled()){
showMsg("通知服务已开启");
toggleNotificationListenerService(true);
}else{
showMsg("通知服务未开启");
toggleNotificationListenerService(false);
}
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论