Z tego przewodnika dowiesz się, jak raportować stan żądania roboczego uruchomionego w usłudze w tle
do komponentu, który wysłał żądanie. Pozwala to na przykład informować o stanie
żądania w interfejsie obiektu Activity
. Zalecany sposób wysyłania
stanu odbierania to użycie polecenia LocalBroadcastManager
, które
ogranicza przesyłanie obiektów Intent
do komponentów Twojej aplikacji.
Raportowanie stanu z usługi JobIntentService
Aby wysłać stan prośby o pracę w
JobIntentService
do innego
najpierw utwórz element Intent
zawierający stan
dane rozszerzone. Opcjonalnie możesz do tego pola dodać działanie i identyfikator URI danych
Intent
Następnie wyślij Intent
, dzwoniąc pod numer
LocalBroadcastManager.sendBroadcast()
Powoduje to wysłanie Intent
do dowolnego
w aplikacji, która została zarejestrowana jako odbierająca.
Aby uzyskać instancję LocalBroadcastManager
, wywołaj funkcję getInstance()
.
Na przykład:
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); ... }
Następny krok to obsługa przychodzących obiektów Intent
transmisji w
komponent, który wysłał pierwotne żądanie pracy.
Odbieraj komunikaty o stanie z JobIntentService
Aby odbierać transmitowane obiekty Intent
, użyj podklasy
BroadcastReceiver
W podklasie zaimplementuj funkcję
BroadcastReceiver.onReceive()
oddzwonienie
, która jest wywoływana przez LocalBroadcastManager
po otrzymaniu
Intent
. LocalBroadcastManager
przekazuje przychodzące Intent
do
BroadcastReceiver.onReceive()
Na przykład:
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. */ ... } }
Po zdefiniowaniu BroadcastReceiver
możesz zdefiniować dla niego filtry dopasowujące się do określonych działań, kategorii i danych. Aby to zrobić, utwórz
IntentFilter
. Ten pierwszy fragment kodu pokazuje, jak zdefiniować filtr:
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"); ...
Aby zarejestrować BroadcastReceiver
i
IntentFilter
z systemem, pobierz instancję
LocalBroadcastManager
z nazwą
registerReceiver()
. Z tego następnego fragmentu dowiesz się, jak zarejestrować BroadcastReceiver
oraz 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); ...
Pojedynczy obiekt BroadcastReceiver
może obsługiwać więcej niż jeden typ transmisji.
Intent
obiekt, każdy z własnym działaniem. Ta funkcja umożliwia:
dla każdego działania musi być uruchamiany inny kod, bez konieczności definiowania
BroadcastReceiver
dla każdego działania. Aby zdefiniować kolejną
IntentFilter
za taki sam
BroadcastReceiver
, utwórz IntentFilter
i
Powtórz połączenie do
registerReceiver()
Na przykład:
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);
Wysłanie transmisji Intent
nie powoduje rozpoczęcia ani wznawiania
Activity
BroadcastReceiver
dla
Activity
odbiera i przetwarza Intent
obiektów, nawet jeśli
gdy aplikacja działa w tle, ale nie wymusza jej uruchomienia na pierwszym planie. Jeśli
chcesz powiadamiać użytkownika o zdarzeniu, które miało miejsce w tle, gdy aplikacja nie była
widoczny, użyj pola Notification
. Nigdy nie rozpoczynaj
Activity
w odpowiedzi na przychodzącą transmisję
Intent