android aidl 进程间通讯

本文介绍如何使用Android Interface Definition Language (AIDL) 实现Android应用间的进程通信,包括自定义类型传递、接口回调实现及服务绑定等关键技术点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传递数据

自定义类型 要实现parceable 接口

并定义同名的aidl文件 文件内容parcealbe 类名



实现接口回调:
要实现接口 接口用aidl定义这样才能执行,在不同进程间的对象的hashcode是不样的,因此正常是无法回调的
接口也用aidl   MyLatLngListenerAidl.aidl

package com.p2.pa.amap.location;
interface MyLatLngListenerAidl
{
    void receiverLatLng(double lat,double lon);
}


实现类

public class MyLatLngListener extends MyLatLngListenerAidl.Stub {
	ActivityMain context;
	private AMap map;

	public MyLatLngListener(AMap map, ActivityMain activityMain) {
		super();
		this.map = map;
		this.context = activityMain;
	}
	@Override
	public void receiverLatLng(double lat, double lon) throws RemoteException {
		System.out.println("MyLatLngListener receiverLatLng lat:" + lat
				+ ",lon:" + lon);
		locationOk(new LatLng(lat, lon));
	}

服务调用,绑定连接成功后添加侦听

	class MyLocatonConnection implements ServiceConnection {

	
		@Override
		public void onServiceConnected(ComponentName arg0, IBinder arg1) {
			printLog("onServiceConnected");
			aidl=LocationServiceAidl.Stub.asInterface(arg1);
			isBind = true;
			try {
				MyLatLngListener listener = new MyLatLngListener(aMap, ActivityMain.this);
				printLog("MyLatLngListener:"+listener.hashCode());
				aidl.addListener(listener);
			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

参考 http://item.congci.com/item/aidl-hui-diao-hanshu-tongbu-tongxun

//android service一直再运行,通过bindService拿到service的代理,并将自己到回调对象注册过去,就能实现调用service中的方法,和在service中调用本地activity到方//法。做到了进程间通信。
 
ImyserviceManager.aidl

package com.test;
import com.test.Ilisten;
interface ImyserviceManager
{
    int add(int a,int b);
    String show();
    void register(Ilisten listen);
}
 
RemoteService.java
 
package com.test;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
public class RemoteService extends Service
{
    Ilisten myListener = null;
    public class ServiceImpl extends ImyserviceManager.Stub
    {
        public int add(int a,int b)throws RemoteException
        {
            if(myListener != null)
                myListener.change("this is call back!");
            return (a+b);
        }
        
        public String show()throws RemoteException
        {
            return "hello world!";
        }
        public void register(Ilisten listen) throws RemoteException
        {
            // TODO Auto-generated method stub
            myListener = listen;
        }
    }
    
    @Override
    public IBinder onBind(Intent intent)
    {
        // TODO Auto-generated method stub
        return new ServiceImpl();
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub
        Log.i("test","I am running .......................");
        return super.onStartCommand(intent, flags, startId);
        
    }
    
    
}
 
Ilisten.aidl
 
package com.test;
interface Ilisten
{
    void change(String a);
}
 
TestAidl.java
package com.test;
import android.app.Activity;
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.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class TestAidl extends Activity
{
    String str = null;
    private ImyserviceManager myManager;
    Button myButton;
    private TextView textView;
    private Button button1;
    private Button button2;
    
    private ServiceConnection serviceConnection =new ServiceConnection()
    {
        public void onServiceConnected(ComponentName name, IBinder service)
        {
            // TODO Auto-generated method stub+
            
            myManager=ImyserviceManager.Stub.asInterface(service);
            try {
                Log.i("test-------",myManager.show());
                TextView textView=(TextView)findViewById(R.id.text);
                textView.setText(str);
                myManager.register(new myListener());
                
            } catch (RemoteException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        public void onServiceDisconnected(ComponentName name)
        {
            // TODO Auto-generated method stub
            
        }
        
    };
    
    public class myListener extends Ilisten.Stub
    {
        public void change(String a) throws RemoteException
        {
            // TODO Auto-generated method stub
            
            button1.setText(a);
            
        }
        
    }
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        bindService(new Intent(TestAidl.this, RemoteService.class), serviceConnection, Context.BIND_AUTO_CREATE);
  
         textView=(TextView)findViewById(R.id.text);
        
         button1 = (Button) findViewById(R.id.b1);
        
         button1.setOnClickListener(new View.OnClickListener() {
            
            public void onClick(View v)
            {
                try {
                    button1.setText(myManager.show());
                    //myManager.add(1, 2);
                } catch (RemoteException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
        
         button2= (Button)findViewById(R.id.b2);
         button2.setOnClickListener(new View.OnClickListener() {
            
            public void onClick(View v)
            {
                try {
                    myManager.add(2, 3);
                } catch (RemoteException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
    
    }
}











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值