2010-09-16 2 views
6

У меня есть вид деятельности и службы, которые работают вместе в моем приложении. Я настроил службу как удаленную службу (реализованную 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); 
     } 
    } 
} 

ответ

8

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

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

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

+0

Это прекрасно для того, что я пытаюсь сделать, как вы указали в своем сообщении в блоге. Я столкнулся с одним вопросом, прежде чем я думаю, что все это сработает. Мне говорят, что отказ в разрешении в основном мешает моей деятельности, и мой вещательный приемник получает намерение. Я использую только одно разрешение (ИНТЕРНЕТ) в своем манифесте (обновляю вопрос с ним). Почему я получаю это? – twilbrand

+0

@twilbrand: Я понятия не имею. Как вы отправляете трансляцию? – CommonsWare

+0

От моего удаленного сервиса. У меня есть задача, которая запускается каждые 30 секунд. Я добавил код к вопросу. – twilbrand

Смежные вопросы