Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android技術基礎 >> 第84章、Service之二(與Activity綁定)(從零開始學Android)

第84章、Service之二(與Activity綁定)(從零開始學Android)

編輯:Android技術基礎

android中的Service(服務)是一個什麼樣的東東呢?如果你對Windows系統中的服務理解,可以認為他們同理。如果你不了解也沒有關系,你只管把Service當成一個沒有界面的Activity就可以了。

Service是運行在後台,是不可見的、沒有界面的東西。你可以啟動一個服務Service來播放音樂,或者記錄你地理信息位置的改變,或者啟動一個服務來運行並一直監聽電話、短信等操作。

既然我們把Service當成一個無界的Activity來看待,那麼它也是運行在主線程,因而不能用它來做耗時的請求或者動作。如果有耗時的操作,那麼同樣需要在服務中開一個線程,在線程中做耗時操作。

1、服務一般分為兩種:

(1)本地服務, Local Service 用於應用程序內部。在Service可以調用Context.startService()啟動,調用Context.stopService()結束。在內部可以調用Service.stopSelf() 或 Service.stopSelfResult()來自己停止。無論調用了多少次startService(),都只需調用一次stopService()來停止。

(2)遠程服務, Remote Service 用於android系統內部的應用程序之間。可以定義接口並把接口暴露出來,以便其他應用進行操作。客戶端建立到服務對象的連接,並通過那個連接來調用服務。調用Context.bindService()方法建立連接,並啟動,以調用 Context.unbindService()關閉連接。多個客戶端可以綁定至同一個服務。如果服務此時還沒有加載,bindService()會先加載它。
提供給可被其他應用復用,比如定義一個天氣預報服務,提供與其他應用調用即可。

2、Service生命周期:

\

Service的生命周期比Activity要簡單一些,僅繼承了onCreate()、onStart()、onDestroy()三個方法。

當我們第一次啟動Service時,先後調用了onCreate()、onStart()這兩個方法;當停止Service時,則執行onDestroy()方法。

如果Service已經啟動了,當我們再次啟動Service時,不會在執行onCreate()方法,而是直接執行onStart()方法。它可以通過Service.stopSelf()方法或者Service.stopSelfResult()方法來停止自己,只要調用一次stopService()方法便可以停止服務,無論調用了多少次的啟動服務方法。

本章案例為Activity與Service綁定用法。

一、設計界面

1、布局文件

打開res/layout/activity_main.xml文件。
輸入以下代碼:

[html] view plain copy  
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout   
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     android:orientation="vertical" >  
  7.   
  8.     <Button  
  9.         android:id="@+id/startservice"  
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"  
  12.         android:text="啟動Service" />  
  13.       
  14.     <Button  
  15.         android:id="@+id/stopservice"  
  16.         android:layout_width="wrap_content"  
  17.         android:layout_height="wrap_content"  
  18.         android:text="停止Service" />  
  19.       
  20.      <Button  
  21.         android:id="@+id/bindservice"  
  22.         android:layout_width="wrap_content"  
  23.         android:layout_height="wrap_content"  
  24.         android:text="綁定Service" />  
  25.       
  26.     <Button  
  27.         android:id="@+id/unbindservice"  
  28.         android:layout_width="wrap_content"  
  29.         android:layout_height="wrap_content"  
  30.         android:text="解除Service" />  
  31.   
  32. </LinearLayout>  


二、程序文件

1、打開“src/com.genwoxue.service/ServiceUtil.java”文件。
然後輸入以下代碼:

