android学习之AIDL初探

很久以前就应该写这篇文章了,但是之前一直有事情,今天终于有时间了,因为android不允许共享内存,所以出现了AIDL(全称是Android Interface Define Language)也就是进程间通信,其实进程间通信也不麻烦,这里说说大概的思路,首先在服务器端口,我们写一个aidl的文件,文件里面通过接口的形式来写,但是没有限定词,(不要担心,代码会在后面贴出),然后android系统会根据这个文件在gen目录生成对应的java文件,然后我们写一个service,这个service里面需要实现之前对应生成的java文件里面的stub类,然后我们通过service里面的onbind函数,返回实现了stub类的方法的对象,在我们的客户端我们通过ServiceConnection来获得我们返回的对象,我们可以通过这个对象来调用我们之前定义在aidl文件中的方法,这里还需要提醒一下,需要在服务器端申明service,毕竟四大组件是很厉害的,可以贴代码了:

工程目录


aidl

package com.jk.aidlservice;

interface IMyService {
	String getValue(String s);

}
自动生成的代码就不贴了,上面的代码一旦保存以后就会生成IMyService

MyService

package com.jk.aidlservice;

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

public class MyService extends Service {
	// 我们需要返回的类的类型
	public class MyServiceImpl extends IMyService.Stub {
		@Override
		public String getValue(String s) throws RemoteException {
			return s + "欢迎来到季科的博客";
		}

	}

	@Override
	public IBinder onBind(Intent intent) {
		// 返回我们需要返回的类的对象
		return new MyServiceImpl();
	}

}
服务器的主程序里面什么也没有就不写了

完成这步以后我们需要申明service

    <service android:name="com.jk.aidlservice.MyService">
            <intent-filter >
                <action android:name="com.jk.aidl.service.Myservice"/>
            </intent-filter>
        </service>


然后我们需要将服务器里面的Myservice和IMyService带同包名一起复制到客户端,这里也可以想到,因为我们需要共同的接口,

最后,我们需要写主程序

package com.example.aidlclient;

import com.jk.aidlservice.IMyService;

import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
	public Button btn_show;
	public IMyService myService;
	// 通过ServiceConnection来获得返回的IBinder对象
	public ServiceConnection myServiceConnection = new ServiceConnection() {

		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub

		}

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// 得到从客户端返回的对象
			myService = IMyService.Stub.asInterface(service);
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 启动服务
		bindService(new Intent("com.jk.aidl.service.Myservice"),
				myServiceConnection, Context.BIND_AUTO_CREATE);
		// 获得按钮
		btn_show = (Button) findViewById(R.id.btn_show);
		// 添加按钮点击事件
		btn_show.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				try {
					// 调用myservice对象的函数
					Toast.makeText(MainActivity.this, myService.getValue("ni"),
							Toast.LENGTH_SHORT).show();
				} catch (RemoteException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});

	}

}

这样就完成了程序间的通信





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值