2010-09-16 10 views
6

Tengo una actividad y un servicio que funcionan en conjunto en mi aplicación. Configuré el servicio como un servicio remoto (AIDL implementado) para que siga ejecutándose incluso cuando la actividad no esté visible.Suprimir las notificaciones de un servicio si la actividad se está ejecutando

El servicio es responsable de sondear un servidor de datos y enviar notificaciones de alerta cuando se cumplen ciertos criterios. No deseo que el Servicio envíe estas notificaciones cuando la Actividad esté visible.

¿Hay alguna manera de que el Servicio conozca el estado de una actividad en particular? En particular, una actividad que está vinculada a ella?

actualizado con manifiesta para solucionar problema de permisos:

<?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> 

El error que estoy recibiendo en 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) 

de tareas que envía la emisión:

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

Respuesta

8

¿Hay alguna manera para el Servicio? e para conocer el estado de cualquier actividad en particular? En particular, una actividad que está vinculada a ella?

Puede implementar algún tipo de sistema de devolución de llamada.

Pero hay una forma más clara de resolver el problema. Usa una transmisión ordenada. Haga que la actividad tenga un receptor de alta prioridad; tener la lógica de raise-a-notification en un receptor de baja prioridad. Haga que el receptor de la actividad llame al abortBroadcast() para evitar la notificación. Tengo un blog post sobre la técnica. Utilice un bus de eventos: greenrobot's EventBus, LocalBroadcastManager, un bus de eventos basado en Rx o incluso un MutableLiveData. Haga que el servicio publique un mensaje al autobús. Haga que la capa de la interfaz de usuario se registre para eventos en el bus cuando la interfaz de usuario está en primer plano. Haga que el servicio eleve un Notification si nadie recoge el evento colocado en el autobús.

+0

Esto es perfecto para lo que estoy tratando de hacer, como lo mencionó en su publicación de blog. Me encontré con un problema antes de pensar que todo funcionará. Me están diciendo que una denegación de permiso básicamente impide mi actividad y que mi receptor de difusión no reciba la intención. Solo uso un permiso (INTERNET) en mi manifiesto (actualicé la pregunta con él). ¿Por qué estoy obteniendo esto? – twilbrand

+0

@twilbrand: No tengo idea. ¿Cómo estás enviando la transmisión? – CommonsWare

+0

Desde mi servicio remoto. Tengo una tarea que se ejecuta cada 30 segundos. He agregado el código a la pregunta. – twilbrand

Cuestiones relacionadas