AndroidServiceActivity三種交互方式_第1頁
AndroidServiceActivity三種交互方式_第2頁
AndroidServiceActivity三種交互方式_第3頁
AndroidServiceActivity三種交互方式_第4頁
AndroidServiceActivity三種交互方式_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、android SDK 提供了 Service ,用于類似 *nix 守護進程或者 windows 的服務ervice 有兩種類型:本地服務( Local Service ):用于應用程序內(nèi)部遠程服務( Remote Sercie ):用于 android 系統(tǒng)內(nèi)部的應用程序之間前者用于實現(xiàn)應用程序自己的一些耗時任務,比如查詢升級信息,并不 占用應用程序比如 Activity 所屬線程,而是單開線程后臺執(zhí)行,這樣用戶體驗 比較好。后者可被其他應用程序復用, 比如天氣預報服務, 其他應用程序不需要 再寫這樣的服務,調(diào)用已有的即可。編寫不需和 Activity 交互的本地服務示例 本地服務編寫比較

2、簡單。首先,要創(chuàng)建一個 Service 類,該類繼承 android 的 Service 類。這里寫了一個計數(shù)服務的類,每秒鐘為計數(shù)器加一。在 服務類的內(nèi)部,還創(chuàng)建了一個線程,用于實現(xiàn)后臺執(zhí)行上述業(yè)務邏輯。Java 代碼:1. package eoe.easymorse;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 CountService extends Serv

