Android学习之远程绑定调用service

简介:

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 plain copy
  1. package com.ds.server;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9. import android.widget.Toast;  
  10.   
  11. public class AidlServerActivity extends Activity {  
  12.     /** Called when the activity is first created. */  
  13.     @Override  
  14.     public void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.main);  
  17.         Button bt = (Button) findViewById(R.id.bt);  
  18.         bt.setOnClickListener(new OnClickListener() {  
  19.   
  20.             @Override  
  21.             public void onClick(View v) {  
  22.                 // TODO Auto-generated method stub  
  23.                 Intent service = new Intent(AidlServerActivity.this,  
  24.                         AidlService.class);  
  25.                 startService(service);  
  26.                 Toast.makeText(AidlServerActivity.this"service started",  
  27.                         Toast.LENGTH_LONG).show();  
  28.             }     
  29.   
  30.         });    
  31.   
  32.     }  
  33. }  



IAidlService.aidl

[java]  view plain copy
  1. package com.ds.server;  
  2. interface IAidlService {    
  3.     int getType();   
  4. }    

 AidlService.java

[java]  view plain copy
  1. package com.ds.server;  
  2.   
  3. import android.app.Service;  
  4. import android.content.Intent;  
  5. import android.os.IBinder;  
  6. import android.os.RemoteException;  
  7. import android.util.Log;  
  8.   
  9. public class AidlService extends Service {  
  10.     private boolean unrunnable;  
  11.     private int count;  
  12.   
  13.     private class MyBinder extends IAidlService.Stub {  
  14.   
  15.         @Override  
  16.         public int getType() throws RemoteException {  
  17.             // TODO Auto-generated method stub  
  18.             return 100;  
  19.         }  
  20.     }  
  21.     private void Log(String str) {   
  22.         Log.d("AidlService""------ " + str + "------");  
  23.     }  
  24.   
  25.     @Override  
  26.     public void onCreate() {  
  27.         super.onCreate();  
  28.         /* 
  29.         new Thread(new Runnable(){ 
  30.             @Override 
  31.             public void run(){ 
  32.                 while(!unrunnable){ 
  33.                     try{ 
  34.                         Thread.sleep(1000); 
  35.                     }catch(InterruptedException e){ 
  36.                     } 
  37.                     count++; 
  38.                     Log.v("AidlService","count:"+count); 
  39.                 }        
  40.             } 
  41.         }).start(); 
  42.         */  
  43.         Log.v("RemoteCountService","onCreate");  
  44.         Log("service create");  
  45.           
  46.     }  
  47. /* 
  48.     @Override 
  49.     public void onStart(Intent intent, int startId) { 
  50.         Log("service start id=" + startId); 
  51.     } 
  52. */  
  53.     @Override  
  54.     public IBinder onBind(Intent t) {  
  55.         Log("service on bind");  
  56.         return new MyBinder();  
  57.     }  
  58.   
  59.     @Override  
  60.     public void onDestroy() {  
  61.         Log("service on destroy");  
  62.         unrunnable=true;  
  63.         super.onDestroy();  
  64.     }  
  65.     /* 
  66.  
  67.     @Override 
  68.     public boolean onUnbind(Intent intent) { 
  69.         Log("service on unbind"); 
  70.         return super.onUnbind(intent); 
  71.     } 
  72.  
  73.     public void onRebind(Intent intent) { 
  74.         Log("service on rebind"); 
  75.         super.onRebind(intent); 
  76.     } 
  77.     */  
  78.   
  79. }  

布局文件AndroidManifest.xml

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.ds.server"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk android:minSdkVersion="8" />  
  8.   
  9.     <application  
  10.         android:icon="@drawable/ic_launcher"  
  11.         android:label="@string/app_name" >  
  12.         <activity  
  13.             android:name=".AidlServerActivity"  
  14.             android:label="@string/app_name" >  
  15.             <intent-filter>  
  16.                 <action android:name="android.intent.action.MAIN" />  
  17.   
  18.                 <category android:name="android.intent.category.LAUNCHER" />  
  19.             </intent-filter>  
  20.         </activity>  
  21.   
  22.         <service  
  23.             android:name=".AidlService"  
  24.             android:enabled="true"  
  25.             android:process=":remote" >  
  26.             <intent-filter>  
  27.   
  28.                 <!-- AIDL完整路径名。必须指明,客户端能够通过AIDL类名查找到它的实现类 -->  
  29.                 <action android:name="com.ds.server.IAidlService" />  
  30.                 <category android:name="android.intent.category.DEFAULT" />  
  31.             </intent-filter>  
  32.         </service>  
  33.     </application>  
  34.   
  35. </manifest>  


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


2.接着,是客户端的:

 1)首先,创建一个工程

 

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

 

下面是个文件的内容

    AidlClientActivity.java

   

[java]  view plain copy
  1. package com.ds.client;  
  2.   
  3. import com.ds.server.IAidlService;  
  4.   
  5. import android.app.Activity;  
  6. import android.content.ComponentName;  
  7. import android.content.Intent;  
  8. import android.content.ServiceConnection;  
  9. import android.os.Bundle;  
  10. import android.os.IBinder;  
  11. import android.os.RemoteException;  
  12. import android.util.Log;  
  13. import android.view.View;  
  14. import android.view.View.OnClickListener;  
  15. import android.widget.Button;  
  16. import android.widget.TextView;  
  17.   
  18. public class AidlClientActivity extends Activity {  
  19.   
  20.     IAidlService iservice;   
  21.     int count;  
  22.   
  23.     private ServiceConnection connection = new ServiceConnection() {  
  24.   
  25.         public void onServiceConnected(ComponentName name, IBinder service) {  
  26.             // TODO Auto-generated method stub  
  27.             // 浠庤繙绋媠ervice涓幏寰桝IDL瀹炰緥鍖栧璞�            
  28.             iservice = IAidlService.Stub.asInterface(service);  
  29.             Log.i("Client","Bind Success:" + iservice);  
  30.         }    
  31.   
  32.         public void onServiceDisconnected(ComponentName name) {  
  33.             // TODO Auto-generated method stub  
  34.             iservice = null;  
  35.             Log.i("Client","onServiceDisconnected");  
  36.         }  
  37.     };    
  38.     
  39.     /** Called when the activity is first created. */  
  40.     @Override  
  41.     public void onCreate(Bundle savedInstanceState) {    
  42.         super.onCreate(savedInstanceState);  
  43.         setContentView(R.layout.main);  
  44.         final TextView tv = (TextView) findViewById(R.id.tv);  
  45.         Button bt = (Button) findViewById(R.id.bt);  
  46.         bt.setOnClickListener(new OnClickListener() {  
  47.               
  48.   
  49.             @Override  
  50.             public void onClick(View arg0) {  
  51.                 // TODO Auto-generated method stub  
  52.                 Intent service = new Intent(IAidlService.class.getName());  
  53.                 bindService(service, connection, BIND_AUTO_CREATE);  
  54.                 if (iservice != null) {    
  55.                     try {  
  56.                         Log.v("AidlClientActivity","oncreate"+iservice.getType()+" "+count);  
  57.                     } catch (RemoteException e) {  
  58.                         e.printStackTrace();  
  59.                     }  
  60.                 }  
  61.                 else{  
  62.                     count++;  
  63.                 }  
  64.             }  
  65.   
  66.         });  
  67.   
  68.     }  
  69. }  


 AndroidManifest.xml

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.ds.client"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk android:minSdkVersion="8" />  
  8.   
  9.     <application  
  10.         android:icon="@drawable/ic_launcher"  
  11.         android:label="@string/app_name" >  
  12.         <activity  
  13.             android:name=".AidlClientActivity"  
  14.             android:label="@string/app_name" >  
  15.             <intent-filter>  
  16.                 <action android:name="android.intent.action.MAIN" />  
  17.   
  18.                 <category android:name="android.intent.category.LAUNCHER" />  
  19.             </intent-filter>  
  20.         </activity>  
  21.     </application>  
  22.   
  23. </manifest>  
这样客户端的工作也算完了,但这里我还想说下一个问题。

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

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


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


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

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


相关文章
|
20天前
|
Android开发
Android 11 添加Service服务SELinux问题
Android 11 添加Service服务SELinux问题
42 1
|
2月前
|
XML 缓存 Android开发
Android开发,使用kotlin学习多媒体功能(详细)
Android开发,使用kotlin学习多媒体功能(详细)
105 0
|
4月前
|
Android开发
Android基础知识:请解释Service是什么,它与IntentService的区别是什么?
Android基础知识:请解释Service是什么,它与IntentService的区别是什么?
42 0
|
4月前
|
安全 Linux Android开发
Android安全启动学习(一):AVB校验是什么?
Android安全启动学习(一):AVB校验是什么?
124 0
|
4月前
|
存储 安全 Linux
Android安全启动学习(四):device-mapper-verity (dm-verity)和哈希树
Android安全启动学习(四):device-mapper-verity (dm-verity)和哈希树
134 0
|
20天前
|
Android开发
Android Service Call /dev/xxx SELinux
Android Service Call /dev/xxx SELinux
16 1
|
2天前
|
Android开发 数据库管理
Android如何在Activity和Service之间传递数据
Android如何在Activity和Service之间传递数据
10 3
|
6天前
|
Android开发
Android Service的两种使用方法
Android Service的两种使用方法
12 2
|
19天前
|
网络协议 Shell Android开发
Android 深入学习ADB调试原理(1)
Android 深入学习ADB调试原理(1)
26 1
|
19天前
|
缓存 网络协议 编译器
针对Android系统工程师的C/C++学习目录
针对Android系统工程师的C/C++学习目录
6 0