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

Posted zy9011

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓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 (847457332@qq.com)
 * 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

开发者涨薪指南 48位大咖的思考法则、工作方式、逻辑体系

以上是关于安卓IPC之aidl使用---aidl本地实现的主要内容,如果未能解决你的问题,请参考以下文章

安卓IPC之aidl使用---System aidl调用

安卓IPC之aidl使用--aidl常见使用

安卓IPC跨进程通讯:AIDL+Retrofit——AndLinker的初步使用

Android IPC 之 AIDL

IPC之 AIDL 的使用

Android IPC 之 AIDL 使用