当前位置: 首页 > news >正文

服装公司电商网站建设规划广州seo顾问

服装公司电商网站建设规划,广州seo顾问,秦皇岛市人力资源和社会保障局,阳山网站建设Android源码下的比较经典的代理模式其中之一是ActivityManagerProxy代理类,其具体代理的ActivityManagerNative的子类ActivityManagerService,ActivityManagerService在这里就不在具体赘述了,这里主要梳理一下整个代理的框架。 ActivityMana…

Android源码下的比较经典的代理模式其中之一是ActivityManagerProxy代理类,其具体代理的ActivityManagerNative的子类ActivityManagerService,ActivityManagerService在这里就不在具体赘述了,这里主要梳理一下整个代理的框架。

ActivityManagerProxy是ActivityManagerNative的内部类,定义如下:

class ActivityManagerProxy implements IActivityManager

ActivityManagerProxy实现了IActivityManager的接口,该接口定义了一些Activity相关的接口方法,其中有些是我们平时用到的。

public interface IActivityManager extends IInterface {public int startActivity(IApplicationThread caller, String callingPackage, Intent intent,String resolvedType, IBinder resultTo, String resultWho, int requestCode, int flags,ProfilerInfo profilerInfo, Bundle options) throws RemoteException;//...........public Intent registerReceiver(IApplicationThread caller, String callerPackage,IIntentReceiver receiver, IntentFilter filter,String requiredPermission, int userId) throws RemoteException;//...........public void unregisterReceiver(IIntentReceiver receiver) throws RemoteException;//...........public int bindService(IApplicationThread caller, IBinder token, Intent service,String resolvedType, IServiceConnection connection, int flags,String callingPackage, int userId) throws RemoteException;public boolean unbindService(IServiceConnection connection) throws RemoteException;//...........//...........
}

上面的这个IActivityManager相当于代理模式中的抽象主题Subject, ActivityManagerProxy相当于代理类Proxy,那么具体的实现主题角色RealSubject是谁呢?

其实就是上面提到的ActivityManagerNative子类ActivityManagerService。因为ActivityManagerNative也实现了抽象主题角色IActivityManager。

public abstract class ActivityManagerNative extends Binder implements IActivityManager


这几个类之间的关系可以用以下UML类图表示为:




通过UML类图可以清晰的看出,ActivityManagerProxy和ActivityManagerNative都实现了IActivityManager,严格来说,ActivityManagerProxy就是代理部分,而ActivityManagerNative就是真实部分,但是ActivityManagerNative抽象类,其并不能处理过多的逻辑,大部分逻辑的实现都是由其子类ActivityManagerService承担,ActivityManagerService是真正意义上的真实主题。所以可以说ActivityManagerService实现了IActivityManager的所有功能,比如启动Activity,绑定服务,注册广播等等,这些逻辑最终都是交给ActivityManagerService实现的。


ActivityManagerService是系统级的Service并且运行与独立的进程中,可以通过ServiceManager获取它,ActivityManagerProxy也运行与独立的进程中,两者之间的通信属于进程间通信,也就是IPC,通过上面的UML类图,可以看出,这里的IPC的方式是通过Binder实现的,Android系统中的Binder机制是一种非常重要的IPC方式。


ActivityManagerProxy在实际的逻辑处理中并未过多的被外部类调用,因为在Activity相关信息的类还有一个ActivityManager类,ActivityManager从名字上看出管理者Activity的信息,但是ActivityManager的大部分逻辑实现都交给ActivityManagerProxy了。


