Android後臺服務---無交互時的Service

   Service是Android四大組件之一,他主要負責後臺服務,長時間運行。
java

   一:主要特色
ide

   (1)優先級大於Activity,即便Activity被中止後,他也不會輕易被終止
測試

   (2)即便被系統終止,在紫銅回覆資源後,Service也會自動回覆運行狀態
this

   (3)×××面操做,後臺一致運行   spa

   二:生命週期
線程

   生命週期啓動Activity以後,會執行一次僅一次onCreate方法建立Service和一次onStartCommand方法,而屢次啓動時onStartCommand方法則會執行屢次,終止Service時,則會執行到onDestory方法對象

   觸發的方法有:onCreate、onStartCommand、onDestory繼承

   三:建立及方法
生命週期

   使用Service時,必須繼承自Service抽象類,實現其中的方法。經常使用的方法有:
資源

   (1)onCreate():非必須重寫。負責Service的建立,初始化,或者所有工做。啓動Service時執行一次,且只執行一次

   (2)onStartCommand():非必須重寫。負責Service應該完成的工做。每次啓動Service時,都會執行一次

   (3)onDestory():釋放資源的部分。關閉時只執行一次

   四:啓動、中止方式

   1:不與用戶交互

   啓動方式:startService(intent對象)

   終止方式:stopService(intent對象)    

   五:不與用戶交互時的Service

   測試方法:

   ◆建立類MyService繼承自Service,重寫onCreate、onStartCommand、onDestory三個方法,在方法體裏面各添加一句輸出語句

public class MyService extends Service {
    // 與用戶交互時觸發的方法,可是兩種生命週期都必須重寫
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    //用來建立Service,完成初始化,工做均可以
    @Override
    public void onCreate() {
        System.out.println("onCreate");
        super.onCreate();
    }
    // 用來標識Activity生命週期的開始,完成工做
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        System.out.println("OnStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }
    // 二者生命週期的結束
    @Override
    public void onDestroy() {
        System.out.println("onDestory");
        super.onDestroy();
    }
}

   ◆在主界面上,添加兩個按鈕,一個是start,一個爲stop,爲兩個按鈕添加監聽。  

public class MainActivity extends Activity implements OnClickListener {
private Intent intent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.start).setOnClickListener(this);//給啓動按鈕加監聽
        findViewById(R.id.stop).setOnClickListener(this);//給終止按鈕加監聽
        intent = new Intent(this,MyService.class);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.start:
            startService(intent);//啓動Service
            break;
        case R.id.stop:
            stopService(intent);//終止Service
            break;
        }
    }
}

    看後臺輸出,可能出現的狀況爲:  

(1)第一次單擊Start按鈕後:執行了一次onStart方法和onStartCommand方法
(2)第二次單擊Start按鈕後:僅執行了一次onStartCommand方法
(3)接下來每一次單擊start按鈕後,都僅執行一次onStartCommand方法
(4)點擊Stop按鈕後:執行了一次onDestory方法。

  六:具體應用

   功能實現:在Service中提供一個計時器,讓他計數,當start和stop時觀察結果。

   ◆MyService中

public class MyService extends Service{
    private Timer timer;//計時器聲明
    private TimerTask task;//計時器Task聲明
    private int i=0;//變量初始化
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
                                                                                                                         
    @Override
    public void onCreate() {
        super.onCreate();
        System.out.println("onCreate-----");
    }
                                                                                                                         
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        System.out.println("onStartCommand-----");
        start();//把啓動計時器的方法放在這個方法中
        return super.onStartCommand(intent, flags, startId);
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        stop();//把關閉計時器的方法放在這個方法中
        System.out.println("onDestroy-----");
    }
    //定時器的啓動
    public void start(){
        timer = new Timer();//實例化計時器
        task = new TimerTask() {//實例化計時器Task
                                                                                                                                 
            @Override
            public void run() {
                i++;//變量自增
                System.out.println(i);//打印輸出
                                                                                                                                     
            }
        };
        timer.schedule(task, 1000, 1000);//啓動計時器
    }
    //定時器的關閉
    public void stop(){
        timer.cancel();
    }
}

   ◆主界面同上

   ◆結果顯示

   (1)第一次單擊start:出發了onCreate和onStartCommand方法,onStartCommand中的計時器開始工做循環計數輸出

   (2)單擊返回鍵後,任然繼續輸出

   (3)單擊Stop以後,中止輸出,即執行了onDestory方法。

08-31 13:25:45.703: I/System.out(2055): onCreate----//第一次單擊start以後
08-31 13:25:45.703: I/System.out(2055): onStartCommand-----
08-31 13:25:46.764: I/System.out(2055): 1
08-31 13:25:47.779: I/System.out(2055): 2
08-31 13:25:48.815: I/System.out(2055): 3
08-31 13:25:49.883: I/System.out(2055): 4
08-31 13:25:50.893: I/System.out(2055): 5
08-31 13:25:51.922: I/System.out(2055): 6
08-31 13:25:52.923: I/System.out(2055): 7
08-31 13:25:53.991: I/System.out(2055): 8//單擊返回鍵後繼續輸出
08-31 13:25:54.983: I/System.out(2055): 9
08-31 13:25:55.998: I/System.out(2055): 10
08-31 13:25:57.000: I/System.out(2055): 11
08-31 13:25:57.433: I/System.out(2055): 12
08-31 13:25:58.456: I/System.out(2055): 13
08-31 13:25:59.039: I/System.out(2055): 14
08-31 13:25:59.474: I/System.out(2055): 15
08-31 13:25:59.474: I/System.out(2055): onDestory----//單擊stop以後

   注意:Service是單線程,若是你屢次單擊Start以後,即便你單擊了一樣次數的stop按鈕,也只能終止你第一觸發的那個Service。


   Service還有一種啓動方式,咱們明日再續哈。。電腦很不給力啊。

相關文章
相關標籤/搜索