In diesem Leitfaden erfahren Sie, wie Sie den Status einer Arbeitsanfrage melden, die in einem Hintergrunddienst ausgeführt wird
an die Komponente, die die Anfrage gesendet hat. So können Sie beispielsweise den Status
die Anfrage in der UI eines Activity
-Objekts. Die empfohlene Methode zum Senden und
ist die Verwendung eines LocalBroadcastManager
, der
beschränkt die Übertragung von Intent
-Objekten auf Komponenten in Ihrer eigenen App.
Status aus einem JobIntentService melden
Um den Status einer Arbeitsanfrage
Von JobIntentService
in anderes Netzwerk
erstellen Sie zunächst eine Intent
, die den Status
erweiterten Daten. Optional können Sie diesem Feld eine Aktion und einen Daten-URI hinzufügen.
Intent
Senden Sie als Nächstes die Intent
, indem Sie
LocalBroadcastManager.sendBroadcast()
. Dadurch wird Intent
an alle
Komponente in Ihrer Anwendung, die für den Empfang registriert hat.
Um eine Instanz von LocalBroadcastManager
zu erhalten, rufen Sie
getInstance()
.
Beispiel:
Kotlin
... // Defines a custom Intent action const val BROADCAST_ACTION = "com.example.android.threadsample.BROADCAST" ... // Defines the key for the status "extra" in an Intent const val EXTENDED_DATA_STATUS = "com.example.android.threadsample.STATUS" ... class RSSPullService : JobIntentService() { ... /* * Creates a new Intent containing a Uri object * BROADCAST_ACTION is a custom Intent action */ val localIntent = Intent(BROADCAST_ACTION).apply { // Puts the status into the Intent putExtra(EXTENDED_DATA_STATUS, status) } // Broadcasts the Intent to receivers in this app. LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent) ... }
Java
public final class Constants { ... // Defines a custom Intent action public static final String BROADCAST_ACTION = "com.example.android.threadsample.BROADCAST"; ... // Defines the key for the status "extra" in an Intent public static final String EXTENDED_DATA_STATUS = "com.example.android.threadsample.STATUS"; ... } public class RSSPullService extends JobIntentService { ... /* * Creates a new Intent containing a Uri object * BROADCAST_ACTION is a custom Intent action */ Intent localIntent = new Intent(Constants.BROADCAST_ACTION) // Puts the status into the Intent .putExtra(Constants.EXTENDED_DATA_STATUS, status); // Broadcasts the Intent to receivers in this app. LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent); ... }
Der nächste Schritt besteht darin, die eingehenden Broadcast-Intent
-Objekte in
die Komponente, die die ursprüngliche Arbeitsanfrage gesendet hat.
Status-Broadcasts von einem JobIntentService empfangen
Um Intent
-Broadcast-Objekte zu empfangen, verwenden Sie die abgeleitete Klasse von
BroadcastReceiver
. Implementieren Sie in der abgeleiteten Klasse die Methode
BroadcastReceiver.onReceive()
-Callback
, die LocalBroadcastManager
beim Empfangen von
Intent
. LocalBroadcastManager
übergibt die eingehenden Intent
an
BroadcastReceiver.onReceive()
Beispiel:
Kotlin
// Broadcast receiver for receiving status updates from the IntentService. private class DownloadStateReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { ... /* * Handle Intents here. */ ... } }
Java
// Broadcast receiver for receiving status updates from the IntentService. private class DownloadStateReceiver extends BroadcastReceiver { // Called when the BroadcastReceiver gets an Intent it's registered to receive @Override public void onReceive(Context context, Intent intent) { ... /* * Handle Intents here. */ ... } }
Nachdem Sie die BroadcastReceiver
definiert haben, können Sie Filter definieren
die mit bestimmten Aktionen, Kategorien und Daten übereinstimmen. Erstellen Sie dazu
ein IntentFilter
. Im ersten Snippet sehen Sie, wie der Filter definiert wird:
Kotlin
// Class that displays photos class DisplayActivity : FragmentActivity() { ... override fun onCreate(savedInstanceState: Bundle?) { ... super.onCreate(savedInstanceState) ... // The filter's action is BROADCAST_ACTION var statusIntentFilter = IntentFilter(BROADCAST_ACTION).apply { // Adds a data filter for the HTTP scheme addDataScheme("http") } ...
Java
// Class that displays photos public class DisplayActivity extends FragmentActivity { ... public void onCreate(Bundle stateBundle) { ... super.onCreate(stateBundle); ... // The filter's action is BROADCAST_ACTION IntentFilter statusIntentFilter = new IntentFilter( Constants.BROADCAST_ACTION); // Adds a data filter for the HTTP scheme statusIntentFilter.addDataScheme("http"); ...
Um BroadcastReceiver
und den
IntentFilter
mit dem System, rufen Sie eine Instanz von
LocalBroadcastManager
und rufen Sie
registerReceiver()
. Dieses nächste Snippet zeigt, wie BroadcastReceiver
registriert wird
und IntentFilter
:
Kotlin
// Instantiates a new DownloadStateReceiver val downloadStateReceiver = DownloadStateReceiver() // Registers the DownloadStateReceiver and its intent filters LocalBroadcastManager.getInstance(this) .registerReceiver(downloadStateReceiver, statusIntentFilter) ...
Java
// Instantiates a new DownloadStateReceiver DownloadStateReceiver downloadStateReceiver = new DownloadStateReceiver(); // Registers the DownloadStateReceiver and its intent filters LocalBroadcastManager.getInstance(this).registerReceiver( downloadStateReceiver, statusIntentFilter); ...
Ein einzelner BroadcastReceiver
kann mehr als einen Broadcast-Typ verarbeiten
Intent
-Objekt mit jeweils eigener Aktion. Mit dieser Funktion können Sie
unterschiedlichen Code für jede Aktion ausführen, ohne eine separate
BroadcastReceiver
für jede Aktion. Um eine weitere
Dasselbe gilt für IntentFilter
BroadcastReceiver
, erstellen Sie die IntentFilter
und
wiederhole den Anruf bei
registerReceiver()
.
Beispiel:
Kotlin
/* * Instantiates a new action filter. * No data filter is needed. */ statusIntentFilter = IntentFilter(ACTION_ZOOM_IMAGE) // Registers the receiver with the new filter LocalBroadcastManager.getInstance(this) .registerReceiver(downloadStateReceiver, statusIntentFilter)
Java
/* * Instantiates a new action filter. * No data filter is needed. */ statusIntentFilter = new IntentFilter(Constants.ACTION_ZOOM_IMAGE); // Registers the receiver with the new filter LocalBroadcastManager.getInstance(this).registerReceiver( downloadStateReceiver, statusIntentFilter);
Beim Senden einer Nachricht an alle Intent
wird ein
Activity
. Die BroadcastReceiver
für ein
Activity
empfängt und verarbeitet Intent
-Objekte, auch
Ihre App wird im Hintergrund ausgeführt, ohne dass sie den Vordergrund erzwingt. Wenn Sie
Nutzer über ein Ereignis informieren möchten, das im Hintergrund stattgefunden hat, während Ihre App
sichtbar ist, verwenden Sie Notification
. Nie starten:
Activity
als Antwort auf eine eingehende Nachricht an alle
Intent
.