android进程间服务通信示例

android进程间服务通信示例


两个进程间的Service需要进行通信,则需要把对象序列化后进行互相发送
Android提供了一个 AIDL (Android接口定义语言)工具来处理序列化和通信。这种情况下Service需要以aidl文件的方式提供服务接口,AIDL工具将生成一个相应的 java接口,并且在生成的服务接口中包含一个功能调用的stub服务桩类。Service的实现类需要去继承这个 stub服务桩类。Service的onBind方法会返回实现类的对象,之后你就可以使用它了.现在来实现一个HelloWorld级的服务以及在 Activity中使用这个服务。步骤如下:

1.编写aidl文件,在这个文件中提供了服务所提供的方法的接口,文件的扩展名为aidl,在我们的示例中命名为IDataTimeService.aidl文件的内容为如下所示:

Java代码
  1. package  com.services.demo2;  
  2.   
  3. // Declare the interface.   
  4. interface  IDataTimeService {  
  5.     String getCurrentDataTime();  
  6. }  
package com.services.demo2;

// Declare the interface.
interface IDataTimeService {
	String getCurrentDataTime();
}

 

2.编写服务的实现类,在这个示例中为DataTimeService.java,内容如下:

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 getCurrentDataTime() {  
  11.             return  (getCurrentDataTimeImpl());  
  12.         }  
  13.     };  
  14.     synchronized  private  String getCurrentDataTimeImpl() {  
  15.         Date date=new  Date();  
  16.         return  (date.toLocaleString());  
  17.     }  
  18.     @Override   
  19.     public  IBinder onBind(Intent intent)  {  
  20.         return  (binder);  
  21.     }  
  22. }  
public class DataTimeService extends Service{
	public static final String BROADCAST_ACTION = "com.services.demo2.DataTimeServiceEvent";
	/**
	  使用上面定义的字符串常量创建一个Intent的实例,如果服务在运行的过程中发生的事件都可以通过Service的
	  sendBroadcast(broadcast)方法来发送一个广播消息通知Activity,然后有Activity注册的接收者进行处理;
	  */
	private Intent broadcast = new Intent(BROADCAST_ACTION);
	sendBroadcast(broadcast);
	private final IDataTimeService.Stub binder = new IDataTimeService.Stub() {
		public String getCurrentDataTime() {
			return (getCurrentDataTimeImpl());
		}
	};
	synchronized private String getCurrentDataTimeImpl() {
		Date date=new Date();
		return (date.toLocaleString());
	}
	@Override
	public IBinder onBind(Intent intent) {
		return (binder);
	}
}

 

3.现在编写一个Activity,来消费这个服务:

 

Java代码
  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.   
  9.             browser.postDelayed(new  Runnable()   {  
  10.                 public  void  run()   {  
  11.                     updateForecast();  
  12.                 }  
  13.             }, 1000 );  
  14.         }  
  15.   
  16.         public  void  onServiceDisconnected(ComponentName className) {  
  17.             service = null ;  
  18.         }  
  19.     };  
  20.   
  21.     @Override   
  22.     public  void  onCreate(Bundle savedInstanceState) {  
  23.         super .onCreate(savedInstanceState);  
  24.         setContentView(R.layout.main);  
  25.   
  26.         browser = (WebView) findViewById(R.id.webkit);  
  27.         serviceIntent = new  Intent(this , DataTimeServiceImpl.class );  
  28.         //绑定一个服务   
  29.         bindService(serviceIntent, svcConn, BIND_AUTO_CREATE);  
  30.     }  
  31.   
  32.     @Override   
  33.     public  void  onResume() {  
  34.         super .onResume();  
  35.         /**         
  36.           注册广播消息的接收者,在android中服务与Activity的通信依靠广播发送消息,然后由Activity注册的接收者  
  37.           接收到消息,进行相应的处理这里使用DataTimeServiceImpl.BROADCAST_ACTION来过滤,表明它只接收  
  38.           DataTimeService中的调用sendBroadcast(broadcast)发送的广播消息;  
  39.           */   
  40.         registerReceiver(receiver, new  IntentFilter(  
  41.                 DataTimeServiceImpl.BROADCAST_ACTION));  
  42.     }  
  43.   
  44.     @Override   
  45.     public  void  onPause() {  
  46.         super .onPause();  
  47.         unregisterReceiver(receiver);  
  48.     }  
  49.   
  50.     @Override   
  51.     public  void  onDestroy() {  
  52.         super .onDestroy();  
  53.         unbindService(svcConn);  
  54.     }     
  55.       
  56.     private  void  updateForecast() {  
  57.         try  {  
  58.             String page = service.getForecastPage();              
  59.             if  (page != null ) {  
  60.                 browser.loadDataWithBaseURL(null , page, "text/html""UTF-8" ,  
  61.                         null );  
  62.                 browser.postDelayed(new  Runnable() {  
  63.                     public  void  run() {  
  64.                         updateForecast();  
  65.                     }  
  66.                 }, 1000 );  
  67.             }  
  68.         } catch  (final  Throwable t) {  
  69.             svcConn.onServiceDisconnected(null );  
  70.         }  
  71.     }  
  72.   
  73.     //接收者实例   
  74.     private  BroadcastReceiver receiver = new  BroadcastReceiver() {  
  75.         public  void  onReceive(Context context, Intent intent) {  
  76.             runOnUiThread(new  Runnable()  {  
  77.                 public  void  run() {  
  78.                     updateForecast();  
  79.                 }  
  80.             });  
  81.         }  
  82.     };  
  83. }  
http://alex-yang-xiansoftware-com.javaeye.com/blog/607109
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值