Android開發學習筆記:Service的簡介和啓動方式

一.Service的簡介java

1.Service 介紹和做用
Service是Android系統中的四大組件之一,它是一種長生命週期的,沒有可視化界面,運行於後臺的一種服務程序。好比咱們播放音樂的時候,有可能想邊聽音樂邊幹些其餘事情,當退出播放音樂的應用,若是不用Service,我 們就聽不到歌了,因此這時候就得用到Service了。
 
2. Service生命週期
Service的生命週期並不像Activity那麼複雜,它只繼承了onCreate(),onStart(),onDestroy()三個方法,當第一次啓動Service時,前後調用了onCreate(),onStart()這兩個方法,當中止Service時,則執行onDestroy()方法,這裏須要注意的是,若是Service已經啓動了,當咱們再次啓動Service時,不會在執行onCreate()方法,而是直接執行onStart()方法。
 
二.Service的啓動方式
Service的有兩種啓動方式: Context.startService()和Context.bindService(),這兩種方式對 Service生命週期的影響是不一樣的。
 
1.Context.startService()方式啓動
 
①Context.startService()方式的生命週期:
啓動時,startService –> onCreate() –> onStart()
中止時,stopService –> onDestroy()
若是調用者直接退出而沒有中止Service,則Service 會一直在後臺運行
 
Context.startService()方法啓動服務,在服務未被建立時,系統會先調用服務的onCreate()方法,接着調用onStart()方法。若是調用startService()方法前服務已經被建立,屢次調用startService()方法並不會致使屢次建立服務,但會致使屢次調用onStart()方法。採用startService()方法啓動的服務,只能調用Context.stopService()方法結束服務,服務結束時會調用onDestroy()方法。
 
②Context.startService()方式啓動 Service的方法:
 
下面是具體例子:
 
MainActivity.java
 
  
  
           
  
  
  1. package com.android.service.activity;  
  2.  
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9.  
  10. public class MainActivity extends Activity  
  11. {  
  12.     private Button startBtn;  
  13.     private Button stopBtn;  
  14.     @Override 
  15.     public void onCreate(Bundle savedInstanceState)  
  16.     {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.main);  
  19.         startBtn = (Button) findViewById(R.id.startBtn);  
  20.         stopBtn = (Button) findViewById(R.id.stopBtn);  
  21.         //添加監聽器  
  22.         startBtn.setOnClickListener(listener);  
  23.         stopBtn.setOnClickListener(listener);  
  24.     }  
  25.       
  26.     //啓動監聽器  
  27.     private OnClickListener listener=new OnClickListener()  
  28.     {         
  29.         @Override 
  30.         public void onClick(View v)  
  31.         {  
  32.             Intent intent=new Intent(MainActivity.this, ServiceDemo.class);  
  33.             switch (v.getId())  
  34.             {  
  35.             case R.id.startBtn:  
  36.                 startService(intent);  
  37.                 break;  
  38.             case R.id.stopBtn:  
  39.                 stopService(intent);  
  40.                 break;  
  41.             default:  
  42.                 break;  
  43.             }             
  44.         }  
  45.     };  
 
ServiceDemo.java
 
  
  
           
  
  
  1. package com.android.service.activity;  
  2.  
  3. import android.app.Service;  
  4. import android.content.Intent;  
  5. import android.os.IBinder;  
  6. import android.util.Log;  
  7.  
  8. public class ServiceDemo extends Service  
  9. {  
  10.     private static final String TAG="Test";  
  11.       
  12.     @Override 
  13.     //Service時被調用  
  14.     public void onCreate()  
  15.     {  
  16.         Log.i(TAG, "Service onCreate--->");  
  17.         super.onCreate();  
  18.     }  
  19.  
  20.     @Override 
  21.     //當調用者使用startService()方法啓動Service時,該方法被調用  
  22.     public void onStart(Intent intent, int startId)  
  23.     {  
  24.         Log.i(TAG, "Service onStart--->");  
  25.         super.onStart(intent, startId);  
  26.     }  
  27.  
  28.     @Override 
  29.     //當Service不在使用時調用  
  30.     public void onDestroy()  
  31.     {  
  32.         Log.i(TAG, "Service onDestroy--->");  
  33.         super.onDestroy();  
  34.     }  
  35.  
  36.     @Override 
  37.     //當使用startService()方法啓動Service時,方法體內只需寫return null  
  38.     public IBinder onBind(Intent intent)  
  39.     {  
  40.         return null;  
  41.     }  
  42. }  
  43.  
