2015年3月16日 星期一

[Android] 關於服務Service - 如何傳遞資料給Service

有時,我們需要傳遞一些資料給Service,
例如,播放檔案的檔名,或者控制訊息等等,
有幾個方法可以使用,
第一個就是利用Intent之間傳遞資料的方法,
在開始Service時,將資料帶入,
具體做法如下:
Intent i = new Intent(this,myServiceClass.class);
i.putExtra("DATA_KEY1","my data");
i.putExtra("DATA_KEY2",1234);
startService(i);
在這裡我們放入"my data"這個字串和1234的數值,

Service端要如何取出資料呢?
@Override
 public int onStartCommand(Intent intent, int flags, int startId) {
  String sData1=Intent.getStringExtra("DATA_KEY1");
  int iData2=Intent.getIntExtra("DATA_KEY2",0);
  mServiceThread = new ServiceThread();
  mServiceThread.start();
     return  START_STICKY ; 
 }   
onStartCommand()裡,我們可以取出傳過來的資料,
也就是說,sData1就是"my data"iData2就是1234, 
你可以一直重覆呼叫startService(),傳入你需要的資料,
如果重覆呼叫startService(),onStartCommand()就會對應的被呼叫,
當然,在上面的例子,onStartCommand()裡面會執行new ServiceThread()mServiceThread.start(), 這部份需要另外處理,避免也重覆到了...

另外還有一個常用的方式,就是利用bindService的機制,
public class myService  extends Service {
 private ServiceThread mServiceThread; 
 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  return new myServiceLocalBinder();
 }
 
 @Override
 public void onCreate() {
 // TODO Auto-generated method stub
 super.onCreate();
 }
  
 @Override
 public int onStartCommand(Intent intent, int flags, int startId) {
  mServiceThread = new ServiceThread();
  mServiceThread.start();
     return  START_STICKY ; 
 }     
  
 public class myServiceLocalBinder extends Binder {  
  myService getService() {  
            // Return this instance of LocalService so clients can call public methods  
            return myService.this;  
        }     
    }

 public void SendData2Service(String s, int i)
 {
   //your action here
 }
  
  
 @Override
 public void onDestroy() {
  Log.d(TAG,"onDestroy()");
  if (mServiceThread != null)
   mServiceThread.interrupt();
 }
  
 private class ServiceThread extends Thread {
  @Override
  public void run() {
   super.run();
   //your action here
  }
 } 
}
在啓動Service的地方,修改如下:
myServiceClass myService=null; 

private ServiceConnection sMyServiceConnection = new ServiceConnection() {    
 @Override  
 public void onServiceDisconnected(ComponentName name) {  
 }    
 
 @Override
 public void onServiceConnected(ComponentName name, IBinder service) {
  myService = ((myServiceClass.myServiceLocalBinder) service).getService();  
 }  
};  

 public void StartMyService() {
   Intent i = new Intent(this, myService.class);  
   bindService(i, sMyServiceConnection , BIND_AUTO_CREATE);
   startService(i);
 }
 
 public void StopMyService(){
  Intent i = new Intent(this,myServiceClass.class);
 try{
     unbindService(sMyServiceConnection);
     stopService(i);
  } catch (IllegalArgumentException e){              
 } 
 }
當你想要傳送資料給Service,可以利用myService.SendData2Service()

沒有留言:

張貼留言