[java] view plain copy  
  1. package com.genwoxue.servicebind;  
  2.   
  3. import android.app.Service;  
  4. import android.content.Intent;  
  5. import android.os.Binder;  
  6. import android.os.IBinder;  
  7. import android.util.Log;  
  8.   
  9. public class ServiceUtil extends Service {  
  10.   
  11.     private String TAG="Service:";  
  12.       
  13.     private IBinder binder=new Binder(){  
  14.         @Override  
  15.         public String getInterfaceDescriptor(){  
  16.             return "Service class";  
  17.         }  
  18.     };  
  19.   
  20.       
  21.     @Override   
  22.     public IBinder onBind(Intent intent){  
  23.         Log.i(TAG, "服務開始綁定:onBind() Intent="+intent);  
  24.         return binder;  
  25.     }  
  26.       
  27.     @Override   
  28.     public void onRebind(Intent intent){  
  29.         Log.i(TAG, "服務重新綁定:onRebind() Intent="+intent);  
  30.         super.onRebind(intent);  
  31.     }  
  32.       
  33.     @Override   
  34.     public boolean onUnbind(Intent intent){  
  35.         Log.i(TAG, "服務解除綁定:onUnbind() Intent="+intent);  
  36.         return super.onUnbind(intent);  
  37.     }  
  38.       
  39.     @Override  
  40.     public void onCreate(){  
  41.         Log.i(TAG, "服務開始創建:onCreate()!");  
  42.     }  
  43.       
  44.     @Override  
  45.     public void onDestroy(){  
  46.         Log.i(TAG, "服務銷毀:onDestroy()!");  
  47.     }  
  48.       
  49.     @Override  
  50.     public int onStartCommand(Intent intent,int flags,int startId){  
  51.         Log.i(TAG, "服務啟動:onStart()=>Intent"+intent+",startID="+startId);  
  52.         return Service.START_CONTINUATION_MASK;  
  53.     }  
  54.       

2、打開“src/com.genwoxue.service/MainActivity.java”文件。
輸入以下代碼:

[java] view plain copy  
  1. package com.genwoxue.servicebind;  
  2.   
  3.   
  4. import android.os.Bundle;  
  5. import android.os.IBinder;  
  6. import android.os.RemoteException;  
  7. import android.util.Log;  
  8. import android.view.View;  
  9. import android.view.View.OnClickListener;  
  10. import android.widget.Button;  
  11. import android.app.Activity;  
  12. import android.content.Context;  
  13. import android.content.Intent;  
  14. import android.content.ServiceConnection;  
  15.   
  16. import android.content.ComponentName;  
  17.   
  18. public class MainActivity extends Activity {  
  19.   
  20.       
  21.     private Button btnStart=null;  
  22.     private Button btnStop=null;  
  23.     private Button btnBind=null;  
  24.     private Button btnUnBind=null;  
  25.       
  26.     private String TAG="Service:";  
  27.       
  28.     private ServiceConnection serviceConn=new ServiceConnection(){  
  29.         @Override  
  30.         public void onServiceConnected(ComponentName name,IBinder service){  
  31.             try{  
  32.                   
  33.                 Log.i(TAG,"服務連接成功:service="+service.getInterfaceDescriptor());  
  34.             }catch(RemoteException e){  
  35.                 e.printStackTrace();  
  36.             }  
  37.         }  
  38.           
  39.         @Override  
  40.         public void onServiceDisconnected(ComponentName name){  
  41.             Log.i(TAG,"服務斷開連接!");  
  42.         }  
  43.     };  
  44.       
  45.       
  46.     @Override  
  47.     protected void onCreate(Bundle savedInstanceState) {  
  48.         super.onCreate(savedInstanceState);  
  49.         setContentView(R.layout.activity_main);  
  50.           
  51.         System.out.print("hello");  
  52.         btnStart=(Button)super.findViewById(R.id.startservice);  
  53.         btnStop=(Button)super.findViewById(R.id.stopservice);  
  54.         btnBind=(Button)super.findViewById(R.id.bindservice);  
  55.         btnUnBind=(Button)super.findViewById(R.id.unbindservice);  
  56.           
  57.         btnStart.setOnClickListener(new OnClickListener(){  
  58.             public void onClick(View v)  
  59.             {    
  60.                 Intent intent=new Intent(MainActivity.this,ServiceUtil.class);  
  61.                 MainActivity.this.startService(intent);  
  62.             }  
  63.         });  
  64.           
  65.         btnStop.setOnClickListener(new OnClickListener(){  
  66.             public void onClick(View v)  
  67.             {    
  68.                 Intent intent=new Intent(MainActivity.this,ServiceUtil.class);  
  69.                 MainActivity.this.stopService(intent);  
  70.             }  
  71.         });  
  72.           
  73.           
  74.         btnBind.setOnClickListener(new OnClickListener(){  
  75.             public void onClick(View v)  
  76.             {    
  77.                 Intent service=new Intent(MainActivity.this,ServiceUtil.class);  
  78.                 MainActivity.this.bindService(service,MainActivity.this.serviceConn,Context.BIND_AUTO_CREATE);  
  79.             }  
  80.         });  
  81.           
  82.         btnUnBind.setOnClickListener(new OnClickListener(){  
  83.             public void onClick(View v)  
  84.             {    
  85.                 MainActivity.this.unbindService(MainActivity.this.serviceConn);  
  86.             }  
  87.         });  
  88.           
  89.     }  
  90.   
  91. }  


三、配置文件

打開“AndroidManifest.xml”文件。

然後輸入以下代碼:

[html] view plain copy  
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.genwoxue.servicebind"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk  
  8.         android:minSdkVersion="8"  
  9.         android:targetSdkVersion="15" />  
  10.   
  11.     <application  
  12.         android:allowBackup="true"  
  13.         android:icon="@drawable/ic_launcher"  
  14.         android:label="@string/app_name"  
  15.         android:theme="@style/AppTheme" >  
  16.         <activity  
  17.             android:name="com.genwoxue.servicebind.MainActivity"  
  18.             android:label="@string/app_name" >  
  19.             <intent-filter>  
  20.                 <action android:name="android.intent.action.MAIN" />  
  21.                 <category android:name="android.intent.category.LAUNCHER" />  
  22.             </intent-filter>  
  23.         </activity>  
  24.           <service android:name="com.genwoxue.servicebind.ServiceUtil" />  
  25.     </application>  
  26.   
  27. </manifest>  


注意:由於我們要啟用服務,需要在AndroidManifest.xml文件中添加以下內容:

<service android:name="com.genwoxue.servicebind.ServiceUtil" />

四、運行結果

1、第一步、在LogCat中創建“Service”過濾器

\ \

2、運行Service App

\

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