Почему еще один сервис поверх IMarketBillingService? - PullRequest
6 голосов
/ 15 января 2012

Пример Google market_billing , как и другие, как этот , подключается к удаленной службе IMarketBillingService через локальной службеОбертка, BillingService.

Я понимаю, что сервисы имеют преимущество в том, что они работают в фоновом режиме, но не достаточно удаленного IMarketBillingService?

В чем преимущество добавления ещееще один слой с этим луком?

Что я потеряю, если попытаюсь подключиться к удаленному IMarketBillingService напрямую из моей основной деятельности в потоке пользовательского интерфейса?

Если это не рекомендуетсядля подключения к удаленному IMarketBillingService непосредственно в потоке пользовательского интерфейса, можно ли заменить локальный BillingService просто другим потоком в основной деятельности?

1 Ответ

1 голос
/ 19 января 2012

Локальный BillingService обрабатывает обратные вызовы из IMarketBillingService, когда ваша деятельность не выполняется.

Ссылка (http://developer.android.com/reference/android/app/Activity.html) говорит:

"Если действие приостановленоили остановлена, система может удалить действие из памяти, либо попросив его завершить, либо просто убив свой процесс. Когда он снова отображается для пользователя, он должен быть полностью перезапущен и восстановлен в своем предыдущем состоянии. "

Если, например, вы вызываете запрос на выставление счета RESTORE_TRANSACTIONS, ответы от службы Android Market могут занять некоторое время до прибытия. Используя службу, вы знаете, что всегда будете рядом, чтобы обрабатывать ответы, независимо от активностиЖизненный цикл.

Ради интереса я попытался написать небольшое тестовое приложение и был уверен: работающий поток может вызывать методы для приостановленной или остановленной активности. Поток также может изменять свой интерфейс, даже когда активностьне на переднем плане. Запустите следующее приложение, нажмите на главном экране, чтобыоп приложение.Вернитесь через 10 секунд и увидите, что TextView изменился ...

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");
    }
}
...