0
点赞
收藏
分享

微信扫一扫

Pro Android学习笔记(七九):服务(4):远程服务的实现


在上一学习中,我们已经用AIDL定义了Remote Service对外暴露的接口。在编译时,系统会根据AIDL自动生成接口的java文件IStockQuoteSerivce.java,在这个文件中,定义了IStockQuoteService.Stub抽象类,通过继承Binder,实现服务和client之间的传递,通过实现IStockQuoteService,具有服务的接口。

public static abstract class Stub extends android.os.Binder implements IStockQuoteService

Stub是远程服务的关键,从代码中可以推测:stub可以实现client和service之间的请求和结果的传递,service在onBind()中将stub对象返回给client,client对stub对象的操作,就如同操作service的对外接口。

远程服务的实现小例子

继续StockQuote的小例子,下面是远程服务的实现代码。

public class StockQuoteRemoteService extends Service { 
     private static int count = 0; 
     
     /* IStockQuoteService接口文件中含有一个抽象类Stub,在remote service定义内部类继承Stub,具体实现远程服务所要完成的服务内容,具体实现接口代码。本例模拟回复double的股值  */
     private class StockQuoteRemoteServiceImpl extends IStockQuoteService.Stub{ 
         @Override 
         public double getQuote(String ticker) throws RemoteException {
             Log.v("Service Stub","getQuote is called, ticker is " + ticker);
            return 20.0 + (++ count); 
         } 
         
     }  
          
     @Override //service初始化
     public void onCreate() {  
        super.onCreate(); 
         Log.v("RemoteService","onCreate() is called");
     } 

     @Override //service结束
     public void onDestroy() {  
         Log.v("RemoteService","onDestory() is called");
         super.onDestroy(); 
     } 

     @Override //在client通过bindService()请求远程服务时,远程服务触发onBind(),将Stub对象返回给连接 {  
         Log.v("RemoteService","onBind() is called, intent " + intent);         
         return new StockQuoteRemoteServiceImpl();     } 

 } 对外开放远程服务的接口
在AndroidManifest.xml文件中要定义service,允许其他应用通过intent调用相关服务。
<?xml version="1.0" encoding="utf-8"?> 
 <manifest … > 
     … …  
     <application ...> 
         … … 
         <service android:name="StockQuoteRemoteService"> 
             <intent-filter> 
                 <!-- 需要通过intent-filter对外暴露service的接口 -->
                 <action android:name="cn.wei.flowingflying.proandroidservice.IStockQuoteService" />
             </intent-filter> 
         </service> 
</application>  
 </manifest>

对于一个remote service,并不需要activity,不需要activity launch。部署方式和activity一样即可。

本笔记涉及的例子代码,可以在Pro Android学习:Android service小例子中下载。


举报

相关推荐

0 条评论