码迷,mamicode.com
首页 > 移动开发 > 详细

android92 aidl远程进程通信

时间:2015-11-11 20:50:38      阅读:278      评论:0      收藏:0      [点我收藏+]

标签:

技术分享技术分享

 

 05项目RemoteService.java

package com.itheima.remoteservice;
//05项目
import com.itheima.remoteservice.PublicBusiness.Stub;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;

public class RemoteService extends Service {
    @Override
    public IBinder onBind(Intent intent) {
        System.out.println("bind方法");
        return new furong();
    }

    //之前是:class furong extends Binder implements PublicBusiness{
    class furong extends Stub{//直接继承Stub,因为Stub是extends android.os.Binder implements com.itheima.remoteservice.PublicBusiness
        @Override
        public void qianXian() {
            banzheng();
        }
    }
    
    public void banzheng(){
        System.out.println("李局帮你来办证");
    }
}

05项目PublicBusiness.aidl

package com.itheima.remoteservice;

interface PublicBusiness {

    void qianXian();
}

05项目清单文件配置service

<service android:name="com.itheima.remoteservice.RemoteService">
            <intent-filter >
                <action android:name="com.itheima.remote"/>
            </intent-filter>
        </service>

06项目PublicBusiness.aidl

package com.itheima.remoteservice;

interface PublicBusiness {

    void qianXian();
}

06项目MainActivity.java

package com.itheima.runremote;
//06项目
import com.itheima.remoteservice.PublicBusiness;
import com.itheima.remoteservice.PublicBusiness.Stub;

import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

    private MyserviceConn conn;

    PublicBusiness pb;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        conn = new MyserviceConn();
    }

    public void click(View v){
        //启动远程服务
        Intent intent = new Intent();
        intent.setAction("com.itheima.remote");
        startService(intent);
    }
    public void click2(View v){
        //停止远程服务
        Intent intent = new Intent();
        intent.setAction("com.itheima.remote");
        stopService(intent);
    }
    
    public void click3(View v){
        Intent intent = new Intent();
        intent.setAction("com.itheima.remote");
        bindService(intent, conn, BIND_AUTO_CREATE);
    }

    public void click4(View v){
        unbindService(conn);
    }
    class MyserviceConn implements ServiceConnection{
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //把Ibinder中间人对象强转成publicbusiness
            //返回的service是一个furong对象继承 Stub,但是该service对象是05项目的,是传不过来的,
            pb = Stub.asInterface(service);
        }
        @Override
        public void onServiceDisconnected(ComponentName name) {
        }
    }
    
    public void click5(View v){
        try {
            pb.qianXian();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}
###服务的分类
* 本地服务:指的是服务和启动服务的activity在同一个进程中
* 远程服务:指的是服务和启动服务的activity不在同一个进程中(在不同的工程中),隐士启动服务。

###AIDL是Android interface definition language安卓接口定义语言,用于进程间通信技术,默认2个进程是不能通信的,安卓里面不同的应用有自己各自的内存空间,内存之间是不能访问的,linux中通过管道进行进程通信,安卓中也有管道概念,handeler就是管道。06项目想访问05项目的对象的方法就要用进程通信,相当于通过进程通信可以把05项目内存的对象传到06项目的内存进行使用。
1. 把05项目的远程服务的方法抽取成一个单独的接口java文件
2. 把05接口上面的java文件PublicBusiness.java的后缀名改成aidl,在05项目gen中会自动生成PublicBusiness.java
3. 在05项目中自动生成的PublicBusiness.java文件中,有一个静态抽象类Stub,它已经继承了binder类,实现了publicBusiness接口,这个类就是新的中间人
4. 把aidl文件复制粘贴到06项目,粘贴的时候注意,aidl文件所在的包名必须跟05项目中aidl所在的包名一致
5. 在06项目中,强转中间人对象时,直接使用Stub.asInterface()

 

广播接收者比较特殊,既可以在清单文件中注册,也可以直接使用代码注册。

远程服务只能隐式启动,类似隐式启动Activity,在清单文件中配置Service标签时,必须配置intent-filter子节点,并指定action子节点。

应用场景:远程服务中的中间人对象,其他应用是拿不到的,那么在通过绑定服务获取中间人对象时,就无法强制转换,使用aidl,就可以在其他应用中拿到中间人类所实现的接口

 

android92 aidl远程进程通信

标签:

原文地址:http://www.cnblogs.com/yaowen/p/4957248.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!