AIDL实现跨应用调用服务

来源:互联网 发布:淘宝淘金币兑换中心 编辑:程序博客网 时间:2024/06/10 10:51
AIDL服务全称是Android Interface definition Language
其作用是跨应用调用服务,也就是调用别人编写的服务或是自己写服务给别人调用

所以至少要2个程序来完成,一个是定义服务,一个是调用服务

AIDL的编写流程:

服务端:

AIDLServiceDemo.java

1.src下面的包中建立file
编写aidl文件,这个文件和写Java接口基本一样,唯一的区别是第一不支持自定义类型,第二不允许任何修饰符

package com.example.aidlservicedemo;

interface MyServiceInterface{
    void sayHello();
}

保存后悔会在gen下生成一个相应的Java类--------MyServiceInterface。Java暂时不用管

2.接下来我们正常编写Service类,实现onBind方法
在onBind方法中创建并返回gen包中自动生成的那个java类中的内部类Stub的实现类对象
最后别忘了注册Service,另外通过意图过滤器设定一个别名,以便其他程序访问
以上操作是完成了服务提供方的代码

同样在stc/下的包中建立一个  Myservice.java

package com.example.aidlservicedemo;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.RemoteException;import android.util.Log;public class MyService extends Service{@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn new MyServiceInterface.Stub() {@Overridepublic void sayHello() throws RemoteException {Log.v("TAG", "你好,我是AIDL服务返回的数据,我来自com.example.aidlservicedemo");}};}}

3.注册

 <service android:name=".MyService">
            <intent-filter>
                <action android:name="myService" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </service>


接下来我们开始编写服务使用者的功能

AIDLClientDemo.java

正常绑定服务,编写ServiceConnection接口实现类
只不过实现类中onServiceConnected方法的参数IBinder service不能直接转型
而是必须通过之前gen包中生成的Java类的Stub类中的静态方法asInterface来使其IBinder类型转换为gen包中生成的那个Java类类型

1.在MainActivity.java中

布局一个按钮出发

package com.example.aidlclientdemo;import com.example.aidlservicedemo.MyServiceInterface;import android.app.Activity;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity {ServiceConnection conn=new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stub}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {try{MyServiceInterface myService=MyServiceInterface.Stub.asInterface(service);myService.sayHello();}catch(Exception e){e.printStackTrace();}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);((Button)findViewById(R.id.btn)).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent("myService");bindService(intent, conn, BIND_AUTO_CREATE);}});}}
2.将AIDLServiceDemo.java的gen下的包复制到src下,删除其中的两个Java类(BuildConfig.java和R.java)

代码完成

先运行AIDLServiceDemo,保持在后台,然后在运行,否则不会得调用远程服务获得数据


0 0