我遇到了問題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()
方法中的日誌(儘管應該一開始就沒有約束力!)。