android进程间服务通信
16lz
2022-06-20
两个进程间的Service需要进行通信,则需要把对象序列化后进行互相发送。
Android提供了一个 AIDL (Android接口定义语言)工具来处理序列化和通信。这种情况下Service需要以aidl文件的方式提供服务接口,AIDL工具将生成一个相应的java接口,并且在生成的服务接口中包含一个功能调用的stub服务桩类。Service的实现类需要去继承这个 stub服务桩类。Service的onBind方法会返回实现类的对象,之后你就可以使用它了.现在来实现一个HelloWorld级的服务以及在Activity中使用这个服务。步骤如下:
1.编写aidl文件,在这个文件中提供了服务所提供的方法的接口,文件的扩展名为aidl,在我们的示例中命名为IDataTimeService.aidl文件的内容为如下所示:
Java代码- packagecom.services.demo2;
- //Declaretheinterface.
- interfaceIDataTimeService{
- StringgetCurrentDataTime();
- }
package com.services.demo2;// Declare the interface.interface IDataTimeService {String getCurrentDataTime();}
2.编写服务的实现类,在这个示例中为DataTimeService.java,内容如下:
Java代码- publicclassDataTimeServiceextendsService{
- publicstaticfinalStringBROADCAST_ACTION="com.services.demo2.DataTimeServiceEvent";
- /**
- 使用上面定义的字符串常量创建一个Intent的实例,如果服务在运行的过程中发生的事件都可以通过Service的
- sendBroadcast(broadcast)方法来发送一个广播消息通知Activity,然后有Activity注册的接收者进行处理;
- */
- privateIntentbroadcast=newIntent(BROADCAST_ACTION);
- sendBroadcast(broadcast);
- privatefinalIDataTimeService.Stubbinder=newIDataTimeService.Stub(){
- publicStringgetCurrentDataTime(){
- return(getCurrentDataTimeImpl());
- }
- };
- synchronizedprivateStringgetCurrentDataTimeImpl(){
- Datedate=newDate();
- return(date.toLocaleString());
- }
- @Override
- publicIBinderonBind(Intentintent){
- return(binder);
- }
- }
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());}@Overridepublic IBinder onBind(Intent intent) {return (binder);}}
3.现在编写一个Activity,来消费这个服务:
Java代码- publicclassServicesDemo2extendsActivity{
- privateIDataTimeServiceservice=null;
- privateIntentserviceIntent=null;
- privateWebViewbrowser;
- privateServiceConnectionsvcConn=newServiceConnection(){
- publicvoidonServiceConnected(ComponentNameclassName,IBinderbinder){
- service=IDataTimeService.Stub.asInterface(binder);
- browser.postDelayed(newRunnable(){
- publicvoidrun(){
- updateForecast();
- }
- },1000);
- }
- publicvoidonServiceDisconnected(ComponentNameclassName){
- service=null;
- }
- };
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- browser=(WebView)findViewById(R.id.webkit);
- serviceIntent=newIntent(this,DataTimeServiceImpl.class);
- //绑定一个服务
- bindService(serviceIntent,svcConn,BIND_AUTO_CREATE);
- }
- @Override
- publicvoidonResume(){
- super.onResume();
- /**
- 注册广播消息的接收者,在android中服务与Activity的通信依靠广播发送消息,然后由Activity注册的接收者
- 接收到消息,进行相应的处理这里使用DataTimeServiceImpl.BROADCAST_ACTION来过滤,表明它只接收
- DataTimeService中的调用sendBroadcast(broadcast)发送的广播消息;
- */
- registerReceiver(receiver,newIntentFilter(
- DataTimeServiceImpl.BROADCAST_ACTION));
- }
- @Override
- publicvoidonPause(){
- super.onPause();
- unregisterReceiver(receiver);
- }
- @Override
- publicvoidonDestroy(){
- super.onDestroy();
- unbindService(svcConn);
- }
- privatevoidupdateForecast(){
- try{
- Stringpage=service.getForecastPage();
- if(page!=null){
- browser.loadDataWithBaseURL(null,page,"text/html","UTF-8",
- null);
- browser.postDelayed(newRunnable(){
- publicvoidrun(){
- updateForecast();
- }
- },1000);
- }
- }catch(finalThrowablet){
- svcConn.onServiceDisconnected(null);
- }
- }
- //接收者实例
- privateBroadcastReceiverreceiver=newBroadcastReceiver(){
- publicvoidonReceive(Contextcontext,Intentintent){
- runOnUiThread(newRunnable(){
- publicvoidrun(){
- updateForecast();
- }
- });
- }
- };
- }
更多相关文章
- Android中的GPS应用开发入门教程
- Android客户端采用Http 协议Post方式请求与服务端进行数据交互
- PC客户端与Android实现图片传送
- android Camera模块分析
- android上传图片至服务器
- Android读取服务端TXT(JSON格式数据)返回汉字乱码的问题
- android 窃听电话
- Android(安卓)绑定远程Service(此Service开启在另外一个进程中)
- [Android(安卓)Pro] Notification的使用