ActivityManagerService新加listener及触发其回调

前言

Android版本为7.1,之前调查的时候发现没有太多这个功能实现相关的文章,所以自己来写一篇,第一次分享、记录自己代码,有什么写的不对的地方请见谅。

Android.mk

framework/base/Android.mk中新加一行把新加的aidl文件加入编译

core/java/android/app/ITestListener.aidl

ActivityManager.java

framework/base/core/java/android/app/ActivityManager.java
新加注册监听和注销的接口

import android.app.ITestListener.aidl
public boolean registerTestCallback(ITestListener listener) {
	boolean ret = false;
	try {
		ret = ActivityManagerNative.getDefault().registerTestCallback(listener);
	} catch (RemoteException) {
		ret = false;
		throw e.rethrowFromSystemServer();
	}
	return ret;
}
public boolean unRegisterTestCallback(ITestListener listener) {
	boolean ret = false;
	try {
		ret = ActivityManagerNative.getDefault().unRegisterTestCallback(listener);
	} catch (RemoteException) {
		ret = false;
		throw e.rethrowFromSystemServer();
	}
	return ret;
}

ActivityManagerNative.java

framework/base/core/java/android/app/ActivityManagerNative.java

import android.app.ITestListener.aidl
	case REGISTER_ACTIVITY_FINISH_CALLBACK_TRANSACTION: {
		data.enforceInterface(IActivityManager.descriptor);
		ITestListener listener = ITestListener.Stub.asInterface(data.readStrongBinder());
		boolean result = registerTestCallback(listener);
		reply.writeNoException();
		reply.writeInt(result ? 1 : 0);
		return true;
	}
	case UNREGISTER_ACTIVITY_FINISH_CALLBACK_TRANSACTION: {
		data.enforceInterface(IActivityManager.descriptor);
		ITestListener listener = ITestListener.Stub.asInterface(data.readStrongBinder());
		boolean result = unRegisterTestCallback(listener);
		reply.writeNoException();
		reply.writeInt(result ? 1 : 0);
		return true;
	}
public boolean registerTestCallback(ITestListener listener) throws RemoteException {
	Parcel data = Parcel.obtain();
	Parcel replay = Parcel.obtain();
	data.writeInterfaceToken(IActivityManager.descriptor);
	data.writeStrongInterface(listener);
	mRemote.transact(REGISTER_ACTIVITY_FINISH_CALLBACK_TRANSACTION, data, reply, 0);
	reply.readException();
	boolean res - reply.readInt() != 0;
	data.recycle();
	reply.recycle();
	return res;
}
public boolean unRegisterTestCallback(ITestListener listener) throws RemoteException {
	Parcel data = Parcel.obtain();
	Parcel replay = Parcel.obtain();
	data.writeInterfaceToken(IActivityManager.descriptor);
	data.writeStrongInterface(listener);
	mRemote.transact(UNREGISTER_ACTIVITY_FINISH_CALLBACK_TRANSACTION, data, reply, 0);
	reply.readException();
	boolean res - reply.readInt() != 0;
	data.recycle();
	reply.recycle();
	return res;
}

IActivityManager.java

framework/base/core/java/android/app/IActivityManager.java

import android.app.ITestListener.aidl
public boolean registerTestCallback(ITestListener listener) throws RemoteException
public boolean unRegisterTestCallback(ITestListener listener) throws RemoteException
int REGISTER_ACTIVITY_FINISH_CALLBACK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+382;
int UNREGISTER_ACTIVITY_FINISH_CALLBACK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+383;

ITestListener.aidl

新加listener文件
framework/base/core/java/android/app/ITestListener.aidl

package android.app;

interface ITestListener {
	void OnNotify();
}

ActivityManagerService.java

framework/base/services/core/java/com/android/server/am/ActivityManagerService.java
service里新加接口,在适当时候触发回调

