我正在尝试制作一个应用程序来获取所有通知并完成任务。但我的问题是 NotifycationListener 服务自动启动,即使我没有调用启动服务。一旦我允许在我的手机上访问应用程序通知,它就会开始。所以服务以某种方式开始,我无法停止它。我已经尝试过它们正常工作的简单服务。但是这个带有 NotificationListener 的真的很痛苦。我只想通过我的命令启动和停止此服务。
服务在我允许时自行启动(截图)
package com.example.alperen.nservice2;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
Button startB,stopB;
Intent intent;
int count=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startB=(Button)findViewById(R.id.button);
stopB=(Button)findViewById(R.id.button2);
startB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
intent = new Intent(MainActivity.this,MyService.class);
startService(intent);
}
});
stopB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
stopService(intent);
}
});
}
}
package com.example.alperen.nservice2;
import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.support.annotation.Nullable;
import android.util.Log;
import android.widget.Toast;
public class MyService extends NotificationListenerService{
@Override
public void onCreate() {
super.onCreate();
System.out.println("********* SERVICE STARTED ***********");
}
@Override
public void onNotificationPosted(StatusBarNotification sbn) {
System.out.println("***** notification *****");
String pack,title,text;
Bundle extras;
try {
pack = sbn.getPackageName();
extras = sbn.getNotification().extras;
title = extras.getString("android.title").toString();
text = extras.getCharSequence("android.text").toString();
}catch (Exception e)
{
System.out.println("**** HATA NOTIFYSERVICE CLASS ****");
pack="empty1";
title="empty1";
text="empty1";
System.out.println("**** "+pack+" ****");
}
Log.i("Package",pack);
Log.i("Title",title);
Log.i("Text",text);
Toast.makeText(this,"title: "+title+" text: "+text,Toast.LENGTH_LONG).show();
}
@Override
public void onDestroy() {
System.out.println("***** destroyed *****");
super.onDestroy();
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.alperen.nservice2">
<uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"
tools:ignore="ProtectedPermissions" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".MyService"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
<intent-filter>
<action android:name="android.service.notification.NotificationListenerService" />
</intent-filter>
></service>
</application>
棘手的部分在清单中。当我删除 intent-filter 部分并运行应用程序时。它不想再访问通知,也不会自行启动。我可以使用按钮从 MainActivity 启动和停止服务。但是这次应用程序没有收到通知。
// just delete this lines
<intent-filter>
<action android:name="android.service.notification.NotificationListenerService" />
</intent-filter>
这是预期的行为。
当您授予通知访问权限(或重启手机)时,SYSTEM 将绑定到您的
NotificationListenerService
,以便发送通知数据。
如果你覆盖你的服务
onBind
方法并记录它,你会看到它被调用。
这可能有点晚了,但对于其他偶然发现此问题的人来说,正确的方法是使用
PackageManager.setComponentEnabledSetting()
来切换是否启用 NotificationListenerService
。如果需要,在清单中将 android:enabled
设置为 false
也是一个好主意,这样它开始时处于禁用状态,直到您准备好启用它。