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.   }  

相关内容