Imarketbillingserviceの上にある別のサービスがなぜですか?
-
28-10-2019 - |
質問
グーグルの Market_Billingサンプル, 、他の人と同じように これです, 、に接続します リモート サービス IMarketBillingService
介して ローカル サービスラッパー、 BillingService
.
私はサービスがバックグラウンドで物事をするという利点があることを理解していますが、リモートではありません IMarketBillingService
足りる?
このタマネギにさらに別の層を追加することの利点は何ですか?
リモコンに接続しようとすると何が失われますか IMarketBillingService
UIスレッドの私の主なアクティビティから直接?
リモコンに接続することをお勧めできない場合 IMarketBillingService
UIスレッドでは、ローカルを直接できます BillingService
メインアクティビティの別のスレッドに置き換えられますか?
解決
地元のBillingserviceは、アクティビティが実行されていないときにImarketBillingserviceからのコールバックを処理します。
参照( http://developer.android.com/reference/android/app/activity.html)言う:
「アクティビティが一時停止または停止した場合、システムはメモリを完了するか、単にプロセスを殺すことにより、メモリからアクティビティをドロップできます。ユーザーに再度表示されると、完全に再起動して前の状態に復元する必要があります。 。」
たとえば、restore_transactionsの請求リクエストを呼び出した場合、Androidマーケットサービスからの回答が到着するのに時間がかかる場合があります。サービスを使用することで、アクティビティライフサイクルに関係なく、常に応答を処理するために常に周りにいることがわかります。
楽しみのために、私は小さなテストアプリを書こうとしましたが、確信していました。実行中のスレッドは、一時停止または停止したアクティビティでメソッドを呼び出すことができます。スレッドは、アクティビティが前景にない場合でも、UIを変更することもできます。次のアプリケーションを実行し、ホーム画面を押してアプリを停止します。 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");
}
}