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

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

创建客户端Project,并将服务端的aidl文件夹整个拷贝到客户端Project的main文件夹下;并Build->MakeProject
Android调用远程服务中的方法(AIDL)_第11张图片
客户端界面放置"绑定服务"、“调用服务里的方法”、“解绑服务”,代码如下:

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
Android调用远程服务中的方法(AIDL)_第12张图片

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

你可能感兴趣的:(android)