安卓IPC之aidl使用(二)---aidl本地实现

安卓IPC之aidl使用(二)—aidl本地实现
安卓IPC之aidl使用(三)—System aidl调用
安卓IPC之aidl使用(一)–aidl常见使用

一直都以为aidl必须写一个服务端是吧,那样岂不是有时候需求怎么实现,如果app的service和client属于同一app,那样实现是不是更好的满足我们的需求呢。
这里写图片描述

本例子我们实现一个很简单的例子:实现2个数相加

// ILocal.aidl
package com.losileeya.localaidl;
// Declare any non-default types here with import statements

interface ILocal {
   int add(in int num1,in int num2);
}

因为不需要在写service了,所以我们这里需要写LoaclAidlService

package com.losileeya.localaidl;

import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.annotation.Nullable;

/**
 * User: Losileeya ([email protected])
 * Date: 2016-07-10
 * Time: 11:09
 * 类描述:
 *
 * @version :
 */
public class LoaclAidlService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new MBinder();
    }
  class MBinder extends ILocal.Stub{

      @Override
      public int add(int num1, int num2) throws RemoteException {
          return doAdd(num1,num2);
      }
  }

    private int doAdd(int num1, int num2) {
        return num1+num2;
    }
  public class LocalConnection implements ServiceConnection {

       @Override
       public void onServiceConnected(ComponentName name, IBinder service) {
           service= (IBinder) ILocal.Stub.asInterface(service);
       }

       @Override
       public void onServiceDisconnected(ComponentName name) {
           name=null;
       }
   }
}

然后使用也很简单

package com.losileeya.localaidl;

import android.content.ComponentName;
import android.content.Context;
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.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private ILocal iLocal=null;
    private EditText etNum1,etNum2,etResult;
    private Button btnCalculate;
    private LocationConnection connection=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        bindService();
    }

    private void initView() {
        etNum1= (EditText) findViewById(R.id.et_num1);
        etNum2= (EditText) findViewById(R.id.et_num2);
        etResult= (EditText) findViewById(R.id.et_result);
        btnCalculate= (Button) findViewById(R.id.btn_calculate);
        btnCalculate.setOnClickListener(this);
    }

    private void bindService() {
        connection=new LocationConnection();
        Intent intent=new Intent();
        intent.setComponent(new ComponentName("com.losileeya.localaidl","com.losileeya.localaidl.LoaclAidlService"));
        bindService(intent,connection, Context.BIND_AUTO_CREATE);

    }
    class LocationConnection implements ServiceConnection {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            iLocal = ILocal.Stub.asInterface((IBinder)service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            iLocal=null;
        }
    };
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(connection);
        connection=null;
    }

    @Override
    public void onClick(View v) {
        int num1=Integer.parseInt(etNum1.getText().toString().trim());
        int num2=Integer.parseInt(etNum2.getText().toString().trim());

        try {
            int result=iLocal.add(num1,num2);
            etResult.setText(result+"");

        } catch (RemoteException e) {
            e.printStackTrace();
            etResult.setText("失败");
        }
    }
}

是不是和前面一个例子使用起来没有什么两样,只不过把LoaclAidlService搬到客户端来了(2合一了是吗)。仔细一看,还是有一点的区别,请仔细对照代码自行体会。

清单配置LoaclAidlService

 <service android:name=".LoaclAidlService"
            android:process=":remmote">
            <intent-filter>
                <action android:name="com.losileeya.localaidl.LoaclAidlService"></action>
            </intent-filter>
        </service>

这里把service 标记为android:process=”:remmote”,这样aidl就能被远程调用了。

效果如下:

demo 传送门:AIDLMaster

猜你喜欢

转载自blog.csdn.net/u013278099/article/details/52433441