2013-10-11 68 views
0

讓該Android應用程序無法正常工作有點麻煩。基本上,在主菜單中,我啓動了一個我創建的服務,並且工作正常。我遇到的問題是我有一個可從主要活動中調用的選項活動,我希望選項活動能夠與我在主要活動中開始的服務進行交互。(Android)將服務綁定到除了啓動服務的活動以外的其他活動

我讀過這個頁面http://developer.android.com/guide/components/bound-services.html,我似乎已經做得很好,但是當我嘗試訪問服務的某些成員函數時,我的程序崩潰了。它特別發生在我嘗試訪問服務內部的哈希映射時。

在我的onCreate類選項菜單活動:

Intent passedintent = getIntent(); // gets the intent sent to the activity 
     //Intent intentShim = new Intent(this, ShimmerService.class); 



     // binds the shimmer service to this activity 
     boolean isconnected = getApplicationContext().bindService(intent, shimmerServiceConnection, Context.BIND_AUTO_CREATE); 

    // register the shimmer receiver 
     registerReceiver(shimmerReceiver, new IntentFilter("com.jpl_347E.bio_sigapp.ShimmerService")); 

的passedintent意圖從那個開始這項活動的主要活動的意圖。起初,我嘗試通過這個作爲第一個參數

getApplicationContext().bindService(....) 

函數,但它似乎沒有工作。所以我創建了一個新的意圖,它反映了我在主菜單活動中用於創建服務的意圖。我也有我的選項菜單活性這些功能

private ServiceConnection shimmerServiceConnection = new ServiceConnection() { 


     public void onServiceConnected(ComponentName arg0, IBinder arg1) { 
      LocalShimmerBinder binder = (LocalShimmerBinder)arg1; 
      serviceshim = binder.getService(); 
     } 

     @Override 
     public void onServiceDisconnected(ComponentName arg0) { 
      // TODO Auto-generated method stub 

     } 

}; 

private BroadcastReceiver shimmerReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (intent.getIntExtra("ShimmerState", -1) != -1) 
      ;//TODO 
     } 
    }; 

這幾乎是相同的代碼,我在我的主菜單活動,這是完全能夠找到那裏的服務。我想我已經跟蹤誤差的

binder.getService() 

該函數返回空值,然後我嘗試訪問的HashMap中,我引用變量沒有指向(它指向空)的一類。 我只是不知道爲什麼binder.getService()會在這裏返回null,而不是在主菜單功能。我可能需要重新啓動服務嗎? 我想,一旦我開始主要服務,我不需要在這個活動中重新開始。

回答

0

OOPS!這是因爲我在ServiceConnection函數被調用之前試圖在我的onCreate()中使用該服務。

1

我知道你找到一種方式,它已經工作,但幾個簡單建議:

1)你不需要調用startService明確。該方法適用於不同的用例。綁定到它將根據需要創建Service

2)請勿使用ActivitygetApplicationContextActivityContext,所以通過this

+0

感謝您的輸入,我應該怎樣通過'this'呢? – JohnA

+0

對不起,你沒有通過應用程序上下文,你只是使用它。所以你應該刪除「getApplicationContext()」。從調用bindService的前面。 – Dave