我在这里使用本教程Tut进行inApp购买。我的问题是,一旦服务连接,我似乎无法弄清楚如何在我的主要活动中调用一个函数。我试图在服务连接后检查是否需要restoreTransactions。
答案 0 :(得分:0)
实现此目标的最简单方法是在您的活动中创建 BroadcastReceiver ,并让服务使用带有自定义意图的sendBroadcast。可以使用Intent的putExtra()方法传输数据。确保在活动的onResume()中注册接收者,并在onPause()中取消注册。
答案 1 :(得分:0)
您遵循的教程有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实现一起实现,他会更聪明。这绝对是一个有效的代码重新分解但是FAIL设计,因为它失去了活动和服务之间的IPC(进程间通信)的好处和便利。在谈论从OOP角度重新分解代码时,从问题抽象层面考虑更多,而不仅仅是从代码级别粗略地剥离内部类。
您应该遵循official dev guide中的正确设计模式,定义并实现ServiceConnection作为Activity的内部类,您将重新获得IPC的好处和便利,只需调用您在onServiceConnected中的Activity中定义的任何方法回调,一旦服务启动并准备就绪:
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开发人员不会只为了好玩而编写官方开发指南。希望这会有所帮助。