我在这里使用本教程Tut进行 inApp 购买。我的问题是,一旦连接了服务,我似乎无法弄清楚如何在我的主要活动中调用函数。我试图检查服务连接后是否需要恢复事务。
问问题
746 次
2 回答
0
实现这一点的最简单方法是在您的活动中创建一个广播接收器,并让服务使用带有自定义意图的 sendBroadcast。可以使用 Intent 的 putExtra() 方法传输数据。确保在活动的 onResume() 中注册接收器并在 onPause() 中取消注册。
于 2012-04-04T13:21:17.293 回答
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 实现一起实现它会更聪明。这绝对是一个有效的代码重构,但却是一个失败的设计,因为它失去了 Activity 和 Service 之间 IPC(进程间通信)的好处和便利性。当从 OOP 的角度谈论代码重构时,更多地从问题抽象层面思考,而不是粗暴地从代码层面剥离内部类。
您应该遵循官方开发指南中的正确设计模式,将 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 开发者编写官方开发指南并不是为了好玩。希望这可以帮助。
于 2012-04-05T01:42:24.313 回答