Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Service的啟動與停止、綁定與解綁,service停止綁定

Service的啟動與停止、綁定與解綁,service停止綁定

編輯:關於android開發

Service的啟動與停止、綁定與解綁,service停止綁定


---恢復內容開始---

  Service的意義就在於當軟件停止之後還可以在背景中進行運行,換句話也就是說,比如一個音樂播放器,當我們退出音樂播放器的時候,還是希望它在背景中運行,也就是一直播放著音樂,這時候Service就派上了大的用途。

  Service的生命周期和Activity的生命周期差不多。也有開啟和停止。onCreate()方法是初始化配置,onDestroy()是釋放所有剩余的資源。Service周期是發生在onCreate()和onDestroy()之間的。

    startService()方法是啟動Service。

    StopService()方法是停止Service。

    bindService()方法是啟動Service的激活生命周期始於onBind()調用,在onUnbind()返回時結束。

  當一個組件啟動Service時,是通過startService()進行啟動Service,當Service被啟動之後,onStartCommand()方法被調用,並且接收startService()方法中傳遞的Intent值。

  onStartServiceCommand()方法必修返回一個整形值。這個整形值是說明了Service在系統中如何執行。其中三個比較常用的解釋如下:

    START_NOT_STICKY:如果系統在onStartServiceCommand()返回後殺死Service,那麼不會重新創建Service,除非有等待的Intent要傳遞。

    START_STICKY 如果系統在onStartServiceCommand()返回後殺死Service,重啟Service,並且重新調用onStartServiceCommand(),但不重新傳遞最新的Intent。

    START_REDELIVER_INTENT 如果系統在onStartServiceCommand()返回後殺死Service,那麼重新創建Service,並且最近傳給Service的Intent調用onStartServiceCommand()。

  創建一個Service啟動周期的實例

  

 1 public class MyService extends Service{
 2     
 3     //必須實現的方法,作用是用來返回binder對象
 4     
 5     
 6     //重寫onBind()方法,返回Service實例,使Service支持綁定,實現onBind()方法,並且返回MyService實例
 7     @Override
 8     public IBinder onBind(Intent intent) {
 9         // TODO Auto-generated method stub
10         System.out.println("--onBind--");
11         return null;
12     }
13     
14     
15     //用於創建Service的方法,只能調用一次
16     public void onCreate(){
17         super.onCreate();
18         System.out.println("--onCreate--");
19 
20     //每次啟動Service時都會調用這個方法
21     @Override
22     public int onStartCommand(Intent intent, int flags, int startId) {
23         // TODO Auto-generated method stub
24         System.out.println("--onStartCommand--");
25         return super.onStartCommand(intent, flags, startId);
26     }
27     
28     //解綁的時候使用的這個方法
29     @Override
30     public boolean onUnbind(Intent intent) {
31         // TODO Auto-generated method stub
32         System.out.println("--onUnbind--");
33         return super.onUnbind(intent);
34     }
35     
36     //退出或者銷毀的時候使用這個方法
37     @Override
38     public void onDestroy() {
39         // TODO Auto-generated method stub
40         serviceRunning = false;
41         System.out.println("--onDestroy--");
42         super.onDestroy();
43         
44     }
45 
46 }

注意:在測試的時候一定要在onCreate()方法中寫一個多線程,以便輸出,讓我們更加的明白。如下:

 1 //用於創建Service的方法,只能調用一次
 2     public void onCreate(){
 3         super.onCreate();
 4         System.out.println("--onCreate--");
 5         serviceRunning = true;
 6         new Thread(){
 7             public void run(){
 8                 while(serviceRunning){
 9                     System.out.println("--Service運行中--");
10                     try{
11                         sleep(1000);
12                     }catch(Exception e){
13                         e.printStackTrace();
14                     }
15                 }
16             }
17         }.start();
18     }

綁定Service

  綁定Service的時候會比較的復雜,其中,看綁定方法bindService(Intent service, ServiceConnection conn, int flags)時大家就可以看出。其中Intent需要傳遞Intent的值,conn是ServiceConnection的實例,flags是所需要的一個標示。下面就為大家解析綁定Service所需要的三個步驟:

 

  第一步:需要在Service中創建一個Binder接口,並且實現:

 

  1. 包含客戶端可以調用public方法

  2. 或返回當前Service的實例--也包含客戶端可以調用的Public方法

  3. 或返回Service持有的其他類型的實例--也包含客戶端可以調用的Public方法

  代碼如下:

 

public class MyBinder extends Binder{
		MyService getService(){
			return MyService.this;
		}
	}

 

  

   第二步:在onBind()中返回Binder實例。

  代碼如下:

 

1 //必須實現的方法,作用是用來返回binder對象
2 //重寫onBind()方法,返回Service實例,使Service支持綁定,實現onBind()方法,並且返回MyService實例
3     @Override
4     public IBinder onBind(Intent intent) {
5         // TODO Auto-generated method stub
6         System.out.println("--onBind--");
7         return null;
8     }

 

  第三步:在客戶端中,從onServiceConnected()回調方法中接收這個Binder,並且使用Binder包含的Service提供的方法。

  比如:

 

 1 public class MyServiceConn implements ServiceConnection{
 2 
 3     MyService.MyBinder binder = null;
 4     
 5     @Override
 6     public void onServiceConnected(ComponentName name, IBinder service) {
 7         // TODO Auto-generated method stub
 8         binder = (MyService.MyBinder)service;
 9     }
10 
11     @Override
12     public void onServiceDisconnected(ComponentName name) {
13         // TODO Auto-generated method stub
14         binder = null;
15     }
16 
17 }

 

  注意:一定要在客戶端中聲明這個實例:

 1 final MyServiceConn myserviceconn = new MyServiceConn(); 

 

  客戶端在合適的時候也可以進行解綁:

 

1 //解除綁定的Service
2         unbind.setOnClickListener(new OnClickListener() {
3             
4             @Override
5             public void onClick(View v) {
6                 // TODO Auto-generated method stub
7                 unbindService(myserviceconn);
8             }
9         });

 

  上述就把Service的啟動、停止、綁定、解綁就完成了,下面的則是客戶端的一些的代碼:

  

 1 import android.app.Activity;
 2 import android.content.ComponentName;
 3 import android.content.Context;
 4 import android.content.Intent;
 5 import android.content.ServiceConnection;
 6 import android.os.Bundle;
 7 import android.os.IBinder;
 8 import android.view.View;
 9 import android.view.View.OnClickListener;
10 import android.widget.Button;
11 
12 public class MainActivity extends Activity {
13 
14     private Button start;
15     private Button stop;
16     private Button bind;
17     private Button unbind;
18     private Intent intent;
19     
20     @Override
21     protected void onCreate(Bundle savedInstanceState) {
22         super.onCreate(savedInstanceState);
23         setContentView(R.layout.activity_main);
24         start = (Button)findViewById(R.id.btn1);
25         stop = (Button)findViewById(R.id.btn2);
26         bind = (Button)findViewById(R.id.btn3);
27         unbind = (Button)findViewById(R.id.btn4);
28         
29         final MyServiceConn myserviceconn = new MyServiceConn();
30         
31         //給按鈕設置事件,以便監聽Service中的變化
32         //開啟service
33         start.setOnClickListener(new OnClickListener() {
34             
35             @Override
36             public void onClick(View v) {
37                 // TODO Auto-generated method stub
38                 intent = new Intent(getApplicationContext(),MyService.class);
39                 startService(intent);
40             }
41         });
42         
43         //結束Service
44         stop.setOnClickListener(new OnClickListener() {
45             
46             @Override
47             public void onClick(View v) {
48                 // TODO Auto-generated method stub
49                 stopService(intent);
50             }
51         });
52         
53         //綁定service服務
54         bind.setOnClickListener(new OnClickListener() {
55             
56             @Override
57             public void onClick(View v) {
58                 // TODO Auto-generated method stub
59                 bindService(intent,myserviceconn,Context.BIND_AUTO_CREATE);
60             }
61         });
62         
63         //解除綁定的Service
64         unbind.setOnClickListener(new OnClickListener() {
65             
66             @Override
67             public void onClick(View v) {
68                 // TODO Auto-generated method stub
69                 unbindService(myserviceconn);
70             }
71         });
72     }
73 
74 
75 }

 

XML文件的代碼(只是一些簡單的按鈕,就不解釋了):

  

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:id="@+id/LinearLayout1"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent"
 6     android:orientation="vertical"
 7     tools:context=".MainActivity" >
 8 
 9     <TextView
10         android:layout_width="wrap_content"
11         android:layout_height="wrap_content"
12         android:text="@string/service" />
13 
14     <Button
15         android:id="@+id/btn1"
16         android:layout_width="wrap_content"
17         android:layout_height="wrap_content"
18         android:text="StartService" />
19 
20     <Button
21         android:id="@+id/btn2"
22         android:layout_width="wrap_content"
23         android:layout_height="wrap_content"
24         android:text="StopService" />
25 
26     <Button
27         android:id="@+id/btn3"
28         android:layout_width="wrap_content"
29         android:layout_height="wrap_content"
30         android:text="bindService" />
31 
32     <Button
33         android:id="@+id/btn4"
34         android:layout_width="wrap_content"
35 android:layout_height="wrap_content" 36 android:text="unBindService" /> 37 38 </LinearLayout>

 

一定要注意在AndroidManifest.xml文件中加上權限:

 

1 <service            android:name="com.example.servicetest.MyService">   
2  </service>

 

  到這裡就完了,有什麼不懂或者不對的地方可以留言,至於截圖,上述的代碼比較詳細,我這裡就不貼出了。

 

 

 

 

 

 

 

 

 

---恢復內容結束---

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