2010-09-16 13 views
6

Ich habe eine Aktivität und einen Dienst, die in meiner Anwendung zusammenarbeiten. Ich habe den Dienst als Remote-Dienst konfiguriert (AIDL implementiert), so dass er auch dann ausgeführt wird, wenn die Aktivität nicht sichtbar ist.Unterdrücken von Benachrichtigungen von einem Dienst, wenn Aktivität ausgeführt wird

Der Dienst ist verantwortlich für die Abfrage eines Servers nach Daten und das Senden von Warnmeldungen, wenn bestimmte Kriterien erfüllt sind. Ich möchte nicht, dass der Dienst diese Benachrichtigungen sendet, wenn die Aktivität sichtbar ist.

Gibt es eine Möglichkeit für den Dienst, den Status einer bestimmten Aktivität zu kennen? Besonders eine Aktivität, die daran gebunden ist?

mit manifester aktualisiert Berechtigungsproblem zu beheben:

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

Der Fehler ich in Logcat bekommen:

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) 

Aufgabe, die Sendung sendet:

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

Antwort

8

Gibt es einen Weg für den Service? e um den Status einer bestimmten Aktivität zu kennen? Besonders eine Aktivität, die ist daran gebunden?

Sie können eine Art Callback-System implementieren.

Aber es gibt einen saubereren Weg, um das Problem zu lösen. Verwenden Sie eine georderte Sendung. Die Aktivität einen Empfänger mit hoher Priorität haben; Die Raise-A-Notification-Logik muss in einem Empfänger mit niedriger Priorität sein. Lassen Sie den Empfänger der Aktivität abortBroadcast() anrufen, um die Benachrichtigung zu verhindern. Ich habe eine blog post über die Technik. Verwenden Sie einen Event-Bus: greenrobot's EventBus, LocalBroadcastManager, ein Rx-basierter Event-Bus oder sogar ein MutableLiveData. Lassen Sie den Dienst eine Nachricht an den Bus senden. Lassen Sie die UI-Schicht für Ereignisse auf dem Bus registrieren, wenn die Benutzeroberfläche im Vordergrund ist. Lassen Sie den Service einen Notification Raise erheben, wenn niemand die Veranstaltung auf dem Bus abholt.

+0

Dies ist perfekt für das, was ich versuche zu tun, wie Sie in Ihrem Blog-Post verwiesen. Ich bin auf ein Problem gestoßen, bevor ich denke, dass alles funktioniert. Mir wird gesagt, dass eine Erlaubnisverweigerung grundsätzlich meine Aktivität und meinen Broadcast-Empfänger davon abhält, die Absicht zu erhalten. Ich verwende nur eine Erlaubnis (INTERNET) in meinem Manifest (aktualisiert die Frage damit). Warum bekomme ich das? – twilbrand

+0

@twilbrand: Ich habe keine Ahnung. Wie sendest du die Sendung? – CommonsWare

+0

Von meinem Remote-Service. Ich habe eine Aufgabe, die alle 30 Sekunden ausgeführt wird. Ich habe den Code zu der Frage hinzugefügt. – twilbrand

Verwandte Themen