AIDL服务(跨进程访问)

(来自《安卓开发中文网》)

在这里简单的整理总结,只说明基本用法:

概述:Android系统中进程之间不能共享内存。为了使其他的应用程序可以访问本应用程序提供的服务,Android系统采用了运城过程调用(RPC)方式来实现,使用一种接口定义语言(IDL)来公开服务的接口。这种可以跨进程访问的服务称为AIDL。

建立AIDL服务的步骤(Eclipse):
1、在工程的java包目录中建立一个扩展名为aidl的文件;
2、如果aidl文件的内容正确,ADT会自动生成一个java接口文件(*.java);
3、建立一个服务类(Service的子类);
4、实现由aidl文件生成的java接口;
5、在AndroidManifest.xml文件中配置AIDL服务。标签中android:name的属性值就是客户端要引用该服务的ID,也就是Intent类的参数值。

示例:
1、建立IMyService.aidl文件(一定要手动加上包名)

 interface IMyService {
   String getValue();
  }

文件内容与java代码相似,但不能加修饰符(例如,public、private)和AIDL服务不支持的数据类型(例如,InputStresm、OutputStream)等内容;
2、ADT自动生成IMyService.java文件;
3、新建一个MyService类继承自Service,在类中定义一个内嵌类(MyServiceImpl),该类是IMyService.Stub的子类。

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

public class MyService extends Service {

    public class MyServiceImpl extends Stub {

        @Override
        public String getValue() throws RemoteException {
            return "Android is very powerful";
        }

    }

    @Override
    public IBinder onBind(Intent intent) {
    // 必须返回MyServiceImpl类的对象实例,否则客户端无法获得服务对象
        return new MyServiceImpl();
    }

}

4、配置

<service android:name="MyService">
            <intent-filter >
                <action android:name="包名.IMyService"/>
            </intent-filter>
        </service>

5、编写客户端代码
新建一个工程,并将自动生成的IMyService.java文件连同包目录一起复制到新工程下。

public class MainActivity extends Activity implements OnClickListener{

    private IMyService myService = null;
    private TextView textView;
    private static String TAG = "MainActivity";
    private Button btn_invoke, btn_bind;

    private ServiceConnection serviceConnection = new ServiceConnection() {

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            myService = Stub.asInterface(service);
            btn_invoke.setEnabled(true);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn_invoke = (Button) findViewById(R.id.btn_invoke);
        btn_bind = (Button) findViewById(R.id.btn_bind);

        btn_invoke.setEnabled(false);

        textView = (TextView) findViewById(R.id.tv_text);

        btn_invoke.setOnClickListener(this);
        btn_bind.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btn_invoke:
            try {
                textView.setText(myService.getValue());
            } catch (Exception e) {
            }
            break;
        case R.id.btn_bind:
            // 绑定AIDL服务
            bindService(new Intent("包名.IMyService"),
                    serviceConnection, Context.BIND_AUTO_CREATE);

        default:
            break;
        }
    }
}

6、运行AIDL服务程序,然后运行客户端程序,单击bind按钮,如果绑定成功,invoke按钮变为可选状态,单击invoke按钮,会输出getValue方法的值,显示在TextView上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值