3、ice 9.10.private boolean threadDisable;11.12.private int count;13.14. Override15. public IBinder onBind(Intent intent) 16. return null ;17. 18.19. Override20. public void onCreate() 21. super .onCreate();22. new Thread( new Runnable() 23.24. Override25. public void run() 26. while ( ! threadDisable)

4、 27. try 28. Thread.sleep( 1000 );29. catch (InterruptedException e) 30. 31. count + ;32. Log.v( " CountService " , " Count is " + count);33. 34. 35. ).start();36. 37.38. Override39. public void onDestroy() 40. super .onDestroy();41. this .threadDisable = true ;42. Log.v( "

5、CountService " , " on destroy " );43. 44.45. public int getCount() 46. return count;47. 48. 復制代碼需要將該服務注冊到配置文件 AndroidManifest.xml 中,否則無法找到: Java 代碼:1. <? xml version="1.0" encoding="utf-8" ?>2. < manifest xmlns:android="3. package ="com.easymorse

6、"4. android:versionCode ="1"5. android:versionName ="1.0" >6. < application android:icon ="drawable/icon" android:label ="string/app_name" >7. < activity android:name =".LocalServiceDemoActivity"8. android:label ="string/app_nam

7、e" >9. < intent-filter >10. < action android:name ="ent.action.MAIN" />11. < category android:name ="ent.category.LAUNCHER" />12. </ intent-filter >13. </ activity >14. < service android:name ="CountService"

8、 />15. </ application >16. < uses-sdk android:minSdkVersion ="3" />17. </ manifest/>復制代碼在 Activity 中啟動和關(guān)閉本地服務。Java 代碼:1. package eoe.easymorse;2.3. import android.app.Activity;4. import android.content.Intent;5. import android.os.Bundle;6.7. public class LocalServiceDe

9、moActivity extends Activity 8. /* Called when the activity is first created. */9. Override10. public void onCreate(Bundle savedInstanceState) 11. super .onCreate(savedInstanceState);12. setContentView(R.layout.main);13.14. this .startService( new Intent( this , CountService. class );15. 16.17.Overri

10、de18. protected void onDestroy() 19. super .onDestroy();20. this .stopService( new Intent( this , CountService. class );21. 22. 復制代碼可通過日志查看到后臺線程打印的計數(shù)內(nèi)容。編寫本地服務和 Activity 交互的示例上面的示例是通過 startService 和 stopService 啟動關(guān)閉服務的。 適用 于服務和 activity 之間沒有調(diào)用交互的情況。如果之間需要傳遞參數(shù)或者方法 調(diào)用。需要使用 bind 和 unbind 方法。具體做法是,服務類需要增

11、加接口,比如 ICountService ,另外,服務 類需要有一個內(nèi)部類, 這樣可以方便訪問外部類的封裝數(shù)據(jù), 這個內(nèi)部類需要繼 承 Binder 類并實現(xiàn) ICountService 接口。還有,就是要實現(xiàn) Service 的 onBind 方法,不能只傳回一個 null 了。這是新建立的接口代碼:Java 代碼:1. package eoe.easymorse;2.3. public interface ICountService 4. public abstract int getCount();5. 6.7.8. 修改后的 CountService 代碼:9.10.package c

12、om.easymorse;11.12.import android.app.Service;13.import android.content.Intent;14.import android.os.Binder;15.import android.os.IBinder;16.import android.util.Log;17.18. public class CountService extends Service implements ICountService 19.20.private boolean threadDisable;21.22.private int count;23.

13、24.private ServiceBinder serviceBinder = new ServiceBinder();25.26. public class ServiceBinder extends Binder implementsICountService27. Override28. public int getCount() 29. return count;30.31. 32.33. 34.35.Override36.37. public IBinder onBind(Intent intent) 38. return serviceBinder;39. 40.41. Over

14、ride42. public void onCreate() 43. super .onCreate();44. new Thread( new Runnable() 45.46. Override47. public void run() 48. while ( ! threadDisable) 49. try 50. Thread.sleep( 1000 );51. catch (InterruptedException e) 52. 53. count + ;54. Log.v( " CountService " , " Count is " +

15、count);55. 56. 57. ).start();58. 59.60. Override61. public void onDestroy() 62. super .onDestroy();63. this .threadDisable = true ;64. Log.v( " CountService " , " on destroy " );65. 66.67. /* (non-Javadoc)68. * see com.easymorse.ICountService#getCount()69. */70. public int getCou

16、nt() 71. return count;72. 73.74.復制代碼服務的注冊也要做改動, AndroidManifest.xml 文件:Java 代碼:1. <? xml version="1.0" encoding="utf-8" ?>2. < manifest xmlns:android ="3. package ="com.easymorse" android:versionCode ="1" android:versionName ="1.0" >

17、4. < application android:icon ="drawable/icon" android:label ="string/app_name" >5. < activity android:name =".LocalServiceDemoActivity"6. android:label ="string/app_name" >7. < intent-filter >8. < action android:name ="ent

18、.action.MAIN" />9. < category android:name ="ent.category.LAUNCHER" />10. </ intent-filter >11. </ activity >12. < service android:name ="CountService" >13. < intent-filter >14. < action android:name ="com.easymorse.CountSe

19、rvice" />15. </ intent-filter >16. </ service >17. </ application >18. < uses-sdk android:minSdkVersion ="3" />19. </ manifest >復制代碼Acitity 代碼不再通過 startSerivce 和 stopService 啟動關(guān)閉服務, 另 外,需要通過 ServiceConnection 的內(nèi)部類實現(xiàn)來連接 Service 和 Activity 。Java 代碼:1. pa

20、ckage eoe.easymorse;2.3. import android.app.Activity;4. import android.content.ComponentName;5. import android.content.Intent;6. import android.content.ServiceConnection;7. import android.os.Bundle;8. import android.os.IBinder;9. import android.util.Log;10.11.public class LocalServiceDemoActivity ex

21、tends Activity 12.13. private ServiceConnection serviceConnection = new ServiceConnection() 14.15.Override16. public void onServiceConnected(ComponentName name, IBinder service) 17. countService = (ICountService) service;18. Log.v( " CountService " , " on serivce connected, count is &

22、quot;19. + countService.getCount();20. 21.22. Override23. public void onServiceDisconnected(ComponentName name) 24. countService = null ;25. 26.27. ;28.29.private ICountService countService;30.31./* Called when the activity is first created. */32. Override33. public void onCreate(Bundle savedInstanc

23、eState) 34. super .onCreate(savedInstanceState);35. setContentView(R.layout.main);36. this .bindService( new Intent( " com.easymorse.CountService " ),37. this .serviceConnection, BIND_AUTO_CREATE);38. 39.40. Override41. protected void onDestroy() 42.43.this .unbindService(serviceConnection

24、);44.45. super .onDestroy(); /注意先后46. 47. 復制代碼編寫傳遞基本型數(shù)據(jù)的遠程服務 上面的示例,可以擴展為,讓其他應用程序復用該服務。這樣的服務叫遠程(remote)服務,實際上是進程間通信(RPC 。這時需要使用an droid接口描述語言(AIDL)來定義遠程服務的接口, 而不是上述那樣簡單的 java 接口。擴展名為 aidl 而不是 java ??捎蒙厦娴?ICountService 改動而成 ICountSerivde.aidl,eclipse 會自動生成相關(guān)的 java文件。Java 代碼:1.package com.easymorse;2.3

25、.interface ICountService 4.int getCount();5.復制代碼編寫服務(Service)類,稍有差別,主要在binder是通過遠程獲得的, 需要通過樁(Stub)來獲取。樁對象是遠程對象的本地代理。Java 代碼:1. package eoe.easymorse;2.2. import android.app.Service;3. import android.content.Intent;4. import android.os.IBinder;5. import android.os.RemoteException;6. import android.ut

26、il.Log;8.7. public class CountService extends Service 10.8. private boolean threadDisable;12.9. private int count;14.10. private ICountService.Stub serviceBinder = newICountService.Stub() 16.11. Override12. public int getCount() throws RemoteException 13. return count;14. 22.23. Override24. public I

27、Binder onBind(Intent intent) 25. return serviceBinder;26. 27.28. Override29. public void onCreate() 30. super .onCreate();31. new Thread( new Runnable() 32.33.Override34. public void run() 35. while ( ! threadDisable) 36. try 37. Thread.sleep( 1000 );38. catch (InterruptedException e) 39. 40. count

28、+ ;41. Log.v( " CountService " , " Count is " + count);42. 43. 44. ).start();45. 46.47.Override48. public void onDestroy() 49. super .onDestroy();50. this .threadDisable = true ;51. Log.v( " CountService " , " on destroy " );52. 53. 復制代碼配置文件 AndroidManifest.xm

29、l 和上面的類似,沒有區(qū)別。中的在 Activity 中使用服務的差別不大, 只需要對 ServiceConnection 調(diào)用遠程服務的方法時,要捕獲異常。Java 代碼:1. private ServiceConnection serviceConnection = new ServiceConnection() 2.3. Override4. public void onServiceConnected(ComponentName name, IBinder service) 5. countService = (ICountService) service;6. try 7. Log.

30、v( " CountService " , " on serivce connected, count is "8. + countService.getCount();9. catch (RemoteException e) 10. throw new RuntimeException(e);11. 12. 13.14. Override15. public void onServiceDisconnected(ComponentName name) 16. countService = null ;17. 18.19. ;復制代碼這樣就可以在同一個應用程序中使用遠程服務的方式和自己定義的服務 交互了。如果是另外的應用程序使用遠程服務, 需要做的是復制上面的 aidl 文件 和相應的包構(gòu)到應用程序中,其他調(diào)用等都一樣。編寫傳遞復雜數(shù)據(jù)類型的遠程服務 遠程服務往往不只是傳遞 java 基本數(shù)據(jù)類型。這時需要注意 android 的一些限制和規(guī)定:1. android 支持 String 和 CharSequence2. 如果需要在 aidl 中

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論