紀錄一下寫Service遇到的issue
在使用bindService()時,是一個Asynchronous的method,會觸發service的onBind
並且在activity得到一的binder的物件用以和service溝通
example:MyService.java
public MyBinderClass mBinder=new MyBinderClass();
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return mBinder;
}
所以之前code寫成這樣的時候 :(in myactivity.java)
private void setHomeServiceConnection(){
serviceConn=new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
Log.d("HomeTab","onServiceConnected");
hsBinder=(HomeService.MyBinderClass)service;
serviceBind=true;
hs=((HomeService.MyBinderClass)service).getMyService();
hs.onStartCommand(null, 0, 0);
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
Log.d("HomeTab","onServiceDisconnected");
serviceBind=false;
}
};
getApplicationContext().bindService(new Intent(HomeTab.this,HomeService.class),serviceConn,Context.BIND_AUTO_CREATE);
Log.d("HomeTab","After bind");
hsBinder.testLog();//wrong!!!
最後一行就會出錯,原因是因為要等到onServiceConnected被觸發之後,
才能夠使用service由onBind回傳的binder,進一步使用binder裡面的method
所以這裡是用serviceBind variable來觀察是否和service連線
至於binder的寫法就是定義在service class,作為一個inner class
example:
public class MyBinderClass extends Binder{
/** Communication between Activity and Service */
public AppliancesInfo getAppInfo(){
return appLastInfo;
}
public void SendCommand(String cmd){
}
public HomeService getMyService()
{
return HomeService.this;
}
public void Testlog(){Log.d("123","123");}
}
That's it.
沒有留言:
張貼留言