Android 通知监听器服务自行启动

问题描述 投票:0回答:2

我正在尝试制作一个应用程序来获取所有通知并完成任务。但我的问题是 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();
}
}

AndroidManifest.xml

<?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>
java android service
2个回答
3
投票

这是预期的行为。

当您授予通知访问权限(或重启手机)时,SYSTEM 将绑定到您的

NotificationListenerService
,以便发送通知数据。

如果你覆盖你的服务

onBind
方法并记录它,你会看到它被调用。


0
投票

这可能有点晚了,但对于其他偶然发现此问题的人来说,正确的方法是使用

PackageManager.setComponentEnabledSetting()
来切换是否启用
NotificationListenerService
。如果需要,在清单中将
android:enabled
设置为
false
也是一个好主意,这样它开始时处于禁用状态,直到您准备好启用它。

© www.soinside.com 2019 - 2024. All rights reserved.