Android调用远程服务中的方法(AIDL)

项目用用到服务的地方有,但是用到使用远程服务的地方真不多;借着复习机会,撸一下AIDL,大体步骤如下,代码见下方
新建远程服务对应的Project,新建AIDL File
在这里插入图片描述
输入远程服务的名称,点击finish就会生成默认的aidl文件
aidl
同时在build/generated/source/aidl/debug/包/生成对应的.java文件
aidl对应的java文件
修改创建的.aidl文件,远程服务计算两个整数的和
在这里插入图片描述
点击菜单栏Build->Make Project 重新生成aidl对应的服务的java文件
在这里插入图片描述
生成了aidl对应的服务的java文件,如下图
在这里插入图片描述
创建service
service
创建service并如下图实现
在这里插入图片描述
在清单文件中为service添加隐式调用的action
在这里插入图片描述
MainActivity对应的界面中添加启动服务按钮,如下图:
在这里插入图片描述
至此,远程服务端代码就实现完了,下面实现客户端代码

创建客户端Project,并将服务端的aidl文件夹整个拷贝到客户端Project的main文件夹下;并Build->MakeProject
在这里插入图片描述
客户端界面放置"绑定服务"、“调用服务里的方法”、“解绑服务”,代码如下:

package com.test.aidltestclient;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;

import com.test.aidltest.IMyAidlInterface;

public class MainActivity extends AppCompatActivity {

    private IMyAidlInterface iMyAidlInterface;
    private Intent intent;

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

        intent = new Intent();
        //由于是隐式启动Service 所以要添加对应的action,A和之前服务端的一样。
        intent.setAction("com.test.aidltest.myService");
        //android 5.0以后直设置action不能启动相应的服务,需要设置packageName或者Component。
        intent.setPackage("com.test.aidltest"); //packageName 需要和服务端的一致.
    }

    public ServiceConnection serviceConnection = new ServiceConnection(){

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.d("RemoteService","远程服务绑定成功并获取到IBinder的子类对象");
            iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }

        @Override
        public void onBindingDied(ComponentName name) {

        }

        @Override
        public void onNullBinding(ComponentName name) {

        }
    };

    /**
     * 绑定服务
     * @param view
     */
    public void bindService(View view) {
        bindService(intent,serviceConnection,BIND_AUTO_CREATE);
    }

    /**
     * 调用服务里的方法
     * @param view
     */
    public void callMethodInService(View view) throws RemoteException {
        int result = iMyAidlInterface.addition(1,2);
        Log.d("RemoteService","调用了远程服务中的addition方法,结果为result="+result);
    }

    /**
     * 解绑服务
     * @param view
     */
    public void unBindService(View view) {
        unbindService(serviceConnection);
    }

}

运行服务端APP
在这里插入图片描述

点击击"开启服务"按钮,日志如下
在这里插入图片描述
多次点击"开启服务"按钮,只会多次调用onStartCommand方法日志如下
在这里插入图片描述
运行客户端代码
在这里插入图片描述
点击客户端"绑定服务"按钮,会提示远程服务绑定成功并获取到IBinder的子类对象,日志如下:
在这里插入图片描述
现在就可以调用服务里的方法了,点击"调用服务里的方法"按钮,会调用远程addition方法,1+2=3 ,结果如下:
在这里插入图片描述
点击"解除绑定",远程服务中的onUnBind方法会回调,日志如下:
在这里插入图片描述
至此,绑定远程服务、调用远程服务中的方法、解除绑定都演示完毕了
源码见:下载地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值