android进程间服务通信
16lz
2022-07-08
两个进程间的Service需要进行通信,则需要把对象序列化后进行互相发送。
Android 提供了一个 AIDL (Android接口定义语言)工具来处理序列化和通信。这种情况下Service需要以aidl文件的方式提供服务接口,AIDL工具将生成一个相应的 java接口,并且在生成的服务接口中包含一个功能调用的stub服务桩类。Service的实现类需要去继承这个 stub服务桩类。Service的onBind方法会返回实现类的对象,之后你就可以使用它了.现在来实现一个HelloWorld级的服务以及在 Activity中使用这个服务。步骤如下:
1.编写aidl文件,在这个文件中提供了服务所提供的方法的接口,文件的扩展名为aidl,在我们的示例中命名为IDataTimeService.aidl文件的内容为如下所示:
Java代码- package com.services.demo2;
- //Declaretheinterface.
- interface IDataTimeService{
- StringgetCurrentDataTime();
- }
- package com.services.demo2;
- //Declaretheinterface.
- interface IDataTimeService{
- StringgetCurrentDataTime();
- }
2.编写服务的实现类,在这个示例中为DataTimeService.java,内容如下:
Java代码- public class DataTimeService extends Service{
- public static final StringBROADCAST_ACTION= "com.services.demo2.DataTimeServiceEvent" ;
- /**
- 使用上面定义的字符串常量创建一个Intent的实例,如果服务在运行的过程中发生的事件都可以通过Service的
- sendBroadcast(broadcast)方法来发送一个广播消息通知Activity,然后有Activity注册的接收者进行处理;
- */
- private Intentbroadcast= new Intent(BROADCAST_ACTION);
- sendBroadcast(broadcast);
- private final IDataTimeService.Stubbinder= new IDataTimeService.Stub(){
- public StringgetCurrentDataTime(){
- return (getCurrentDataTimeImpl());
- }
- };
- synchronized private StringgetCurrentDataTimeImpl(){
- Datedate= new Date();
- return (date.toLocaleString());
- }
- @Override
- public IBinderonBind(Intentintent){
- return (binder);
- }
- }
- public class DataTimeService extends Service{
- public static final StringBROADCAST_ACTION= "com.services.demo2.DataTimeServiceEvent" ;
- /**
- 使用上面定义的字符串常量创建一个Intent的实例,如果服务在运行的过程中发生的事件都可以通过Service的
- sendBroadcast(broadcast)方法来发送一个广播消息通知Activity,然后有Activity注册的接收者进行处理;
- */
- private Intentbroadcast= new Intent(BROADCAST_ACTION);
- sendBroadcast(broadcast);
- private final IDataTimeService.Stubbinder= new IDataTimeService.Stub(){
- public StringgetCurrentDataTime(){
- return (getCurrentDataTimeImpl());
- }
- };
- synchronized private StringgetCurrentDataTimeImpl(){
- Datedate=new Date();
- return (date.toLocaleString());
- }
- @Override
- public IBinderonBind(Intentintent){
- return (binder);
- }
- }
3.现在编写一个Activity,来消费这个服务:
Java代码- public class ServicesDemo2 extends Activity{
- private IDataTimeServiceservice= null ;
- private IntentserviceIntent= null ;
- private WebViewbrowser;
- private ServiceConnectionsvcConn= new ServiceConnection(){
- public void onServiceConnected(ComponentNameclassName,IBinderbinder){
- service=IDataTimeService.Stub.asInterface(binder);
- browser.postDelayed( new Runnable(){
- public void run(){
- updateForecast();
- }
- }, 1000 );
- }
- public void onServiceDisconnected(ComponentNameclassName){
- service= null ;
- }
- };
- @Override
- public void onCreate(BundlesavedInstanceState){
- super .onCreate(savedInstanceState);
- setContentView(R.layout.main);
- browser=(WebView)findViewById(R.id.webkit);
- serviceIntent= new Intent( this ,DataTimeServiceImpl. class );
- //绑定一个服务
- bindService(serviceIntent,svcConn,BIND_AUTO_CREATE);
- }
- @Override
- public void onResume(){
- super .onResume();
- /**
- 注册广播消息的接收者,在android中服务与Activity的通信依靠广播发送消息,然后由Activity注册的接收者
- 接收到消息,进行相应的处理这里使用DataTimeServiceImpl.BROADCAST_ACTION来过滤,表明它只接收
- DataTimeService中的调用sendBroadcast(broadcast)发送的广播消息;
- */
- registerReceiver(receiver, new IntentFilter(
- DataTimeServiceImpl.BROADCAST_ACTION));
- }
- @Override
- public void onPause(){
- super .onPause();
- unregisterReceiver(receiver);
- }
- @Override
- public void onDestroy(){
- super .onDestroy();
- unbindService(svcConn);
- }
- private void updateForecast(){
- try {
- Stringpage=service.getForecastPage();
- if (page!= null ){
- browser.loadDataWithBaseURL( null ,page, "text/html" , "UTF-8" ,
- null );
- browser.postDelayed( new Runnable(){
- public void run(){
- updateForecast();
- }
- }, 1000 );
- }
- } catch ( final Throwablet){
- svcConn.onServiceDisconnected( null );
- }
- }
- //接收者实例
- private BroadcastReceiverreceiver= new BroadcastReceiver(){
- public void onReceive(Contextcontext,Intentintent){
- runOnUiThread( new Runnable(){
- public void run(){
- updateForecast();
- }
- });
- }
- };
- }
更多相关文章
- 浅析android通过jni控制service服务程序的简易流程
- Android四大基本组件介绍与生命周期
- Android(安卓)Service AIDL
- 第三章 Android程序设计基础
- Android架构分析之使用自定义硬件抽象层(HAL)模块
- android 定位服务
- 【安卓笔记】android客户端与服务端交互的三种方式
- android手机客户端上传文件,java servlet服务器端接收并保存到服
- Android(安卓)开机自启动程序