2012-01-15 2 views
6

Google, market_billing sample, так же как и другие, как this one, подключается к службе IMarketBillingServiceудаленного через сервис обертку местного, BillingService.Почему еще одна услуга на IMarketBillingService?

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

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

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

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

ответ

1

Местный 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"); 
    } 
} 
+2

Спасибо +1 за отличный ответ. Необходимость в услуге хорошо объяснена и приведена здесь здесь *, но ... * недостаточно одной услуги («IMarketBillingService»)? Почему два? Почему локальные * и * удаленные? –

+0

Если вы посмотрите на IMarketBillingService, он объявлен как открытый интерфейс IMarketBillingService расширяет android.os.IInterface. Это не услуга, просто заглушка, которую вы используете для связи с удаленной службой, фактически запущенная в приложении Android Market, если я не ошибаюсь. «Сервис» часть имени Классе путается. –