zoukankan      html  css  js  c++  java
  • [置顶] android AIDL 进程间通信

    1.定义aidl文件

    a.ITestService.aidl

    package com.open.aidl.service;
    
    import com.open.aidl.service.ITestServiceCallback;
    
    interface ITestService {
    
        void registerCallback(ITestServiceCallback cb);
        
        void unregisterCallback(ITestServiceCallback cb);
        
        int request(inout Bundle mBundle);
    }
    

    b.ITestServiceCallback.aidl
    package com.open.aidl.service;
    
    oneway interface ITestServiceCallback 
    {
        void onResponse(inout Bundle mBundle);
    }
    

    2.定义Activity
    <
    
    package com.open.aidl;
    
    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 com.open.aidl.service.ITestService;
    import com.open.aidl.service.ITestServiceCallback;
    import com.open.aidl.service.TestService;
    
    public class MainActivity extends Activity {
    
    	private final String TAG="MainActivity";
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		
    		init();
    	}
    	
    	private void init()
    	{
    		findViewById(R.id.bindBtn).setOnClickListener(clickListener);
    		findViewById(R.id.unBindBtn).setOnClickListener(clickListener);
    	}
    	
    	View.OnClickListener clickListener=new OnClickListener() {
    		
    		@Override
    		public void onClick(View v) {
    			switch(v.getId())
    			{
    				case R.id.bindBtn:
    					bind();
    					break;
    					
    				case R.id.unBindBtn:
    					unbind();
    			}
    			
    		}
    	};
    	
    	private void bind()
    	{
    		Intent mIntent=new Intent(TestService.class.getName());
    		bindService(mIntent, mServerConnection, Context.BIND_AUTO_CREATE);
    	}
    	
    	private void unbind()
    	{
    		if(null!=mService)
    		{
    			try {
    				mService.unregisterCallback(mCallBack);
    			} catch (RemoteException e) {
    				e.printStackTrace();
    			}
    			unbindService(mServerConnection);
    		}
    	}
    	
    	@Override
    	protected void onDestroy() {
    		unbind();
    		super.onDestroy();
    	}
    
    	private ITestService mService=null;
    	private ServiceConnection mServerConnection=new ServiceConnection() 
    	{
    		
    		@Override
    		public void onServiceDisconnected(ComponentName name) {
    Log.v(TAG, "onServiceDisconnected");
    			mService=null;
    		}
    		
    		@Override
    		public void onServiceConnected(ComponentName name, IBinder service) {
    Log.v(TAG, "onServiceConnected");
    			mService=ITestService.Stub.asInterface(service);
    			try {
    				mService.registerCallback(mCallBack);
    				mService.request(null);
    			} catch (RemoteException e) {
    				e.printStackTrace();
    			}catch (Exception e) {
    				e.printStackTrace();
    			}
    		}
    	};
    	
    	private ITestServiceCallback mCallBack=new ITestServiceCallback.Stub() {
    		
    		@Override
    		public void onResponse(Bundle mBundle) throws RemoteException {
    Log.v(TAG,"call from service");
    			}
    		};
    }
    

    3.定义Service.
    package com.open.aidl.service;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.IBinder;
    import android.os.IInterface;
    import android.os.RemoteCallbackList;
    import android.os.RemoteException;
    import android.util.Log;
    
    /**
     * 后台服务类
     * @author DexYang
     *
     */
    public class TestService extends Service {
    
    	private final String TAG="TestService";
    	private Object mCallbacksLock=new Object();
    	
    	private Handler mHandler=new Handler();
    	
    	@Override
    	public void onCreate() {
    		super.onCreate();
    Log.v(TAG, "onCreate()");
    	}
    	
    	@Override
        public void onStart(Intent intent, int startId) {
    Log.v(TAG, "onStart()");
            handleCommand(intent);
        }
    
    	@Override
    	public int onStartCommand(Intent intent, int flags, int startId) {
    Log.v(TAG, "onStartCommand()");
    		handleCommand(intent);
    		return START_STICKY;
    	}
    
    	private void handleCommand(Intent intent)
    	{
    		
    	}
    	
    	@Override
    	public IBinder onBind(Intent arg0) {
    Log.v(TAG, "onBind()");
    		if(null!=arg0&&TestService.class.getName().equals(arg0.getAction()))
    		{
    			handleCommand(arg0);
    		}
    		return mBinder;
    	}
    
        @Override
    	public void onRebind(Intent intent) {
    Log.v(TAG, "onRebind()");
    		if(TestService.class.getName().equals(intent.getAction()))
    		{
    			handleCommand(intent);
    		}
    		super.onRebind(intent);
    	}
        
    	@Override
    	public boolean onUnbind(Intent intent) {
    Log.v(TAG, "onUnbind()");
    		return true;
    	}
    
    	@Override
    	public void onDestroy() {
    Log.v(TAG, "onDestroy()");
    		mCallbacks.kill();
    		android.os.Process.killProcess(android.os.Process.myPid());
    		super.onDestroy();
    	}
    	
    	/**
    	 * Binder 相关
    	 */
    	private final CusRemoteCallbackList<ITestServiceCallback> mCallbacks= new CusRemoteCallbackList<ITestServiceCallback>();
    	private ITestService.Stub mBinder=new ITestService.Stub() {
    
    		@Override
    		public int request(Bundle mBundle) throws RemoteException {
    Log.v(TAG,"call from Activity request ");
    			mHandler.postDelayed(new Runnable(){
    			
    				@Override
    				public void run() {
    					synchronized (mCallbacksLock) 
    					{
    						int callbacksNum = mCallbacks.beginBroadcast();
    				        for (int i=callbacksNum-1; i>=0; i--) 
    				        {
    				            try {
    			   						mCallbacks.getBroadcastItem(i).onResponse(null);;
    				            } catch (Exception e) {
    				            	e.printStackTrace();
    				            }
    				        }
    				        mCallbacks.finishBroadcast();
    					}
    				}
    				
    			}, 3000);
    			return 0;
    		}
    
    		@Override
    		public void registerCallback(ITestServiceCallback cb)
    				throws RemoteException {
    Log.v(TAG,"registerCallback :");
    			if (cb != null)
    			{
    				mCallbacks.register(cb);
    			}
    
    		}
    
    		@Override
    		public void unregisterCallback(ITestServiceCallback cb)
    				throws RemoteException {
    Log.v(TAG,"unregisterCallback :");
    				if (cb != null) 
    				{
    					mCallbacks.unregister(cb);
    				}
    		}
    
    	};
    	
    	/**
    	 * 经过测试onCallbackDied()方法,只有在bindService(),没有调用unbind()方法process就挂了的情况下才会执行
    	 * @author Administrator
    	 * @param <E>
    	 */
    	private class CusRemoteCallbackList<E extends IInterface> extends RemoteCallbackList<E>
    	{
    		@Override
    		public void onCallbackDied(E callback) {
    Log.v(TAG, "CusRemoteCallbackList onCallbackDied 1");
    			super.onCallbackDied(callback);
    
    		}
    
    		@Override
    		public void onCallbackDied(E callback, Object cookie) {
    Log.v(TAG, "CusRemoteCallbackList onCallbackDied 2");
    			
    			super.onCallbackDied(callback, cookie);
    		}
    	}
     
    }
    

    4.配置AndroidManifest.xml文件
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.open.aidl"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="17" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.open.aidl.MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <service
       		    android:label="TestService"
            	android:name="com.open.aidl.service.TestService"
            	android:process="com.open.aidl"
            	android:exported="true">
                 <intent-filter>
                     <action android:name="com.open.aidl.service.TestService"/>
                 </intent-filter>
            </service>
        </application>
    
    </manifest>
    

     

    5.测试运行.

     

    
    
    点击bind service ,
    在TestService中 打印了call from Activity,说明Activity 调用 Service 成功;
    3秒后在Activity中 打印了call from service,说明Service 调用 Activity 成功。 



     

    Demo代码地址:http://download.csdn.net/detail/zz7zz7zz/6010119



    邮箱:zz7zz7zz@163.com

    微博http://weibo.com/u/3209971935
  • 相关阅读:
    Google是如何赚钱的?
    网站数据连接
    表单验证
    Web Proxy Autodiscovery Protocol
    把SQL2000的数据库迁移至SQL2005
    WFE与Index服务器之前的通讯
    SOS 的帮助输出
    WinDbg.exe中使用的SOS.dll的命令列表
    HTTPS 简介
    Error: A web configuration modification operation is already running
  • 原文地址:https://www.cnblogs.com/pangblog/p/3283358.html
Copyright © 2011-2022 走看看