NotificationListenerService sendBroadcast не работает?

Я стараюсь уже более 10 часов, и я не могу думать ни о чем другом. Я попробовал все возможные примеры в интернете, но безрезультатно.

У меня есть класс NotificationMonitor, расширяющий NotificationListenerService, и я хотел отправить сообщение из этого сервиса основной деятельности (и, возможно, другим действиям и службам в будущем), используя механизм Intent. Я отправляю код ниже:

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.testpackage.test">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        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=".NotificationMonitor"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
            <intent-filter>
                <action android:name="android.service.notification.NotificationListenerService" />
            </intent-filter>
        </service>
    </application>

</manifest>

MainActivity.java

public class MainActivity extends Activity {

    private TextView txtView;
    private NotificationReceiver nReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        txtView = (TextView) findViewById(R.id.textView);

        //create receiver
        nReceiver = new NotificationReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.testpackage.test.NOTIFICATION_MONITOR");
        registerReceiver(nReceiver,filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(nReceiver);
    }

    public void buttonClicked(View v){
        if(v.getId() == R.id.btnTestBroadcast){
            //send test intent without category
            Log.d("ActivityMain","Button clicked");
            Intent i = new Intent("com.testpackage.test.NOTIFICATION_MONITOR");
            sendBroadcast(i);
        }
    }

    class NotificationReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d("ActivityMain","Intent received: "+intent.getAction()+" has extra: "+intent.hasExtra("info"));
            if (intent.hasCategory("com.testpackage.test.TEST_CATEGORY")) {
                if (intent.hasExtra("info")) {
                    txtView.setText(intent.getStringExtra("info"));
                }
            }
        }
    }
}

NotificationMonitor.java

public class NotificationMonitor extends NotificationListenerService {

    private NotificationMonitorReceiver receiver;

    @Override
    public void onCreate() {
        super.onCreate();

        receiver = new NotificationMonitorReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.testpackage.test.NOTIFICATION_MONITOR");
        registerReceiver(receiver,filter);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver);
    }

    @Override
    public void onNotificationPosted(StatusBarNotification sbn) {
        //do something
        sendInfo("notification posted");
    }

    @Override
    public void onNotificationRemoved(StatusBarNotification sbn) {
        //do something
        sendInfo("notification removed");
    }

    @Override
    public void onListenerConnected() {
        //service created and listener connected
        Log.d("NM","Listener connected!");
        sendInfo("listener connected");
    }

    private void sendInfo(String info) {
        Log.d("NM", "sendInfo called!");
        Intent i = new Intent("com.testpackage.test.NOTIFICATION_MONITOR");
        i.addCategory("com.testpackage.test.TEST_CATEGORY");
        i.putExtra("info", info);
        sendBroadcast(i);
    }

    class NotificationMonitorReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            //no categories intents get replied
            Log.d("NM","Intent received: "+intent.getAction()+" has categories: "+(intent.getCategories()!=null));
            if (intent.getCategories() == null) {
                Intent i = new Intent("com.testpackage.test.NOTIFICATION_MONITOR");
                i.addCategory("com.testpackage.test.TEST_CATEGORY");
                sendBroadcast(i);
            }
        }
    }
}

После запуска этого приложения в режиме отладки, конечно, мне нужно снова включить разрешения уведомлений, поэтому, когда я вижу в logcat:

10-10 16:22:46.428 7330-7381/com.testpackage.test D/NM: Listener connected!
10-10 16:22:46.428 7330-7381/com.testpackage.test D/NM: sendInfo called!

ну, я должен получить трансляцию в своем заявлении, не так ли? После того, как я нажму кнопку:

10-10 16:22:57.607 7330-7330/com.testpackage.test D/ActivityMain: Button clicked
10-10 16:22:57.612 7330-7330/com.testpackage.test D/ActivityMain: Intent received: com.testpackage.test.NOTIFICATION_MONITOR has extra: false
10-10 16:22:57.619 7330-7330/com.testpackage.test D/NM: Intent received: com.testpackage.test.NOTIFICATION_MONITOR has categories: false

таким образом, Намерение правильно создано и отправлено из основного действия, получено обратно тем же действием и NotificationListenerService, не имеет категорий, поэтому должно получаться ответ, но ничего не происходит, когда sendInfo метод называется.

Пожалуйста, помогите, у меня нет других идей о том, что может быть не так.

редактировать: я тестировал с обычными службами и, конечно, трансляции работают просто отлично. Есть ли вероятность того, что вы просто не можете sendBroadcast из этого конкретного расширенного класса обслуживания?

1 ответ

Решение

Официально я дебил. Ответ: я не настроил Category фильтровать IntentFilter и именно поэтому я получил ноль правильно отправленных намерений от моего класса. Короче говоря, чтобы "исправить" эту ошибку, все, что нужно сделать, это добавить:

filter.addCategory("com.testpackage.test.TEST_CATEGORY");

и это все. Спасибо за Ваше внимание.

Другие вопросы по тегам