前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通信之进程间通信-AIDL

通信之进程间通信-AIDL

作者头像
fanfan
发布2022-05-07 13:59:13
5650
发布2022-05-07 13:59:13
举报
文章被收录于专栏:编程思想之路编程思想之路

AIDL定义

aidl:英文全称为Android interface definition language,即Android接口定义语言。能够实现两个独立应用程序之间的通信。进行跨进程通信

AIDL用法

既然是两个进程间的通信,那就必须要创建两个Android应用程序,一个应用程序A借助service用来实现所定义的aidl接口,另一个应用程序B用来绑定A应用程序中所创建的服务,并调用aidl接口方法。假定,绑定服务的应用程序为客户端Client,定义服务的为服务端Server。

服务端编程步骤:

1,新建Android应用程序AIDLServeDemo

2,新建CustomAIDL.aidl,至于新建过程,参考下文客户端的编程。

3,服务端可以不创建用户界面,创建服务:

代码语言:javascript
复制
package com.example.server;

import com.example.aidlService.CustomAIDL;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.widget.Toast;

public class AIDLServer extends Service {


	CustomAIDL.Stub stub = new CustomAIDL.Stub() {
		
		@Override
		public String sayHello(String string) throws RemoteException {
			// TODO Auto-generated method stub
			return "sayHello:"+string;
		}
	};
	
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
	}
	
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return stub;
	}
	
	@Override
	public boolean onUnbind(Intent intent) {
		// TODO Auto-generated method stub
		return super.onUnbind(intent);
	}
	
	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
	}

}

4,在清单配置文件中配置服务

代码语言:javascript
复制
<service android:name="com.example.server.AIDLServer">
            <intent-filter >
                <action android:name="action.aidlserver"/>
                <category android:name="category.aidlserver"/>
            </intent-filter>
        </service>

至此,服务端程序编写完毕,目录结构如下:

客户端编程步骤:

1,新建Android应用程序AIDLClientDemo

2,在程序src/某包目录下新建文件,New-file,文件名称为CustomAIDL.aidl。注意,连同.aild一同写到文件名处

客户端程序和服务端程序所创建的.aidl文件,必须,包名一致,文件名一致,即文件中的内容必须一致。

3,编辑所创建的CustomAIDL.aidl文件,写法与java相同,指明所在包,以及方法

代码语言:javascript
复制
package com.example.aidlService;
  
 interface CustomAIDL{
 
     String sayHello (String string);
 }

4,在aidl文件保存后,Eclipse中的adt插件会帮助你自动的在gen目录下生成对应的java文件,目录结构如下:

5,在activity中使用aidl进行进程间通信

代码语言:javascript
复制
package com.example.aidlclientdemo;

import com.example.aidlService.CustomAIDL;

import android.app.Activity;
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.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

	private TextView mBindServiceTv;
	private TextView mUnBindServiceTv;
	private TextView mSayHelloTv;
	
	private CustomAIDL mAidl;
	
	private ServiceConnection conn = new ServiceConnection() {
		
		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// TODO Auto-generated method stub
			mAidl = CustomAIDL.Stub.asInterface(service);
		}
	};

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

	/**
	 * 初始化控件
	 */
	private void initView() {

		mBindServiceTv = (TextView) findViewById(R.id.bind_service_tv);
		mUnBindServiceTv = (TextView) findViewById(R.id.unbind_service_tv);
		mSayHelloTv = (TextView) findViewById(R.id.send_msg);
		
		setViewOnClickListener(mBindServiceTv, mUnBindServiceTv,mSayHelloTv);
		setBtnFlags(true, false,false);
	}

	/**
	 * 为控件添加点击事件
	 * 
	 * @param views
	 */
	private void setViewOnClickListener(View... views) {

		for (View view : views) {
			if (view != null) {
				view.setOnClickListener(this);
			}
		}
	}
	
	/**
	 * 设置按钮的可点击状态
	 * @param bindService
	 * @param unbindService
	 */
    private void setBtnFlags(boolean bindService,boolean unbindService,boolean sayhello){
    	mBindServiceTv.setEnabled(bindService);
    	mUnBindServiceTv.setEnabled(unbindService);
    	mSayHelloTv.setEnabled(sayhello);
    }

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {
		case R.id.unbind_service_tv:
			//服务解绑
			unbindService(conn);
			setBtnFlags(true, false,false);
			break;
		case R.id.bind_service_tv:
			//绑定服务
			bindService(new Intent("action.aidlserver"), conn, BIND_AUTO_CREATE);
			setBtnFlags(false, true,true);
			break;
			
		case R.id.send_msg:
			//进程间通信
			if (mAidl != null) {
				try {
					String str = mAidl.sayHello("hello,world");
					Toast.makeText(getApplicationContext(), str,
                                               Toast.LENGTH_SHORT).show();
				} catch (RemoteException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			break;
		default:
			break;
		}
	}
}

AIDL进程间通信效果图

Android5.0以后隐式启动ServiceBug

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • AIDL定义
  • AIDL用法
    • 服务端编程步骤:
      • 客户端编程步骤:
      • AIDL进程间通信效果图
      • Android5.0以后隐式启动ServiceBug
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档