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
- package import import import import import import import publicclassextends
- publicvoid super new
- publicvoid
- newthis class this }
IAidlService.aidl
- package interface int }
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,由于没有按钮不能多次按,也就会造成得不到想要的结果了。这里总算明白它的一些运行机制了,先写到这里,后面有什么新发现会及时更新。