Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android實用技術(3)—— Service簡析(I)

Android實用技術(3)—— Service簡析(I)

日期:2017/8/18 9:13:34      編輯:關於android開發

  前面一個帖子,小編和大家大概了解了一下AsyncTask的多線程編程技術,今天我想聊一聊Android的四大組件(神器)之一的Service。

  要想精通Service的相關知識點,還是需要學習很多東西的,當然小編今天寫的這篇文章只能算是讓新手快速了解何為Service、如何快速上手並且快速掌握Service的使用方法,算是入門級的教程。好了,老規矩了,廢話不多說,我們直接上代碼來看看Service如何使用。

  PS:在這邊小編想插一句嘴,如果大家還在用Eclipse和ADT開發項目,強烈介意嘗試或轉向AS(Android Studio),至於原因,你問度娘,反正小編自從用了AS,像吃了麥炫,手指停不下來。

  ----------------------------------------------------------------------------------------------------------------------------------------

  【定義一個服務】

  首先,我們定義一個MyService.java類,當然作為一個服務類,必須要繼承Service(android.app.Service),看代碼:

Java代碼
  1. public class MyService extends Service{  
  2.   @Nullable  
  3.   @Override  
  4.   public IBinder onBind(Intent intent) {        // 這是一個抽象方法,那麼子類是必須要重寫的  
  5.     return null;  
  6.   }  
  7. }  

  Service  --> public abstract IBinder onBind(Intent intent)  這是一個抽象方法,必須被子類重寫!

  ok,服務定義好了,不能就這麼空吧,光溜溜的總得放點干貨,不然這個服務就是個擺設,那麼下面我們就讓這個服務發揮它的作用!

  我們在服務裡面重寫Service中的另一些常用的方法,看代碼:

Java代碼
  1. public void onCreate() {                                                // 服務創建時調用  
  2.   super.onCreate();  
  3. }  
  4.   
  5. public int onStartCommand(Intent intent, int flags, int startId) {      // 服務啟動時調用  
  6.   return super.onStartCommand(intent, flags, startId);  
  7. }  
  8.   
  9. public void onDestroy() {                                               // 服務銷毀時調用  
  10.   super.onDestroy();  
  11. }  

  這邊不得不重點提一下onStartCommand()這個方法,因為我們服務所需要處理的邏輯代碼都寫在這個方法中。

  和添加Activity一樣,我們添加了一個服務,那麼在AndroidManifest.xml文件中必須進行注冊才能生效,而且我需要告訴你,這是Android四大組件所共有的特點!!!

XML/HTML代碼
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.   package="com.example.xin02ma.myapplication">  
  4.   <application  
  5.     android:allowBackup="true"  
  6.     android:icon="@mipmap/ic_launcher"  
  7.     ......  
  8.     <activity android:name=".MainActivity">  
  9.       ......  
  10.     </activity>  
  11.     <service android:name=".MyService" />  
  12.   </application>  
  13. </manifest>  

  【啟動和停止服務】

  服務定義好了,下面我們就直接上代碼,來看看這個服務如何啟動和停止。

  (1)先添加兩個Button(activity_main.xml)

XML/HTML代碼
  1. <Button  
  2.   android:id="@+id/start_service"  
  3.   android:layout_width="match_parent"  
  4.   android:layout_height="wrap_content"  
  5.   android:text="@string/start_service" />  
  6.   
  7. <Button  
  8.   android:id="@+id/stop_service"  
  9.   android:layout_width="match_parent"  
  10.   android:layout_height="wrap_content"  
  11.   android:text="@string/stop_service" />  

Android實用技術(3)—— Service簡析(I)

  (2)接下來,修改主函數MainActivity的代碼:

