标签:
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
-
package
import
import
import
import
import
import
import
publicclassextends
-
-
publicvoid
super
new
-
publicvoid
-
newthis
class
this
}
IAidlService.aidl
AidlService.java
-
package
import
import
import
import
import
publicclassextends
privateboolean
privateint
privateclassextends
-
publicintthrows
-
return;
-
privatevoid
, );
-
-
publicvoid
super
new 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
-
<?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
-
package
import
import
import
import
import
import
import
import
import
import
import
import
import
publicclassextends
int
privatenew
publicvoid
-
-
,
publicvoid
-
null
,);
-
-
-
publicvoid
super
final
new
-
publicvoid
-
newclass
ifnull
try
,+iservice.getType()+
catch
else
}
AndroidManifest.xml
-
<?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,由于没有按钮不能多次按,也就会造成得不到想要的结果了。这里总算明白它的一些运行机制了,先写到这里,后面有什么新发现会及时更新。
Android学习之远程绑定调用service
标签:
原文地址:http://www.cnblogs.com/seven-sky/p/4766196.html