Question

échantillon market_billing de Google, tout comme d'autres celui-ci , se connecte au remote IMarketBillingService via un wrapper de service local , BillingService.

Je comprends que les services ont l'avantage de faire les choses en arrière-plan, mais le IMarketBillingService distant n'est-il pas suffisant?

Quel est l’avantage d’ajouter une couche supplémentaire à cet oignon?

Que vais-je perdre si j'essaie de me connecter au IMarketBillingService distant directement depuis mon activité principale, dans le fil de l'interface utilisateur?

S'il n'est pas conseillé de se connecter au IMarketBillingService distant directement dans le thread d'interface utilisateur, le BillingService local peut-il être remplacé par juste un autre thread dans l'activité principale?

Était-ce utile?

La solution

Le BillingService local gère les rappels de IMarketBillingService lorsque votre activité n'est pas en cours d'exécution.

La référence ( http://developer.android.com/reference/android /app/Activity.html ) dit:

"Si une activité est mise en pause ou arrêtée, le système peut abandonner l'activité de mémoire en lui demandant de terminer ou en tuant simplement son processus. Lorsqu'il est à nouveau affiché à l'utilisateur, il doit être complètement redémarré et restauré à son état précédent. "

Si, par exemple, vous appelez une demande de facturation RESTORE_TRANSACTIONS, les réponses du service Android Market peuvent mettre un certain temps à arriver. En utilisant un service, vous savez que vous serez toujours là pour gérer les réponses, quel que soit le cycle de vie de l'activité.

Juste pour m'amuser, j'ai essayé d'écrire une petite application de test et j'en étais sûr. Un thread en cours d'exécution peut appeler des méthodes sur une activité suspendue ou arrêtée. Le thread peut également modifier son interface utilisateur même lorsque l'activité n'est pas au premier plan. Exécutez l'application suivante, appuyez sur l'écran d'accueil pour arrêter l'application. Revenez en arrière après 10 secondes, et voyez que le TextView a changé ...

package com.example.playground;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class MyActivity extends Activity {

    private static String TAG = MyActivity.class.getName();

    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Thread t = new Thread(new Runnable() {
            public void run() {
                try {
                    Thread.sleep(10000);
                    someMethod();
                } catch (InterruptedException e) {
                    Log.e(TAG, e.getMessage(), e);
                }
            }
        });
        t.start();
    }

    private void someMethod() {
        Log.d(TAG, "Some method called");
        TextView tv = (TextView) findViewById(R.id.textfield);
        tv.setText("Called later");
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top