Подавлять уведомления от службы, если активность запущена

У меня есть Activity и Service, которые работают вместе в моем приложении. Я настроил службу как удаленный сервис (реализованный AIDL), чтобы он продолжал работать, даже если активность не видна.

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

Есть ли способ для Службы знать статус какой-либо конкретной деятельности? В частности, это связано с этим?

Обновлен с манифестом, чтобы устранить проблему с разрешением:

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.interact.listen.android.voicemail" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MyAppName" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".MyObjectDetails"/> <service android:enabled="true" android:name=".MyService" /> <receiver android:name=".MyReceiver"> <intent-filter> <action android:name="com.foo.bar.EVENT"/> </intent-filter> </receiver> </application> <uses-permission android:name="android.permission.INTERNET"></uses-permission> </manifest> 

Ошибка, которую я получаю в Logcat:

 09-17 15:33:17.881: WARN/ActivityManager(53): Permission Denial: receiving Intent { act=com.foo.bar.myobject.EVENT (has extras) } to ProcessRecord{43928b40 223:com.foo.bar.myobject/10022} (pid=223, uid=10022) requires com.foo.bar.myobject.EVENT due to sender com.foo.bar.myobject (uid 10022) 09-17 15:33:48.901: WARN/ActivityManager(53): Permission Denial: receiving Intent { act=com.foo.bar.myobject.EVENT (has extras) } to com.foo.bar.myobject requires com.foo.bar.myobject.EVENT due to sender com.foo.bar.myobject (uid 10022) 

Задача, которая отправляет трансляцию:

 @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); serviceHandler = new Handler(); serviceHandler.postDelayed(myTask, 100L); Log.d(TAG, "onStart()"); } class Task implements Runnable { public void run() { Log.i(TAG, "Getting myObjects..."); getMyObjects(); Bundle bundle = new Bundle(); bundle.putLongArray("ids", getIdsToUpdate()); Intent i = new Intent(); i.setAction(UPDATE_ACTION_STRING); i.putExtras(bundle); sendOrderedBroadcast(i, UPDATE_ACTION_STRING); serviceHandler.postDelayed(this, 30000L); } } } 

Есть ли способ для Службы знать статус какой-либо конкретной деятельности? В частности, это связано с этим?

Вы можете реализовать какую-то систему обратного вызова.

Но есть более чистый способ решить проблему. Используйте упорядоченную трансляцию. У этого мероприятия есть приемник с высоким приоритетом; Есть логика повышения уведомления в приемнике с низким приоритетом. Попросите приемника активности abortBroadcast() чтобы предотвратить уведомление. У меня есть сообщение в блоге об этой технике. Используйте шину событий: EventBus greenrobot, LocalBroadcastManager , Rx-основанную шину событий или даже MutableLiveData . Отправьте сообщение службе на автобус. Регистр слоя пользовательского интерфейса для событий на шине, когда пользовательский интерфейс находится на переднем плане. Попросите сервис повысить Notification если никто не заберет мероприятие, размещенное на автобусе.