2012-11-07 76 views
2

我遇到了問題bindService()。我試圖在構造函數中進行綁定,提供一個包含兩個可分派額外項的Intent。在onResume()中調用該構造函數,並且該服務在其onBind()方法中分析了這兩個附加項,並且可能會返回null作爲解析的結果。Android bindService不工作

當我第一次運行應用程序(通過在Eclipse中運行)綁定(預計)被服務拒絕:服務的onBind()方法被調用並返回null。但是,應用程序方面的bindService()方法返回true(不應該,因爲綁定沒有經過!)。

當我嘗試以下操作時,會出現更多問題:我按HOME按鈕並再次啓動應用程序(因此它的onResume()再次運行,應用程序嘗試再次綁定到該服務)。這一次服務的onBind()似乎並沒有運行!但該應用程序的bindService()仍然會返回true

下面是一些示例代碼,應該可以幫助您理解我的問題。

應用端:

// activity's onResume() 
@Override 
public void onResume() { 
    super.onResume(); 
    var = new Constructor(this); 
} 

// the constructor 
public Constructor(Context context) { 
    final Intent bindIntent = new Intent("test"); 

    bindIntent.putExtra("extra1",extra_A); 
    bindIntent.putExtra("extra2",extra_B); 

    isBound = context.bindService(bindIntent, connection, Context.BIND_ADJUST_WITH_ACTIVITY); 

    log("tried to bind... isBound="+isBound); 
} 

服務端:

private MyAIDLService service = null; 

@Override 
public void onCreate() { 
    service = new MyAIDLService(getContentResolver()); 
} 

@Override 
public IBinder onBind(final Intent intent) { 
    log("onBind() called");  

    if (intent.getAction().equals("test") { 
     ExtraObj extra_A = intent.getParcelableExtra("extra1"); 
     ExtraObj extra_B = intent.getParcelableExtra("extra2"); 

     if (parse(extra_A,extra_B)) 
      return service; 
     else { 
      log("rejected binding"); 
      return null; 
     } 

    } 
} 

ServiceConnection我使用存在以下onServiceConnected()方法:

@Override 
public void onServiceConnected(final ComponentName name, final IBinder service) { 
    log("onServiceConnected(): successfully connected to the service!"); 

    this.service = MyAIDLService.asInterface(service); 
} 

所以,我從來沒有去看看「成功連接到服務!」登錄。我第一次運行應用程序(通過Eclipse),我得到了「拒絕綁定」日誌以及「isBound = true」,但從那裏我只得到「isBound = true」,「拒絕綁定」doesn再也不會出現了。

我懷疑這可能與Android認識到即使在強制拒絕時有成功綁定的可能性有關。理想情況下,我也可以強制「解除綁定」,但這是不可能的:我懷疑這是因爲,當我殺死應用程序時,我收到了位於服務的onUnbind()方法中的日誌(儘管應該一開始就沒有約束力!)。

回答

4

有同樣的問題,但意識到我的服務並沒有真正開始。也許嘗試添加「Context.BIND_AUTO_CREATE」到標誌,這將導致服務被創建和啓動。我不相信Context.BIND_ADJUST_WITH_ACTIVITY會啓動它,因此onServiceConnected可能不會被調用(即使bindService()調用返回true,它也不適用於我):

isBound = context.bindService(bindIntent, connection, 
      Context.BIND_ADJUST_WITH_ACTIVITY | Context.BIND_AUTO_CREATE);