为服务进行回调

时间:2012-04-04 12:40:40

标签: android service in-app-billing

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

2 个答案:

答案 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开发人员不会只为了好玩而编写官方开发指南。希望这会有所帮助。