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。