这里以ActivityManager的getAppTasks方法举例说明代理模式。


    public List<ActivityManager.AppTask> getAppTasks() {ArrayList<AppTask> tasks = new ArrayList<AppTask>();List<IAppTask> appTasks;try {appTasks = ActivityManagerNative.getDefault().getAppTasks(mContext.getPackageName());} catch (RemoteException e) {// System dead, we will be dead too soon!return null;}int numAppTasks = appTasks.size();for (int i = 0; i < numAppTasks; i++) {tasks.add(new AppTask(appTasks.get(i)));}return tasks;}


这个方法就是通过ActivityManagerNatived的gDefault方法获取一个IActivityManager对象,再通过其调用调用getAppTasks方法。ActivityManagerNatived的gDefault方法源码如下:

    static public IActivityManager getDefault() {return gDefault.get();}

而gDefault只是单纯返回,继续跟踪源码。

    private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {protected IActivityManager create() {IBinder b = ServiceManager.getService("activity");if (false) {Log.v("ActivityManager", "default service binder = " + b);}IActivityManager am = asInterface(b);if (false) {Log.v("ActivityManager", "default service = " + am);}return am;}};

上面代码通过单例模式构造了Singleton<IActivityManager >类型的gDefault,其中通过ServiceManager.getService("activity");获取了一个系统级别及的Service,而这个Service其实就是ActivityManagerService,然后通过asInterface方法返回一个IActivityManager对象,传入的参数是ActivityManagerService的一个binder对象,相当于远程引用。下面再看asInterface方法,这个方法非常关键,代理模式在这个方法中也提现的淋漓尽致!!!


    static public IActivityManager asInterface(IBinder obj) {if (obj == null) {return null;}IActivityManager in =(IActivityManager)obj.queryLocalInterface(descriptor);if (in != null) {return in;}return new ActivityManagerProxy(obj);}


在这个方法的最后一句,new ActivityManagerProxy(obj);传入了ActivityManagerService的引用,构造了代理对象返回,这个刚好符合静态代理模式。


分析到这里,也就完成了创建持有ActivityManagerService的引用的代理ActivityManagerProxy的实例。也就是说,ActivityManagerNatived.gDefault返回的实质上时一个代理对象,ActivityManagerProxy的实例。


 appTasks = ActivityManagerNative.getDefault().getAppTasks(mContext.getPackageName());


上面代码实际上调用的是ActivityManagerProxy类中的getTasks方法,继续跟踪源码,查看ActivityManagerProxy的getTasks方法,源码如下:

    public List<IAppTask> getAppTasks(String callingPackage) throws RemoteException {Parcel data = Parcel.obtain();Parcel reply = Parcel.obtain();data.writeInterfaceToken(IActivityManager.descriptor);data.writeString(callingPackage);mRemote.transact(GET_APP_TASKS_TRANSACTION, data, reply, 0);reply.readException();ArrayList<IAppTask> list = null;int N = reply.readInt();if (N >= 0) {list = new ArrayList<>();while (N > 0) {IAppTask task = IAppTask.Stub.asInterface(reply.readStrongBinder());list.add(task);N--;}}data.recycle();reply.recycle();return list;}

这里的源码的逻辑就比较明确了,通过 mRemote.transact方法将数据打包跨进程传递给Server端的 ActivityManagerService处理并返回结果。ActivityManagerService的getAppTasks方法会被调用并返回结果, mRemote是IBinder对象,transact方法我们在aidl中已经详细说明过了,这里不再赘述,然后将返回数据的Binder对象解析获得数据,还是通过asInterface方法将Binder对象转换为我们需要的对象。

最后ActivityManagerService的getAppTasks方法就不再赘述了。

通过上面的源码,应该对源码中的代理模式有很深的理解了。


















http://www.lbrq.cn/news/2539027.html

相关文章:

  • 北京网站建设推广服务优化最狠的手机优化软件
  • jsp网站建设项目实战添加友情链接的技巧
  • 网站建设现在什么服务器比较好信息流广告接单平台
  • 秦皇岛短视频优化百度seo排名如何提升
  • 写作网企业网站排名优化
  • 深圳建设网站网站流量数据
  • 网站 建设 汇报广州营销课程培训班
  • 像做网站平台取什么名字好搜狗搜索推广
  • 南通制作网站产品宣传方案
  • 安徽专业做网站的大公司推荐几个靠谱的网站
  • wordpress搭建nich站全球网站排名前100
  • 厦门网站建设策划鼓楼网站seo搜索引擎优化
  • 政府网站建设的突出问题百度关键词排名联系方式
  • pr免费模板网站河北seo网络优化师
  • 企业做网站预付账款会计分录想做一个网站
  • 同ip多域名做网站手机营销软件
  • 做公司网站的平台搜索引擎营销的模式有哪些
  • 搜狐综合小时报2022113011超级优化大师
  • 做网站怎么电话约客户怎么在百度打广告
  • 产品宣传型企业网站怎么建设百度sem竞价
  • 省建设安全监督站的网站希爱力双效片骗局
  • 免费b站推广网址有哪些新手如何做网上销售
  • 做物流公司网站哪家好排名seo公司哪家好
  • 网站 网页制作厦门seo招聘
  • wordpress支持多少会员站内关键词自然排名优化
  • 做简历用什么网站seo和sem是什么意思
  • 网站建设gon西安网站建设公司
  • 自适应网页如何设计优化公司组织架构
  • 如何做360网站优化湖北百度推广公司
  • 现在学java的都是傻子网站优化排名易下拉软件
  • 能表示旋转的矩阵是一个流形吗?
  • 更换KR100门禁读头&主机
  • Agents-SDK智能体开发[4]之集成MCP入门
  • 【Android】通知
  • 704. 二分查找
  • 【相机】曝光时间长-->拖影