Welcome 微信登录

首页 / 操作系统 / Linux / Android 使用 aidl 文件创建服务示例

Android中的服务与其他软件的服务可能有些不同,它用来实现在后台执行长期的任务,并且与前台界面解耦.现在来实现一个HelloWorld级的服务以及使用这个服务,创建一个服务的步骤如下: 1.编写aidl文件,在这个文件中提供了服务所提供的方法的接口,文件的扩展名为aidl,在我们的示例中命名为IDataTimeService.aidl文件的内容为如下所示:
  1. package com.services.demo2;  
  2. interface IDataTimeService {  
  3.   String getForecastPage();  
  4. }  
2.编写服务的实现类,在这个示例中为DataTimeService.java,内容如下:
  1. public class DataTimeService extends Service{  
  2. public static final String BROADCAST_ACTION = "com.services.demo2.DataTimeServiceEvent";  
  3. /** 
  4. 使用上面定义的字符串常量创建一个Intent的实例,如果服务在运行的过程中发生的事件都可以通过Service的 
  5. sendBroadcast(broadcast)方法来发送一个广播消息通知Activity,然后有Activity注册的接收者进行处理; 
  6. */  
  7. private Intent broadcast = new Intent(BROADCAST_ACTION);  
  8. sendBroadcast(broadcast);  
  9.      private final IDataTimeService.Stub binder = new IDataTimeService.Stub() {  
  10.      public String getForecastPage() {  
  11.        return (getForecastPageImpl());  
  12.      }  
  13. };  
  14. synchronized private String getForecastPageImpl() {  
  15.      Date date=new Date();  
  16.      return (date.toLocaleString());  
  17. }  
  18.   
  19. @Override  
  20. public IBinder onBind(Intent intent) {  
  21.   return (binder);  
  22. }  
  23. }  
3.现在编写一个Activity,来消费这个服务:
  1. public class ServicesDemo2 extends Activity {  
  2. private IDataTimeService service = null;  
  3. private Intent serviceIntent = null;  
  4. private WebView browser;  
  5. private ServiceConnection svcConn = new ServiceConnection() {  
  6. public void onServiceConnected(ComponentName className, IBinder binder) {  
  7. service = IDataTimeService.Stub.asInterface(binder);  
  8.      browser.postDelayed(new Runnable() {  
  9.          public void run() {  
  10.            updateForecast();  
  11.          }  
  12.      }, 1000);  
  13. }  
  14.   
  15. public void onServiceDisconnected(ComponentName className) {  
  16.   service = null;  
  17. }  
  18. };  
  19.   
  20. @Override  
  21. public void onCreate(Bundle savedInstanceState) {  
  22.      super.onCreate(savedInstanceState);  
  23.      setContentView(R.layout.main);  
  24.      browser = (WebView) findViewById(R.id.webkit);  
  25.      serviceIntent = new Intent(this, DataTimeServiceImpl.class);  
  26.      //绑定一个服务   
  27.      bindService(serviceIntent, svcConn, BIND_AUTO_CREATE);  
  28. }  
  29.   
  30. @Override  
  31.   
  32. public void onResume() {  
  33.   super.onResume();  
  34.     /** 
  35. 注册广播消息的接收者,在android中服务与Activity的通信依靠广播发送消息,然后由Activity注册的接收者 
  36. 接收到消息,进行相应的处理这里使用DataTimeServiceImpl.BROADCAST_ACTION来过滤,表明它只接收 
  37. DataTimeService中的调用sendBroadcast(broadcast)发送的广播消息; 
  38. */  
  39. registerReceiver(receiver, new IntentFilter(  
  40.   DataTimeServiceImpl.BROADCAST_ACTION));  
  41. }  
  42.   
  43. @Override  
  44. public void onPause() {  
  45.      super.onPause();  
  46.      unregisterReceiver(receiver);  
  47. }  
  48.   
  49. @Override  
  50. public void onDestroy() {  
  51.      super.onDestroy();  
  52.      unbindService(svcConn);  
  53. }  
  54.   
  55. private void updateForecast() {  
  56. try {  
  57. String page = service.getForecastPage();  
  58. if (page != null) {  
  59. browser.loadDataWithBaseURL(null, page, "text/html""UTF-8",null);  
  60.      browser.postDelayed(new Runnable() {  
  61.          public void run() {  
  62.            updateForecast();  
  63.          }  
  64.   
  65.      }, 1000);  
  66. }  
  67. catch (final Throwable t) {  
  68.   svcConn.onServiceDisconnected(null);  
  69. }  
  70. }  
  71.   
  72. //接收者实例   
  73. private BroadcastReceiver receiver = new BroadcastReceiver() {  
  74. public void onReceive(Context context, Intent intent) {  
  75. runOnUiThread(new Runnable() {  
  76. public void run() {  
  77.   updateForecast();  
  78. }  
  79. });  
  80. }  
  81. };  
  82. }