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
- package
import
import
import
import
import
import
importpublicclassextends
- publicvoid
supernew
- publicvoid
- newthis
classthis
}
IAidlService.aidl
[java] view
plaincopy
- package
interface
int
}
AidlService.java
[java] view
plaincopy
- package
import
import
import
import
importpublicclassextends
privateboolean
privateintprivateclassextends
- publicintthrows
- return;
- privatevoid
, ); - publicvoid
supernew Thread(new Runnable(){
- @Override
- public void run(){
- while(!unrunnable){
- try{
- Thread.sleep(1000);
- }catch(InterruptedException e){
- }
- count++;
- Log.v("AidlService","count:"+count);
- }
- }
- }).start();
- */
,); - /*
- @Override
- public void onStart(Intent intent, int startId) {
- Log("service start id=" + startId);
- }
- */
- public
returnnew
- publicvoid
true
super - @Override
- public boolean onUnbind(Intent intent) {
- Log("service on unbind");
- return super.onUnbind(intent);
- }
- public void onRebind(Intent intent) {
- Log("service on rebind");
- super.onRebind(intent);
- }
- */
}
布局文件AndroidManifest.xml
[html] view
plaincopy
- <?xml= =?>
<manifest= - =
- =
- = >
<uses-sdk= /><application
= - = >
<activity
= - = >
<intent-filter>
<action= /><category= />
</intent-filter>
</activity><service
= - =
- = >
<intent-filter> - <action= />
<category= />
</intent-filter>
</service>
</application></manifest>
这里,服务器端的工作做好了,接下来是客户端的工作。
2.接着,是客户端的:
1)首先,创建一个工程
2)接着,把服务器端的一些文件拷贝过来(创建com.ds.server这个包,然后往里面复制进入如下图的服务器端的文件(IAidlService.java)
下面是个文件的内容
AidlClientActivity.java
[java] view
plaincopy
- package
import
import
import
import
import
import
import
import
import
import
import
import
importpublicclassextends
int
privatenew
publicvoid
- ,
publicvoid
- null
,); - publicvoid
superfinal
new
- publicvoid
- newclass
ifnull
try
,+iservice.getType()+
catchelse
}
AndroidManifest.xml
[html] view
plaincopy
- <?xml= =?>
<manifest= - =
- =
- = >
<uses-sdk= /><application
= - = >
<activity
= - = >
<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,由于没有按钮不能多次按,也就会造成得不到想要的结果了。这里总算明白它的一些运行机制了,先写到这里,后面有什么新发现会及时更新。