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
  • 相关阅读:
    MVC3、如何应用EntityFramework 连接MySql 数据库 Kevin
    DEV EXPRESS Summary Footer 不显示 Kevin
    装饰模式 Kevin
    Dev 控件 GridControl 控件 二次绑定数据源的问题。 Kevin
    System.InvalidOperationException 异常 Kevin
    LINQ to XML Kevin
    代理模式——代码版“吊丝的故事” Kevin
    VS2012 中的设备 面板 Kevin
    maven 学习笔记(三)创建一个较复杂的 eclipse+android+maven 工程
    maven 学习笔记(一)eclipse+android+maven
  • 原文地址:https://www.cnblogs.com/pangblog/p/3283358.html
Copyright © 2011-2022 走看看