Usługi

Dziś o komponencie aplikacji, który umożliwia wykonowynanie operacji w tle, czyli o usługach. Dlaczego? Dlatego, że za aktualizację widżetu może odpowiadać usługa.  Wtedy nie musimy się martwić, że AppWidgetProvider zostanie zamknięty z powodu błędu  Application Not Responding (ANR) .

Usługi nie udostępniają interfejsu użytkownika. Są one uruchomiane przez inny komponenty aplikacji (np AppWidgetProvider) i działają dopóki nie zostaną explicite zakończone, nawet po zatrzymaniu aplikacji.

Usługi nie są osobnymi procesami ani wątkami – działają w głównym wątku naszych aplikacji. Dzięki usługom:

  1. możemy powiedzieć systemowi: teraz zacznij robić coś tle,   wywołując metodę: Context.startService()
  2. możemy udostępniać funkcjonalności danej aplikacji innym aplikacjom wywołując metodę: Context.bindService()

W widżecie Losowy Fakt z Wikipedii, wykorzystamy pierwszą możliwość. Dlatego w metodzie onUpdate()  wywołamy metodę  startService(), przekazując jej odpowiednią intencję.

public void onUpdate(Context context, AppWidgetManager appWidgetManager,
                         int[] appWidgetIds) {

    ComponentName thisWidget = new ComponentName(context,
                MainWidget.class);
    int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
    Intent intent = new Intent(context.getApplicationContext(),
                OnUpdateService.class);
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds);
    context.startService(intent);

}

Po wywołaniu tej metody automatycznie wywoływana jest metoda onStart(Intent, int,int),która jako argument przyjmuje:

  • intencję przekazaną w startService()
  • liczbę całkowitą odpowiedającą identyfikatorowi żądania.

W kodzie metody onStart() w klasie onUpdateService (która rozszerza klasę Service) zaimplementowana jest logika uaktualniania widzętu, która poprzednio zawarta była w metodzie onUpdate()

public void onStart(Intent intent, int startId) {
    final AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this
            .getApplicationContext());
    int[] allWidgetIds = intent
            .getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);
    final String url = getRandomUrlForDate();
    Log.w("stefan", url);
    for (final int widgetId : allWidgetIds) {
        RequestQueue queue = Volley.newRequestQueue(this
                .getApplicationContext());
        final RemoteViews remoteViews = new RemoteViews(this
                .getApplicationContext().getPackageName(),
                R.layout.main_widget);
        JsonObjectRequest jsObjRequest = new JsonObjectRequest
                (Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

                    @Override
                    public void onResponse(JSONObject response) {
                        JsonParse jp = new JsonParse(response);
                        String allEvents = jp.parseJson();
                        RandomFact rf = new RandomFact(allEvents);
                        CharSequence result = rf.randomEvent();
                        remoteViews.setTextViewText(R.id.update, result);
                        appWidgetManager.updateAppWidget(widgetId, remoteViews);
                    }
                }, new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError error) {
                        CharSequence errorToPrint = error.toString();
                        remoteViews.setTextViewText(R.id.update, errorToPrint);

                        appWidgetManager.updateAppWidget(widgetId, remoteViews);
                    }
                });

        queue.add(jsObjRequest);
        Intent clickIntent = new Intent(this.getApplicationContext(), MainWidget.class);
        clickIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
        clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setOnClickPendingIntent(R.id.actionButton, pendingIntent);
        appWidgetManager.updateAppWidget(widgetId, remoteViews);
    }
    stopSelf();
    super.onStart(intent, startId);
}

 

 

 

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ń )

Facebook photo

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

Google+ photo

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

Connecting to %s