Pending intent

Dziś, zgodnie z zapowiedzią, parę słów o metodzie onUpdate() widżetu, który generuje losową liczbę w ustalonych odstępach czasu lub po wciśnięciu przycisku Refresh

public class MainWidget extends AppWidgetProvider {
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

        for (int widgetId : allWidgetIds) {
            int number = (new Random().nextInt(100));
            RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
                    R.layout.main_widget);
            remoteViews.setTextViewText(R.id.update, String.valueOf(number));
            Log.w("WidgetExample", String.valueOf(number));
            Intent intent = new Intent(context, MainWidget.class);
            intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
            intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
            remoteViews.setOnClickPendingIntent(R.id.actionButton, pendingIntent);
            appWidgetManager.updateAppWidget(widgetId, remoteViews);
        }
    }
}

W metodzie onUpdate(), w pętli for, przechodzimy przez id wszystkich widżetów, które są zdefiniowane przez klasę MainWidget . Dzięki temu, jeśli użytkownik stworzy więcej instancji widżetu MainWidget, wszystkie one zostaną uaktualnione.W tej metodzie są zdefiniowane dwie rzeczy:

  1. Uaktualnienie zawartości pola tekstowego, za który odpowiadają: remoteViews.setTextViewText(), updateAppWidget()
  2.  Przekazanie intencji, która ma wywołać metodę onUpdate(),, po wciśnięciu przycisku Refresh

Pierwsza część jest raczej straightforward. Do wykonania drugiej, wykorzystujemy klasę PendingIntent. Obiekty z tej klasy to odroczone w czasie intencje, które można przekazać do innych aplikacji, dając tym aplikacjom prawo do wykonania wskazanych przez te intencje akcji. Aby utworzyć obiekt należący do tej klasy, trzeba wywołac jedną z  następującyc metod:

getActivity(Context, int, Intent, int), getActivities(Context, int, Intent[], int), getBroadcast(Context, int, Intent, int)getService(Context, int, Intent, int)

Ponieważ intencję chcemy wysłać do wszystkich widżetów MainWidget, tworzymy ją przez metodę getBroadcast(Context context, int requestCode, Intent intent, int flags).

Argumenty tej metody to kolejno:

1. kontekst, w którym komunikaty mają zostać rozesłane

2. kod żądania

3. intencja, która ma zostać rozesłana – w naszym przypadku to wysłanie komunikatu pora zaktualizować widżet do widżetów, których id znajduje się w liście appWidgetIds:

  Intent intent = new Intent(context, MainWidget.class);
  intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
  intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);

 

4. jedna z dostępnych flag, w naszym przypadku jest nią FLAG_UPDATE_CURRENT, która mówi: jeśli dany obiekt PendingIntent już istnieje, zostanie on utrzymany, ale dane przekazywane w intencji, zostaną uaktualnione (w naszym przypadku, jest to lista id wszystkich widżetów MainWidget)

Metoda setOnClickPendingIntent()  umożliwia przypisanie obiektu PendingIntent do elementu interfejsu, po którego wciśnięciu rozesłana zostanie odpowiednia intencja.

 

 

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s