进程间通信

新建一个项目充当发送者

1.创建一个以.aidl为后缀名的文件

IMyService.aidl

package com.example.aidldemo

interface IMyService{

  String getValue();

  String getName();

  String getPrice();

}

系统会在gen目录中自动创建一个IMyService类

2.编写一个服务 并在服务中实现IMyService接口

private IMyservice.Stub binder = new IMyservice.Stub() {      

   public String getValue() throws RemoteException {    

    // TODO Auto-generated method stub    

    return "Android";   

    }

    public String getName() throws RemoteException {    

    // TODO Auto-generated method stub    

    return "hello world";   

    }

    public float getPrice() throws RemoteException {   

     // TODO Auto-generated method stub    

    return 10.0F;   

  }  

};

在manifase中注册MyService添加android:process=":remote"

由于需要在其他应用中使用,所以要在remote之前要添加冒号

给service添加过滤器

<intent-filter >
                <action android:name="com.example.aidldemo.IMyservice"/>

</intent-filter>

另外建一个项目充当接受者

把上面的.aidl文件复制到这个项目中,报名要相同

在布局文件中放一个textview用来接受value

放三个button,第一个用来bind服务  第二个用来显示向textview赋值  第三个解绑

在mainavtivity类

package com.example.aidlkhd;

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.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.example.aidldemo.IMyservice;

public class MainActivity extends Activity {
	private Button button1,button2,button3;
	private TextView textview;
	private IMyservice iservice = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		button1 = (Button) findViewById(R.id.button1);
		button2 = (Button) findViewById(R.id.button2);
		button3 = (Button) findViewById(R.id.button3);
		textview = (TextView) findViewById(R.id.textview);
	}
	public void bind(View v){
		Intent service = new Intent(IMyservice.class.getName());
		bindService(service,connection , BIND_AUTO_CREATE);
	}
	public void getdata(View v){
		try {
			textview.setText("运行结果="+iservice.getValue());
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public void unbind(View v){
		unbindService(connection);
	}
	private ServiceConnection connection = new ServiceConnection(){

		public void onServiceConnected(ComponentName arg0, IBinder arg1) {
			// TODO Auto-generated method stub
			//从远程service中获得AIDL实例化对象
			iservice = IMyservice.Stub.asInterface(arg1);
			System.out.println("Bind Success:"+iservice);
		}

		public void onServiceDisconnected(ComponentName arg0) {
			// TODO Auto-generated method stub
			iservice = null;
		}
		
	};
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}
原文地址:https://www.cnblogs.com/dcxz/p/3342549.html