代码改变世界

Android学习之远程绑定调用service

2015-08-28 12:38  指针空间  阅读(507)  评论(0编辑  收藏  举报

http://blog.csdn.net/q1234456gggg_jkjg/article/details/8479070

远程绑定调用service主要是用来不同进程的信息共享。就比如服务器和客户端,在服务器端设置好一个service提供方法或信息,然后客户端可以直 接调用服务器端service提供方法或信息。这里有个前提是客户端必须有和服务器端一份一样的AIDL,然后服务器端在客户端使用的系统上有注册过(也 就是安装运行过一次),之后客户端就可以远程绑定调用服务器端的service了。


具体的步骤如下:

1.首先,是服务器的

  1)创建一个android应用工程  

   

  2)  在主Aitivity所在的包里新建个AIDL文件,这是ADT会自动帮你在gen目录下生成一个和AIDL文件同名的JAVA文件(这里的AidlService.java是下一步骤生成的,这里可以先忽略)

  

  3)如上图所示,创建一个用来使用service的类(AidlService.java)

  具体每个文件的代码如下:

  AidlServerActivity.java

 

[java] view plaincopy
 
  1. package import import import import import import import publicclassextends   
  2.   
  3. publicvoid super new   
  4. publicvoid   
  5. newthis class this }  

 



IAidlService.aidl

 

[java] view plaincopy
 
  1. package interface int }    


 AidlService.java

 

 

[java] view plaincopy
 
  1. package import import import import import publicclassextends privateboolean privateint privateclassextends   
  2. publicintthrows   
  3. return;  
  4. privatevoid );  
  5.   
  6. publicvoid super         new Thread(new Runnable(){ 
  7.             @Override 
  8.             public void run(){ 
  9.                 while(!unrunnable){ 
  10.                     try{ 
  11.                         Thread.sleep(1000); 
  12.                     }catch(InterruptedException e){ 
  13.                     } 
  14.                     count++; 
  15.                     Log.v("AidlService","count:"+count); 
  16.                 }        
  17.             } 
  18.         }).start(); 
  19.         */ ,);  
  20. /* 
  21.     @Override 
  22.     public void onStart(Intent intent, int startId) { 
  23.         Log("service start id=" + startId); 
  24.     } 
  25. */   
  26. public returnnew   
  27. publicvoid true super  
  28.     @Override 
  29.     public boolean onUnbind(Intent intent) { 
  30.         Log("service on unbind"); 
  31.         return super.onUnbind(intent); 
  32.     } 
  33.  
  34.     public void onRebind(Intent intent) { 
  35.         Log("service on rebind"); 
  36.         super.onRebind(intent); 
  37.     } 
  38.     */ }  


布局文件AndroidManifest.xml

 

 

[html] view plaincopy
 
  1. <?xml= =?> <manifest=  
  2. =  
  3. =  
  4. = > <uses-sdk= /> <application =  
  5. = > <activity =  
  6. = > <intent-filter> <action= /> <category= /> </intent-filter> </activity> <service =  
  7. =  
  8. = > <intent-filter>   
  9. <action= /> <category= /> </intent-filter> </service> </application> </manifest>  



 

这里,服务器端的工作做好了,接下来是客户端的工作。


2.接着,是客户端的:

 1)首先,创建一个工程

 

 2)接着,把服务器端的一些文件拷贝过来(创建com.ds.server这个包,然后往里面复制进入如下图的服务器端的文件(IAidlService.java)

 

下面是个文件的内容

    AidlClientActivity.java

   

[java] view plaincopy
 
  1. package import import import import import import import import import import import import import publicclassextends int privatenew publicvoid   
  2.   
  3. , publicvoid   
  4. null ,);  
  5.   
  6.   
  7. publicvoid super final new   
  8. publicvoid   
  9. newclass ifnull try ,+iservice.getType()+ catch else }  


 


 AndroidManifest.xml

 

[html] view plaincopy
 
  1. <?xml= =?> <manifest=  
  2. =  
  3. =  
  4. = > <uses-sdk= /> <application =  
  5. = > <activity =  
  6. = > <intent-filter> <action= /> <category= /> </intent-filter> </activity> </application> </manifest>  

这样客户端的工作也算完了,但这里我还想说下一个问题。

 

你可能会看到在客户端的Activity文件里,有个count的变量,觉得是多余的,但这是为了说明下面这个问题的需要。

最开始的count是0,然后我运行客户端后,鼠标左击bind按钮,会发现LogCat的verbose窗口会显示


为什么没有执行 Log.v("AidlClientActivity","oncreate"+iservice.getType()+" "+count);这一句,然后我再点击下bind


终于出现想要的结果,这里你就会发现count变成1了,也就是之前执行过一次count+1了,这就说明了,第一次只是绑定,返回的 iservice是null,第二次以上才会返回对象。

到这里就是我之前一直错误的地方,是理解错了,我之前写的程序没有按钮,是直接启动客户端后就绑定调用service,由于没有按钮不能多次按,也就会造成得不到想要的结果了。这里总算明白它的一些运行机制了,先写到这里,后面有什么新发现会及时更新。