2012-04-04 52 views
0

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

回答

0

来实现,这将是创建一个广播接收器在您的活动,并有服务使用sendBroadcast用自定义的意图的最简单方法。数据可以通过使用Intent的putExtra()方法传输。确保你在活动的onResume()中注册接收者,并在onPause()中取消注册。

0

你遵循的教程有一个失败的设计:

public class BillingService extends Service implements ServiceConnection { 

    ... ... 

    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
    ... ... 
    } 

    @Override 
    public void onServiceDisconnected(ComponentName name) { 
    ... ... 
    } 

} 

AHHHH,看起来像博客正试图做一些代码重新分解,他认为将是由活动了移动ServiceConnection更聪明,实现它随着服务的实施。这绝对是一个有效的代码重新分解,但却是失败的设计,因为它会丧失活动和服务之间IPC(进程间通信)的好处和便利。当从面向对象的角度谈论代码重构时,从问题抽象层面思考更多问题,而不是粗暴地将内部类从代码级剥离。

您应该遵循从official dev guide正确的设计模式,定义和实现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开发者不会仅仅为了好玩才写官方的开发指南。希望这可以帮助。

+0

他实际上是使用官方指南说做应用程式内结算与BillingService有路,似乎有点不同,但以下他们做了什么,他们也做了同样的事情 – DRing 2012-04-05 22:34:20

+0

正如我所说,本教程中的代码肯定是有效的,你仍然可以通过做一些额外的工作来实现你想要的(即将Activity上下文作为对Service的引用,然后调用它的方法)。这里的要点是如何根据不同的用例做更合理高效的事情。在你的情况下,除了增加编码复杂度来解决你的问题之外,这种FAIL代码重构不会帮助你获得任何好处。我之前做过类似的事情,但最终意识到Google建议的方式总是最合理和最有效的,至少在大多数常见的使用案例中。 – yorkw 2012-04-05 22:49:35