main.xml
 
  
  
           
  
  
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:orientation="vertical" 
  4.     android:layout_width="fill_parent" 
  5.     android:layout_height="fill_parent" 
  6.     > 
  7.     <Button 
  8.         android:id="@+id/startBtn" 
  9.         android:layout_width="match_parent" 
  10.         android:layout_height="wrap_content" 
  11.         android:text="啓動 Service" 
  12.         /> 
  13.     <Button 
  14.         android:id="@+id/stopBtn" 
  15.         android:layout_width="match_parent" 
  16.         android:layout_height="wrap_content" 
  17.         android:text="中止 Service" 
  18.         /> 
  19. </LinearLayout> 
 在AndroidManifest.xml文件中添加16~21行的聲明
 
  
  
           
  
  
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  3.       package="com.android.service.activity" 
  4.       android:versionCode="1" 
  5.       android:versionName="1.0"> 
  6.     <uses-sdk android:minSdkVersion="10" /> 
  7.  
  8.     <application android:icon="@drawable/icon" android:label="@string/app_name"> 
  9.         <activity android:name=".MainActivity" 
  10.                   android:label="@string/app_name"> 
  11.             <intent-filter> 
  12.                 <action android:name="android.intent.action.MAIN" /> 
  13.                 <category android:name="android.intent.category.LAUNCHER" /> 
  14.             </intent-filter> 
  15.         </activity> 
  16.     <service android:name=".ServiceDemo" >    
  17.              <intent-filter> 
  18.                 <action android:name="android.intent.action.MAIN" /> 
  19.                 <category android:name="android.intent.category.LAUNCHER" /> 
  20.             </intent-filter> 
  21.     </service>    
  22.     </application> 
  23. </manifest> 
效果圖:

當點擊按鈕時,前後執行了Service中onCreate()->onStart()這兩個方法,LogCat顯示以下:android

當點擊 按鈕時,Service則執行了onDestroy()方法,LogCat顯示以下:app

當點擊按鈕,進入Settings(設置)->Applications(應用)->Running Services(正在運行的服務)看一下咱們新啓動了的服務,效果圖以下:ide

2 .Context.bindService() 方式啓動:
 
Context.bindService()方式的生命週期:
綁定時,bindService -> onCreate() –> onBind()
調用者退出了,即解綁定時,Srevice就會unbindService –>onUnbind() –> onDestory()
 
用Context.bindService()方法啓動服務,在服務未被建立時,系統會先調用服務的onCreate()方法,接着調用onBind()方法。這個時候調用者和服務綁定在一塊兒,調用者退出了,系統就會先調用服務的onUnbind()方法,接着調用onDestroy()方法。若是調用bindService()方法前服務已經被綁定,屢次調用bindService()方法並不會致使屢次建立服務及綁定(也就是說onCreate()和onBind()方法並不會被屢次調用)。若是調用者但願與正在綁定的服務解除綁定,能夠調用unbindService()方法,調用該方法也會致使系統調用服務的onUnbind()-->onDestroy()方法。
 
②Context.bindService()方式啓動 Service的方法:
綁定Service須要三個參數:bindService(intent, conn, Service.BIND_AUTO_CREATE);
第一個:Intent對象
第二個:ServiceConnection對象,建立該對象要實現它的onServiceConnected()和 onServiceDisconnected()來判斷鏈接成功或者是斷開鏈接
第三個:如何建立Service,通常指定綁定的時候自動建立

 下面是具體的例子:佈局

