2012-04-04 51 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