美文网首页
android aidl 进程间通讯

android aidl 进程间通讯

作者: proud2008 | 来源:发表于2016-12-14 15:54 被阅读64次

    传递数据

    自定义类型 要实现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();  
                    }  
                }  
            });  
          
        }  
    }  
    

    相关文章

      网友评论

          本文标题:android aidl 进程间通讯

          本文链接:https://www.haomeiwen.com/subject/zeafmttx.html