ここでこのチュートリアルを使用して、アプリ内購入を行います。私の問題は、サービスが接続されると、メインアクティビティで関数を呼び出す方法がわからないことです。サービスが接続されたら、restoreTransactions が必要かどうかを確認しようとしています。
2 に答える
これを実装する最も簡単な方法は、アクティビティでBroadcastReceiverを作成し、カスタム インテントでサービスに sendBroadcast を使用させることです。Intent の putExtra() メソッドを使用してデータを送信できます。必ずアクティビティの onResume() でレシーバーを登録し、onPause() で登録解除してください。
あなたが従ったチュートリアルにはFAILデザインがあります:
public class BillingService extends Service implements ServiceConnection {
... ...
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
... ...
}
@Override
public void onServiceDisconnected(ComponentName name) {
... ...
}
}
ブロガーはコードのリファクタリングを試みているようです。彼は ServiceConnection を Activity から移動し、Service 実装と共に実装することでよりスマートになると考えました。これは間違いなく有効なコード リファクタリングですが、アクティビティとサービスの間の IPC (プロセス間通信) の利点と利便性が失われるため、FAIL 設計です。OOP の観点からコードのリファクタリングについて話すときは、コード レベルから内部クラスを無作法に取り除くだけでなく、問題の抽象化レベルから考えてください。
公式開発ガイドの正しい設計パターンに従い、ServiceConnection をアクティビティの内部クラスとして定義および実装する必要があります。IPC の利点と利便性を取り戻します。そのアクティビティで定義したメソッドを onServiceConnected コールバックで呼び出すだけです。準備が整いました:
public class BindingActivity extends Activity {
... ...
/** Defines callbacks for service binding, passed to bindService() */
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
... ...
// call a function in my main activity once the service is connected:
this.foo();
}
@Override
public void onServiceDisconnected(ComponentName name) {
... ...
}
};
}
公式の開発者ガイドが推奨する方法は、常に最も合理的で効率的であることに注意してください。Android 開発者は、楽しみのためだけに公式開発ガイドを書いているわけではありません。お役に立てれば。