Android Notification Listener Service自行启动

时间:2018-07-22 20:25:45

标签: java android service

我正在尝试制作一个能够获取所有通知并执行任务的应用程序。但是我的问题是,即使我没有调用启动服务,NotifycationListener服务也会自动启动。只要我允许在手机上访问应用程序通知,它就会开始。所以服务以某种方式启动,我无法停止。我已经尝试了简单的服务,它们可以正常工作。但是使用NotificationListener进行操作确实很痛苦。我只想通过我的命令启动和停止此服务。

当我允许此操作(屏幕截图)时,服务会自行启动

enter image description here

MainActivity

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);
        }
    });

}
}

MyService类

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>

棘手的部分在清单中。当我删除意图过滤器部分并运行应用程序时。它不再希望通知访问,它本身也不启动。我可以使用按钮从MainActivity启动和停止服务。但是这次应用没有收到通知。

            // just delete this lines
            <intent-filter>
            <action android:name="android.service.notification.NotificationListenerService" />
        </intent-filter>

1 个答案:

答案 0 :(得分:1)

这是预期的行为。

当您授予通知访问权限(或重新启动电话)时,SYSTEM将绑定到您的NotificationListenerService以便发送通知数据。

如果您重写服务onBind方法并将其记录下来,则会看到它正在被调用。