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 von LocalBroadcastManager
,
beschränkt die Übertragung von Intent
-Objekten auf Komponenten in Ihrer eigenen App.
Status von JobIntentService melden
Um den Status einer Arbeitsanfrage in einem
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 die Intent
an alle Komponenten in Ihrer Anwendung gesendet, die sich für den Empfang registriert haben.
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
Wenn du gestreamte Intent
-Objekte empfangen möchtest, verwende eine Unterklasse 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 einzelnes BroadcastReceiver
kann mehrere Arten von Intent
-Objekten für die Übertragung verarbeiten, die jeweils eine eigene Aktion haben. Mit dieser Funktion können Sie für jede Aktion einen anderen Code ausführen, ohne für jede Aktion eine separate BroadcastReceiver
definieren zu müssen. 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
. Der BroadcastReceiver
für einen Activity
empfängt und verarbeitet Intent
-Objekte auch dann, wenn Ihre App im Hintergrund ausgeführt wird, zwingt sie aber nicht dazu, in den Vordergrund zu wechseln. Wenn Sie den Nutzer über ein Ereignis informieren möchten, das im Hintergrund stattgefunden hat, während Ihre App nicht sichtbar war, verwenden Sie ein Notification
. Nie starten:
Activity
als Antwort auf eine eingehende Nachricht an alle
Intent
.