Android 使用 AIDL 实现进程间通信,使用基本类型作为输入和输出参数
博客专区 > vwarship 的博客 > 博客详情
Android 使用 AIDL 实现进程间通信,使用基本类型作为输入和输出参数
vwarship 发表于3年前
Android 使用 AIDL 实现进程间通信,使用基本类型作为输入和输出参数
  • 发表于 3年前
  • 阅读 36
  • 收藏 1
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 代码:https://github.com/vwarship/Samples/tree/master/Android/AIDL/PrimitiveTypes

RemoteService

1. 定义 IRemoteService.aidl

package com.zaoqibu.remoteservice;// Declare any non-default types here with import statementsinterface IRemoteService {    /** Request the process ID of this service, to do evil things with it. */
    int getPid();    /** Demonstrates some basic types that you can use as parameters and return values in AIDL. */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString);
}

  • 定义了两个方法,输入和输出参数都是简单类型(int, long, boolean, float, double, String)。

  • 编译程序,将会在 build/generated/ 目录下生成 IRemoteService.java 的文件,里面有 IRemoteService.Stub 服务的存根代理类。

AIDL 所在目录

2. 创建服务 RemoteService 类

public class RemoteService extends Service {    private static final String TAG = "RemoteService";    @Override
    public void onCreate() {        super.onCreate();
    }    @Override
    public IBinder onBind(Intent intent) {        return binder;
    }    private final IRemoteService.Stub binder = new IRemoteService.Stub() {        public int getPid(){            return Process.myPid();
        }        public void basicTypes(int anInt, long aLong, boolean aBoolean,                               float aFloat, double aDouble, String aString) {            String str = String.format("anInt:%d, aLong:%d, aBoolean:%b, aFloat:%f, aDouble:%f, aString:%s",
                    anInt, aLong, aBoolean, aFloat, aDouble, aString);            Log.i(TAG, str);
        }
    };

}

  • 实现存根代理类 IRemoteService.Stub。

3. 在 AndroidManifest.xml 中声明 RemoteService

        <service android:name=".RemoteService" android:process=":remote">
            <intent-filter>                <!-- These are the interfaces supported by the service, which you can bind to. -->
                <action android:name="com.zaoqibu.remoteservice.IRemoteService" />
            </intent-filter>
        </service>

Client

1. 从 RemoteService 工程中拷贝 IRemoteService.aidl 文件

AIDL 所在目录

  • 保持原路径

2. 调用 IRemoteService 方法。

public class MainActivity extends ActionBarActivity {    private static final String TAG = "MainActivity";    private IRemoteService iremoteService;    @Override
    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bindService(new Intent(IRemoteService.class.getName()), serviceConnection, BIND_AUTO_CREATE);
    }    private ServiceConnection serviceConnection = new ServiceConnection() {        // Called when the connection with the service is established
        public void onServiceConnected(ComponentName className, IBinder service) {            // Following the example above for an AIDL interface,
            // this gets an instance of the IRemoteInterface, which we can use to call on the service
            iremoteService = IRemoteService.Stub.asInterface(service);
        }        // Called when the connection with the service disconnects unexpectedly
        public void onServiceDisconnected(ComponentName className) {            Log.e(TAG, "Service has unexpectedly disconnected");
            iremoteService = null;
        }
    };    public void onRemoteServiceProcessIDClick(View view) {        int processID = 0;        try {
            processID = iremoteService.getPid();

            iremoteService.basicTypes(1, 2, true, 3.3f, 4.4, "hello");
        } catch (RemoteException e) {
            e.printStackTrace();
        }        TextView remoteServiceProcessID = (TextView)findViewById(R.id.remoteServiceProcessID);
        remoteServiceProcessID.setText(String.valueOf(processID));
    }

}


3. 运行


共有 人打赏支持
vwarship
粉丝 7
博文 2
码字总数 810
作品 8
×
vwarship
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: