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);
}
}
}
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
@twilbrand: Ich habe keine Ahnung. Wie sendest du die Sendung? – CommonsWare
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