安卓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本地实现的主要内容,如果未能解决你的问题,请参考以下文章