星期六, 9月 24, 2011

繼承Service類實現started類型的service

Android應用程式學習筆記

繼承Service類實現started類型的service

首先,我們從之前學習到實現started有兩種方法,一種是繼承IntentService類別,一種是繼承Service類別,以下有我們的程式碼,一樣我們設定三個按鈕,一個按鈕是啟動service,一個是
停止service,一個是再啟動service一次,service自己會運行10秒鐘後自動銷毀。

那有幾個特點我們藉這次機會實驗一下:
1.started service的生命週期是
組件呼叫startService()方法 -> onCreate() -> onStartCommand() -> Service running -> Service stoped by itself or client -> onDestroy()
那我們就在各個回呼方法中加上 System.out.println("")來驗證,當執行到該回呼方法就會輸出回呼方法的名稱。

2.一旦service啟動後,就會無限地在後台運行。所以我們試著在啟動service後10秒鐘內按下"BACK"關閉應用程式,看看service是不是還在後台運行。因為service在10秒鐘會自己銷毀,並呼叫onDestory()方法來驗證。

3.它與IntentService不同是能處理多執行續。(還在試)

4.執行續一次只執行一個請求,所以後進的請求必須等前一個請求完成後才會被處理。那我們這就用兩個按鈕來對service傳送兩個請求,並看看是不是在第一個請求執行10秒後,才在執行第二個請求。



package test.helloservice;

import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;

public class HelloService extends Service {

//宣告一個Looper物件作為與執行續通訊的接口
private Looper mServiceLooper;
//宣告一個Handler物件作為處理訊息的接口
private ServiceHandler mServiceHandler;

//Handler接收從執行續傳來的訊息
private final class ServiceHandler extends Handler{
public ServiceHandler(Looper looper){
super(looper);
System.out.println("ServiceHandler");
System.out.println("Thread------> " + Thread.currentThread().getId());
}

//處理訊息的方法
@Override
public void handleMessage(Message msg){
System.out.println("handleMessage");
System.out.println("Thread------> " + Thread.currentThread().getId());
//通常我們把要執行的工作在此處完成
long endTime = System.currentTimeMillis() + 10*1000;
       while (System.currentTimeMillis() < endTime) {
           synchronized (this) {
               try {
                   wait(endTime - System.currentTimeMillis());
               } catch (Exception e) {
               }
           }
       }
     
       stopSelf(msg.arg1);
}
}



//第一次產生service時系統呼叫此方法
@Override
public void onCreate(){
System.out.println("onCreate");
System.out.println("Thread------> " + Thread.currentThread().getId());
//因為通常直service工作會在主執行緒中完成,但此方式可能會阻塞主執行緒,所以我們另外產生執行緒
HandlerThread thread = new HandlerThread("ServiceStartArguments" ) ;
thread.start();
//從執行續取得Looper物件
mServiceLooper = thread.getLooper();
//將Looper物件設置到handler,如此handler才會處理執行許傳遞的訊息
mServiceHandler = new ServiceHandler(mServiceLooper);
}


@Override
public int onStartCommand(Intent intent , int flags , int startId){
System.out.println("onStartCommand");
System.out.println("Thread------> " + Thread.currentThread().getId());

Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
mServiceHandler.sendMessage(msg);

return START_STICKY;

}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
System.out.println("onBind");
System.out.println("Thread------> " + Thread.currentThread().getId());
return null;
}

@Override
public void onDestroy(){
System.out.println("onDestroy");
System.out.println("Thread------> " + Thread.currentThread().getId());
super.onDestroy();
}

}


以下那我們實驗結果

1.

2.3.4.可以自己回去實驗。

沒有留言:

張貼留言