MainActivity.javathis

  
  
           
  
  
  1. package com.android.bindservice.activity;  
  2.  
  3. import android.app.Activity;  
  4. import android.app.Service;  
  5. import android.content.ComponentName;  
  6. import android.content.Intent;  
  7. import android.content.ServiceConnection;  
  8. import android.os.Bundle;  
  9. import android.os.IBinder;  
  10. import android.util.Log;  
  11. import android.view.View;  
  12. import android.view.View.OnClickListener;  
  13. import android.widget.Button;  
  14.  
  15. public class MainActivity extends Activity {  
  16.     // 聲明Button  
  17.     private Button startBtn,stopBtn,bindBtn,unbindBtn;  
  18.     @Override 
  19.     public void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         // 設置當前佈局視圖  
  22.         setContentView(R.layout.main);  
  23.         // 實例化Button  
  24.         startBtn = (Button)findViewById(R.id.startBtn1);  
  25.         stopBtn = (Button)findViewById(R.id.stopBtn2);  
  26.         bindBtn = (Button)findViewById(R.id.bindBtn3);  
  27.         unbindBtn = (Button)findViewById(R.id.unbindBtn4);  
  28.           
  29.         // 添加監聽器  
  30.         startBtn.setOnClickListener(startListener);  
  31.         stopBtn.setOnClickListener(stopListener);  
  32.         bindBtn.setOnClickListener(bindListener);  
  33.         unbindBtn.setOnClickListener(unBindListener);  
  34.           
  35.     }  
  36.     // 啓動Service監聽器  
  37.     private OnClickListener startListener = new OnClickListener() {  
  38.         @Override 
  39.         public void onClick(View v) {  
  40.             // 建立Intent  
  41.             Intent intent = new Intent();  
  42.             // 設置Class屬性  
  43.             intent.setClass(MainActivity.this, BindService.class);  
  44.             // 啓動該Service  
  45.             startService(intent);  
  46.         }  
  47.     };  
  48.       
  49.     // 中止Service監聽器  
  50.     private OnClickListener stopListener = new OnClickListener() {  
  51.         @Override 
  52.         public void onClick(View v) {  
  53.             // 建立Intent  
  54.             Intent intent = new Intent();  
  55.             // 設置Class屬性  
  56.             intent.setClass(MainActivity.this, BindService.class);  
  57.             // 啓動該Service  
  58.             stopService(intent);  
  59.         }  
  60.     };  
  61.       
  62.    // 鏈接對象  
  63.    private ServiceConnection conn = new ServiceConnection() {  
  64.         @Override 
  65.         public void onServiceConnected(ComponentName name, IBinder service) {  
  66.             Log.i("Service""鏈接成功!");  
  67.         }  
  68.         @Override 
  69.         public void onServiceDisconnected(ComponentName name) {  
  70.             Log.i("Service""斷開鏈接!");  
  71.         }  
  72.     };  
  73.       
  74.     // 綁定Service監聽器  
  75.     private OnClickListener bindListener = new OnClickListener() {  
  76.         @Override 
  77.         public void onClick(View v) {  
  78.             // 建立Intent  
  79.             Intent intent = new Intent();  
  80.             // 設置Class屬性  
  81.             intent.setClass(MainActivity.this, BindService.class);  
  82.            
  83.             // 綁定Service  
  84.             bindService(intent, conn, Service.BIND_AUTO_CREATE);  
  85.         }  
  86.     };  
  87.           
  88.     // 解除綁定Service監聽器  
  89.     private OnClickListener unBindListener = new OnClickListener() {  
  90.         @Override 
  91.         public void onClick(View v) {  
  92.             // 建立Intent  
  93.             Intent intent = new Intent();  
  94.             // 設置Class屬性  
  95.             intent.setClass(MainActivity.this, BindService.class);  
  96.             // 解除綁定Service  
  97.             unbindService(conn);  
  98.         }  
  99.     };    