Java代碼
  1. public class MainActivity extends Activity implements View.OnClickListener{  
  2.   private Button startService;                                                
  3.   private Button stopService;  
  4.   
  5.   protected void onCreate(Bundle savedInstanceState) {  
  6.     super.onCreate(savedInstanceState);  
  7.     setContentView(R.layout.activity_main);                               // 采用布局  
  8.     startService = (Button) super.findViewById(R.id.start_service);       // 取得Button實例  
  9.     stopService = (Button) super.findViewById(R.id.stop_service);         // 取得Button實例  
  10.     startService.setOnClickListener(this);                                // 監控Button,注冊按鈕事件  
  11.     stopService.setOnClickListener(this);                                 // 監控Button,注冊按鈕時間  
  12.   }  
  13.   
  14.   public void onClick(View v) {  
  15.     switch (v.getId()) {  
  16.       case R.id.start_service:  
  17.         Intent startIntent = new Intent(this, MyService.class);  
  18.         startService(startIntent);                                          // 啟動服務  
  19.         break;  
  20.       case R.id.stop_service:  
  21.         Intent stopIntent = new Intent(this, MyService.class);  
  22.         stopService(stopIntent);                                            // 停止服務  
  23.         break;  
  24.       default:  
  25.         break;  
  26.     }  
  27.   }  
  28. }  

  上面的代碼真的是太簡單了,主要作了以下工作:

  (1)取得startService和stopService兩個按鈕實例,並且注冊了點擊事件;

  (2)通過Intent對象,調用Activity的startService()和stopService()方法來啟動和停止服務。

  Notice:你們有沒有發現一個問題?這裡的活動的啟動和停止完全是由活動本身控制的,如果我們start了服務,但是沒有點擊stop,那麼服務會一直處於運行狀態,此時服務如何讓自己停止下來?

  慶幸的是,我們可以在不點擊stopService按鈕的前提下,調用stopSelf()這個方法就能讓服務停下來!這麼說不明白?沒關系,下面我們會通過代碼告訴你怎麼用它。

  ----------------------------------------------------------------------------------------------------------------------------------------

  【小測試】

  既然上面的代碼已經能夠完成服務的啟動和停止的邏輯流程了,那麼口說無憑,也很難讓人信服,那小編就打個Log給你看看,我們一起看看Service是如何運作的,來,上代碼!

Java代碼
  1. .....  
  2.   
  3. private static final String TAG = "MyService";  
  4.   
  5. ...  
  6.   
  7. public void onCreate() {                                                // 服務創建時調用  
  8.   super.onCreate();  
  9.   Log.d(TAG, "onCreate executed");  
  10. }  
  11.   
  12. public int onStartCommand(Intent intent, int flags, int startId) {      // 服務啟動時調用  
  13.   Log.d(TAG, "onStartCommand executed");  
  14.   return super.onStartCommand(intent, flags, startId);  
  15. }  
  16.   
  17. public void onDestroy() {                                               // 服務銷毀時調用  
  18.   super.onDestroy();  
  19.   Log.d(TAG, "onDestroy executed");  
  20. }  

  這個代碼也太簡單了吧,添加了3行Log,目的就是看:在我們點擊兩個按鈕的時候,整個Service什麼時候創建,什麼時候啟動,什麼時候毀滅!

  請相信我,雖然代碼很簡單,邏輯也很low,但是這樣的學習和思考的過程在以後你編寫代碼的時候,了解Service的生命周期是很很很重要的!

  我們來看一下執行結果,運行程序,查看Logcat中的打印日志:

Android實用技術(3)—— Service簡析(I)

  (1)第一次點擊StartService按鈕後,MyService中的onCreate()和onStartCommand()方法都執行了,圖中黃色箭頭所示!

  此時,我們可以在手機 --> 設置 --> 應用 --> 運行中看到這個服務,小編給您截個圖體驗一下:

Android實用技術(3)—— Service簡析(I)

Android實用技術(3)—— Service簡析(I)

  (2)然後我們點擊stopService按鈕後,MyService中的onDestory()方法被執行,圖中藍色箭頭所示!

  (3)此時可能你會有一個疑問?當我們點擊了startService按鈕以後,onCreate()和onStartCommand()方法同時被執行,這兩個方法有什麼區別?

  OK!圖中的紅色箭頭給了我們答案:onCreat()方法是在服務第一次創建的時候調用的,而onStartCommand()方法則在每次啟動服務的時候都會被調用。

  當我們在服務未啟動的時候,點擊startService按鈕,則此時會執行兩個方法;

  但是服務啟動完成之後,再次點擊(隨便你點幾次)startService按鈕,你會發現只有onStartCommand()方法被執行。

  1. 上一頁:
  2. No
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved