AIDL简单使用(通过它跨应用传递对象(数据))

原创
2016/02/20 13:46
阅读数 1.2K

服务端步骤:


1、新建一个包 在包里新建一个接口MyServiceAIDL(接口名自己取)

 

代码

//接口前面不要有public 等 不然会报错
interface MyServiceAIDL {
//这个接口内的方法可以自己根据业务需求自己添加相应的方法
//这里简单建一个getData方法
//方法名前面不要有public 等不然会报错
 String getData();
}

 


2、建完好接口需要到找到你新建的接口类,工程保存路径:右击工程-->properties-->右边有个Location位置
根据该位置找到自己刚刚新建的接口类,然后把后缀名改为.aidl 在回到自己工程刷新一下

 

 

3、在建一个类继承Service

 

代码

 public class MyService extends Service {
 @Override
 public void onCreate() {
  // TODO Auto-generated method stub
  super.onCreate();
 }
 
 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  return new MyBindService();
 }
 
 @Override
 public boolean onUnbind(Intent intent) {
  // TODO Auto-generated method stub
  return super.onUnbind(intent);
 }
 
 @Override
 public void onDestroy() {
  // TODO Auto-generated method stub
  super.onDestroy();
 }
 
 //AIDL --> 要继承Stub 而不是Binder
 //然后还要在配置清单里添加服务(隐式意图)
 class MyBindService extends Stub{
  @Override
  public String getData() throws RemoteException {
   // TODO Auto-generated method stub
   return "(跨进程)服务端返回来的消息";
  }
  
 }
}

 

 

4、在配置清单里注册创建的服务

代码

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.service.aidl"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <!-- android:exported="true"表示可以跨进程访问
        android:enabled="true"表示激活
        action 表示客户端要访问在这里的服务的路径action -->
        <service android:name=".MyService"
            android:enabled="true"
            android:exported="true">
            <intent-filter >
                <action android:name="com.examp.remote.service.MyService"/>
            </intent-filter>
        </service>
        
    </application>
</manifest>

 

 

 

 

 

========================================================

 

 

 

 


服务端写好后写客户端

 

客户端步骤:


1、把服务端新建的接口连同包一起拷贝到客户端的源文件(src)下

 


2、MainActivity.java类


代码

public class MainActivity extends Activity {
 private TextView text_info;
 private MyServiceAIDL myServiceAIDL;//声明自己建的接口对象
 private ServiceConnection connection = new ServiceConnection() {
  @Override
  public void onServiceDisconnected(ComponentName name) {
   // TODO Auto-generated method stub
   
  }
  
  @Override
  public void onServiceConnected(ComponentName name, IBinder binder) {
   //通过Stub.asInterface方法把IBinder返回来的对象转换然后赋值给MyServiceAIDL接口声明的对象
   myServiceAIDL = Stub.asInterface(binder);
   
  }
 };
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  this.text_info = (TextView) this.findViewById(R.id.textview);
  
  bindMyService();//绑定服务
 }
 
 private void bindMyService() {
  Intent intent = new Intent();
  
  //通过隐式意图来绑定服务
  intent.setAction("com.examp.remote.service.MyService");
  bindService(intent, connection, Context.BIND_AUTO_CREATE);
 }
 
 //按钮的事件监听
 public void bindRemoteService(View view){
  try {
   //这里通过自己创建的接口对象来获取服务端的数据
   text_info.setText(myServiceAIDL.getData());
  } catch (RemoteException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
}

 

 

效果图示例:

 

 

 

展开阅读全文
打赏
1
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部