BindService.javaspa

  
  
           
  
  
  1. package com.android.bindservice.activity;  
  2.  
  3. import android.app.Service;  
  4. import android.content.Intent;  
  5. import android.os.IBinder;  
  6. import android.util.Log;  
  7.  
  8. public class BindService extends Service{  
  9.       
  10.     private static final String TAG="Test";  
  11.       
  12.     //返回null  
  13.     public IBinder onBind(Intent intent) {  
  14.         Log.i(TAG, "Service onBind--->");  
  15.         return null;  
  16.     }  
  17.     // Service建立時調用  
  18.     public void onCreate() {  
  19.         Log.i(TAG, "Service onCreate--->");  
  20.     }  
  21.     // 當客戶端調用startService()方法啓動Service時,該方法被調用  
  22.     public void onStart(Intent intent, int startId) {  
  23.         Log.i(TAG, "Service onStart--->");  
  24.     }  
  25.     // 當Service再也不使用時調用  
  26.     public void onDestroy() {  
  27.         Log.i(TAG, "Service onDestroy--->");  
  28.     }  
  29.     // 當解除綁定時調用  
  30.     public boolean onUnbind(Intent intent) {    
  31.         Log.i(TAG, "Service onUnbind--->");    
  32.         return super.onUnbind(intent);    
  33.     }    
  34. }  
  35.  

main.xmlxml

  
  
           
  
  
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:orientation="vertical" 
  4.     android:layout_width="fill_parent" 
  5.     android:layout_height="fill_parent" 
  6.     > 
  7.     <Button   
  8.         android:text="啓動Service"   
  9.         android:id="@+id/startBtn1"   
  10.         android:layout_width="match_parent"   
  11.         android:layout_height="wrap_content" 
  12.         />    
  13.     <Button   
  14.         android:text="中止Service"   
  15.         android:id="@+id/stopBtn2"   
  16.         android:layout_width="match_parent"   
  17.         android:layout_height="wrap_content" 
  18.         />    
  19.     <Button   
  20.         android:text="綁定Service"   
  21.         android:id="@+id/bindBtn3"   
  22.         android:layout_width="match_parent"   
  23.         android:layout_height="wrap_content" 
  24.         /> 
  25.     <Button   
  26.         android:text="解除綁定"   
  27.         android:id="@+id/unbindBtn4"   
  28.         android:layout_width="match_parent"   
  29.         android:layout_height="wrap_content" 
  30.         /> 
  31. </LinearLayout> 

 在AndroidManifest.xml文件中添加16~21行的聲明對象

  
  
           
  
  
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  3.       package="com.android.bindservice.activity" 
  4.       android:versionCode="1" 
  5.       android:versionName="1.0"> 
  6.     <uses-sdk android:minSdkVersion="10" /> 
  7.  
  8.     <application android:icon="@drawable/icon" android:label="@string/app_name"> 
  9.         <activity android:name=".MainActivity" 
  10.                   android:label="@string/app_name"> 
  11.             <intent-filter> 
  12.                 <action android:name="android.intent.action.MAIN" /> 
  13.                 <category android:name="android.intent.category.LAUNCHER" /> 
  14.             </intent-filter> 
  15.         </activity> 
  16.         <service android:name=".BindService" >    
  17.              <intent-filter> 
  18.                 <action android:name="android.intent.action.MAIN" /> 
  19.                 <category android:name="android.intent.category.LAUNCHER" /> 
  20.             </intent-filter> 
  21.     </service> 
  22.     </application> 
  23. </manifest> 

效果圖:blog

當點擊按鈕時,前後執行了Service中onCreate()->onStart()這兩個方法,LogCat顯示以下:

 

當點擊按鈕,則Service執行了onUnbind()方法,LogCat顯示以下:

 

當點擊按鈕,則Service執行了onUnbind()方法,LogCat顯示以下:

相關文章
相關標籤/搜索