import android.app.ITestListener.aidl
import android.os.HandlerThread;
	private final Arraylist<TestListenerData>mTestListenerDatas = new ArrayList<TestListenerData>();
	private Object mTestObject = new Object();
	private void handleTestListenerDeath(TestListenerDeath death) {
		int index = -1;
		synchronized(mTestObject) {
			if (null != mTestListenerDatas) {
				for (int i = 0; i < mTestListenerDatas.size(); i++) {
					if (mTestListenerDatas.get(i).getTestListenerDeath() == death) {
						index = i;
						break;
					}
				}
			}
			if (index >= 0) {
				mTestListenerDatas.get(index).getTestListener().asBinder()>unlinkToDeath(death,0);
				mTestListenerDatas.remove(index);
			}
		}
	}

    private class TestListenerDeath implements IBinder.DeathRecipient {
        @Override
        public void binderDied() {
            handleTestListenerDeath(TestListenerDeath.this);
        }
    }	

	private final class TestListenerData {
		private TestListenerDeath mDeath;
		private ITestListener mListener;
	
		public TestListenerData(ITestListener listener, TestListenerDeath death) {
			mDeath = death;
			mListener = listener;
		}
		public ITestListener getTestListener() {
			return mListener;
		}
		public TestListenerDeath getTestListenerDeath() {
			return mDeath;
		}
	}
	private int getIndexOfTestListener(ITestListener listener) {
		int index = -1;
		if (null != listener) {
			for (int i = 0; i < mTestListenerDatas.size(); i++) {
				if (mTestListenerDatas.get(i).getActivityFinishListener().asBinder() == listener.asBinder()) {
					index = i;
					break;
				}
			}
		}
		return index;
	}
	private final static int MESSAGE_TEST = 0;
	private final class TestHandler extends Handler {
		public TestHandler(Looper looper){
			super (looper);
		}
	
		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
				case MESSAGE_TEST: {
					synchronized(mTestObject) {
						if (null != mTestListenerDatas){
							for (int i = 0; i < mTestListenerDatas.size(); i++) {
								ITestActivity listener = mTestListenerDatas.get(i).getTestListener();
								try {
									if (listener != null) {
										listener.OnNotify();
									}
								} catch (Throwable e) {
									e.printStackTrace();
								}
							}
						}
					}
				}
				break;
			}
		}
	}
	
	private HandlerThread mHandlerThread1;
	private TestHandler mTestHandler;
	
	// Note: This method is invoked on the main thread but may need to attach various
	// handlers to other threads. So take care to be explicit about the looper.
	public ActivityManagerService(Context systemContext) {
	mContext = systemContext;
	
	mHandlerThread1 = new HandlerThread("ACtivityManagerServiceTestThread");
	mHandlerThread1.start();
	mTestHandler = new TestHandler(mHandlerThread1.getLooper());

在想要触发回调的地方加入:

if (mTestListenerDatas != null && !mTestListenerDatas.isEmpty()) {
	Message msgTest = new Message();
	msgTest.what = MESSAGE_TEST;
	mTestHandler.sendMessage(msgTest);
}

新加接口实现:

	@Override
	public boolean registerTestCallback(ITestListener listener) {
		int index;
		synchronized(mTestObject) {
			if (null != listener) {
				index = getIndexOfTestListener(listener);
	
				if (index < 0) {
					TestListenerDeath death = new TestListenerDeath();
					
					try {
						listener.asBinder().linkToDeath(death, 0);
					} catch (RemoteException e) {
						e.printStackTrace();
					}
					TestListenerDate data = new TestListenerDate(listener, death);
		
					if (null != data) {
						mTestListenerDatas.add(data);
						return true;
					}
				}
			}
			return false;
		}
	}
	
	@Override
	public boolean unRegisterTestCallback(ITestListener listener) {
		int index;
		synchronized(mTestObject) {
			if (null != listener) {
				index = getIndexOfTestListener(listener);
	
				if (index >= 0) {
					mTestListenerDatas.remove(index);
					return true;
				}
			}
			return false;
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MessageListener回调函数是一种在消息通信中使用的回调函数。在消息通信中,通常存在一个消息生产者和一个或多个消息消费者。消息生产者负责发送消息,消息消费者负责接收和处理消息。 在使用MessageListener回调函数时,消息消费者会注册一个回调函数到消息队列中,以便在有新消息到达时被调用。当有新消息到达时,消息队列会自动调用注册的MessageListener回调函数,并将接收到的消息作为参数传递给该函数。消息消费者可以在回调函数中处理接收到的消息,如进行业务逻辑处理、数据存储等。 使用MessageListener回调函数的优点是能够实现异步的消息处理。通常,在消息消费者接收到消息后,会立即释放控制权,继续执行其他任务,而不用等待消息的处理完成。这样可以提高消息处理的效率和系统的响应速度。 另外,MessageListener回调函数还可以实现消息的监听和订阅。消息生产者在发送消息时,可以指定多个消息消费者注册相同的回调函数,从而实现消息的广播或者发布-订阅模式。这样可以满足不同场景下的消息通信需求。 总之,MessageListener回调函数是一种在消息通信中用于接收和处理消息的函数。通过注册该函数到消息队列中,消息消费者可以异步地接收和处理消息,提高系统的并发性和响应速度。同时,MessageListener回调函数还具有灵活性,可以实现消息的监听和订阅功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值