0

我在这里使用本教程Tut进行 inApp 购买。我的问题是,一旦连接了服务,我似乎无法弄清楚如何在我的主要活动中调用函数。我试图检查服务连接后是否需要恢复事务。

4

2 回答 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 回答