android之AIDL跨进程通信详解 (三)

先上一张模块图,这样做省去很多麻烦,如包名不一致等:



    AIDL 如果是跨进程通信,最好做成一个jar 包,其它进程加载后可以直接使用。关于android studio 怎么做jar包,见:http://blog.csdn.net/q610098308/article/details/51693708

接二,建议本地的 aidl ,可以直接把 aidl 相关的做成一个jar 包给其它app直接用;下面讲一下远端调用 aidl;

创建 aidl 文件:

    package com.example.effectiveandroid;  
      
    interface PrinterInterface {  
        void print(String msg);  
    }  


AIDL Service:

    public class AIDLPrinterService extends Service {  
        private static final String TAG = "AIDLPrinterService";  
        private Handler mHandler = new Handler();  
        @Override  
        public IBinder onBind(Intent intent) {  
            return mBinder;  
        }  
          
        private PrinterInterface.Stub mBinder = new PrinterInterface.Stub() {  
            @Override  
            public void print(String msg) throws RemoteException {  
                AIDLPrinterService.this.print(msg);  
            }  
        };  
          
        public void print(String msg) {  
            try {  
                Log.e(TAG, "Preparing printer...");  
                Thread.sleep(1000);  
                Log.e(TAG, "Connecting printer...");  
                Thread.sleep(1000);  
                Log.e(TAG, "Printing.... " + msg);  
                Thread.sleep(1000);  
                Log.e(TAG, "Done");  
            } catch (InterruptedException e) {  
            }  
            mHandler.post(new Runnable() {  
                @Override  
                public void run() {  
                    Toast.makeText(AIDLPrinterService.this, "via AIDL Printing is done.", Toast.LENGTH_LONG).show();  
                }  
            });  
        }  
    }  

Local client:

    public class AIDLClientActivity extends Activity {  
        private static final String TAG = "PrinterClientActivity";  
        PrinterInterface mService;  
      
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.printer_activity);  
            setTitle("Local AIDL client Activity");  
            ((Button) findViewById(R.id.play)).setText("Print via AIDL");  
        }  
      
        @Override  
        protected void onStart() {  
            super.onStart();  
            doBindService();  
        }  
      
        private void doBindService() {  
            Intent intent = new Intent(this, AIDLPrinterService.class);  
            bindService(intent, mConnection, Context.BIND_AUTO_CREATE);  
        }  
      
        @Override  
        protected void onStop() {  
            super.onStop();  
            doUnbindService();  
        }  
      
        private void doUnbindService() {  
            if (mService != null) {  
                unbindService(mConnection);  
            }  
        }  
          
        public void onButtonClick(View v) {  
            if (mService == null) {  
                Log.e(TAG, "what the fucl service is not ready");  
                return;  
            }  
            try {  
                mService.print("This message is from local client via AIDL interface");  
            } catch (RemoteException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
        }  
          
        private ServiceConnection mConnection = new ServiceConnection() {  
            @Override  
            public void onServiceConnected(ComponentName className, IBinder service) {  
                mService = PrinterInterface.Stub.asInterface(service);  
            }  
      
            @Override  
            public void onServiceDisconnected(ComponentName arg0) {  
                mService = null;  
            }  
        };  
    }  

client in another application process: 可以直接导入jar 包

    public class AnotherAIDLClientActivity extends Activity {  
        private static final String TAG = "PrinterClientActivity";  
        PrinterInterface mService;  
      
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.printer_activity);  
            setTitle("Another AIDL client Activity");  
            ((Button) findViewById(R.id.play)).setText("Print via AIDL");  
        }  
      
        @Override  
        protected void onStart() {  
            super.onStart();  
            doBindService();  
        }  
      
        private void doBindService() {  
            Intent intent = new Intent();  
            intent.setClassName("com.example.effectiveandroid", "com.example.effectiveandroid.AIDLPrinterService");  
            bindService(intent, mConnection, Context.BIND_AUTO_CREATE);  
        }  
      
        @Override  
        protected void onStop() {  
            super.onStop();  
            doUnbindService();  
        }  
      
        private void doUnbindService() {  
        if (mService != null) {  
                unbindService(mConnection);  
            }  
        }  
          
        public void onButtonClick(View v) {  
            if (mService == null) {  
                Log.e(TAG, "what the fucl service is not ready");  
                return;  
            }  
            try {  
                mService.print("call PrinterService via AIDL from another application");  
            } catch (RemoteException e) {  
                e.printStackTrace();  
            }  
        }  
          
        private ServiceConnection mConnection = new ServiceConnection() {  
            @Override  
            public void onServiceConnected(ComponentName className, IBinder service) {  
                mService = PrinterInterface.Stub.asInterface(service);  
            }  
      
            @Override  
            public void onServiceDisconnected(ComponentName arg0) {  
                mService = null;  
            }  
        };  
    }  


demo 下载;




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恋恋西风

up up up

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值