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

河北省网站建设_网站建设公司_建站流程_seo优化

简单好看个人主页网站模板,海拉尔网站设计,软件工程培训机构哪家好,上海网站建设网站开发使用bindService去调用service#xff0c;如果有多个客户端调用#xff0c;onBind方法只会被调用一次#xff0c;由于bindService嗲处理中#xff0c;AMS是一个中间商#xff0c;猜测这个处理也是AMS里进行的#xff0c;这里我们再看看bindService的调用流程 public clas…使用bindService去调用service如果有多个客户端调用onBind方法只会被调用一次由于bindService嗲处理中AMS是一个中间商猜测这个处理也是AMS里进行的这里我们再看看bindService的调用流程 public class ContextWrapper extends Context { Context mBase; public ContextWrapper(Context base) { mBase base; } public boolean bindService(Intent service, ServiceConnection conn, int flags) { return mBase.bindService(service, conn, flags); } ContextImpl.java // bindService Override public boolean bindService(Intent service, ServiceConnection conn, int flags) { warnIfCallingFromSystemProcess(); return bindServiceCommon(service, conn, flags, Process.myUserHandle()); } // bindServiceCommon private boolean bindServiceCommon(Intent service, ServiceConnection conn, int flags, UserHandle user) { IServiceConnection sd; ... //包装ServiceConnection sd mPackageInfo.getServiceDispatcher(conn, getOuterContext(), mMainThread.getHandler(), flags); ... int res ActivityManagerNative.getDefault().bindService( mMainThread.getApplicationThread(), getActivityToken(), service, service.resolveTypeIfNeeded(getContentResolver()), sd, flags, getOpPackageName(), user.getIdentifier()); ... } 这里是通过binder和AMS进行通信一次binder调用 ActivityManagerNative.java private static final SingletonIActivityManager gDefault new SingletonIActivityManager() { 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; } }; } 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); } public abstract class SingletonT { private T mInstance; protected abstract T create(); public final T get() { synchronized (this) { if (mInstance null) { mInstance create(); } return mInstance; } } } 即包装ServiceManager.getService(activity); 继续查看bindServiceCommon方法 private boolean bindServiceCommon(Intent service, ServiceConnection conn, int flags, Handler handler, UserHandle user) { IServiceConnection sd; if (conn null) { throw new IllegalArgumentException(connection is null); } if (mPackageInfo ! null) { sd mPackageInfo.getServiceDispatcher(conn, getOuterContext(), handler, flags); } else { throw new RuntimeException(Not supported in system context); } validateServiceIntent(service); try { IBinder token getActivityToken(); if (token null (flagsBIND_AUTO_CREATE) 0 mPackageInfo ! null mPackageInfo.getApplicationInfo().targetSdkVersion android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) { flags | BIND_WAIVE_PRIORITY; } service.prepareToLeaveProcess(this); int res ActivityManagerNative.getDefault().bindService( mMainThread.getApplicationThread(), getActivityToken(), service, service.resolveTypeIfNeeded(getContentResolver()), sd, flags, getOpPackageName(), user.getIdentifier()); 这个sd是怎么来的呢 ServiceDispatcher用来包装ServiceConnection 创建binder实体对象用来响应回调 LoadedApk.java public final IServiceConnection getServiceDispatcher(ServiceConnection c, Context context, Handler handler, int flags) { synchronized (mServices) { LoadedApk.ServiceDispatcher sd null; ArrayMapServiceConnection, LoadedApk.ServiceDispatcher map mServices.get(context); if (map ! null) { sd map.get(c); } if (sd null) { sd new ServiceDispatcher(c, context, handler, flags); if (map null) { map new ArrayMapServiceConnection, LoadedApk.ServiceDispatcher(); mServices.put(context, map); } map.put(c, sd); } else { sd.validate(context, handler); } return sd.getIServiceConnection(); } } ServiceDispatcher(ServiceConnection conn, Context context, Handler activityThread, int flags) { mIServiceConnection new InnerConnection(this); mConnection conn; mContext context; mActivityThread activityThread; mLocation new ServiceConnectionLeaked(null); mLocation.fillInStackTrace(); mFlags flags; } InnerConnection用来进行binder通信 private static class InnerConnection extends IServiceConnection.Stub { final WeakReferenceLoadedApk.ServiceDispatcher mDispatcher; InnerConnection(LoadedApk.ServiceDispatcher sd) { mDispatcher new WeakReferenceLoadedApk.ServiceDispatcher(sd); } public void connected(ComponentName name, IBinder service) throws RemoteException { LoadedApk.ServiceDispatcher sd mDispatcher.get(); if (sd ! null) { sd.connected(name, service); } } } AMS端作为Proxy进行调用connected方法 IServiceConnection.Stub的定义 vi out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/app/IServiceConnection.java /* * This file is auto-generated.  DO NOT MODIFY. * Original file: frameworks/base/core/java/android/app/IServiceConnection.aidl */ package android.app; /** hide */ public interface IServiceConnection extends android.os.IInterface { /** Local-side IPC implementation stub class. */ public static abstract class Stub extends android.os.Binder implements android.app.IServiceConnection { Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException { switch (code) { case INTERFACE_TRANSACTION: { reply.writeString(DESCRIPTOR); return true; } case TRANSACTION_connected: { data.enforceInterface(DESCRIPTOR); android.content.ComponentName _arg0; if ((0!data.readInt())) { _arg0 android.content.ComponentName.CREATOR.createFromParcel(data); } else { _arg0 null; } android.os.IBinder _arg1; _arg1 data.readStrongBinder(); this.connected(_arg0, _arg1); return true; } } return super.onTransact(code, data, reply, flags); } private static class Proxy implements android.app.IServiceConnection { private android.os.IBinder mRemote; Proxy(android.os.IBinder remote) AMS通过调用传入的proxy来和client端进行交互 ActivityManagerService中有方法 public void publishService(IBinder token, Intent intent, IBinder service) { // Refuse possible leaked file descriptors if (intent ! null intent.hasFileDescriptors() true) { throw new IllegalArgumentException(File descriptors passed in Intent); } synchronized(this) { if (!(token instanceof ServiceRecord)) { throw new IllegalArgumentException(Invalid service token); } mServices.publishServiceLocked((ServiceRecord)token, intent, service); } } ActiveServices.java void publishServiceLocked(ServiceRecord r, Intent intent, IBinder service) { ... for (int connir.connections.size()-1; conni0; conni--) { ArrayListConnectionRecord clist r.connections.valueAt(conni); for (int i0; iclist.size(); i) { ConnectionRecord c clist.get(i); ... try { //binder调用AMS调用client的方法把service的binder传过去 c.conn.connected(r.name, service); } catch (Exception e) { Slog.w(TAG, Failure sending service r.name to connection c.conn.asBinder() (in c.binding.client.processName ), e); } } } ... } ConnectionRecord.java final class ConnectionRecord { final AppBindRecord binding;    // The application/service binding. final ActivityRecord activity;  // If non-null, the owning activity. final IServiceConnection conn;  // The client connection. AMS中 public int bindService(IApplicationThread caller, IBinder token, Intent service, String resolvedType, IServiceConnection connection, int flags, String callingPackage, int userId) throws TransactionTooLargeException { enforceNotIsolatedCaller(bindService); // Refuse possible leaked file descriptors if (service ! null service.hasFileDescriptors() true) { throw new IllegalArgumentException(File descriptors passed in Intent); } if (callingPackage null) { throw new IllegalArgumentException(callingPackage cannot be null); } synchronized(this) { return mServices.bindServiceLocked(caller, token, service, resolvedType, connection, flags, callingPackage, userId); } } 在ActivityManagerService.java中有定义 final ActiveServices mServices; ActiveServices.java中 bindServiceLocked bringUpServiceLocked public final class ActiveServices { private final void realStartServiceLocked(ServiceRecord r, ProcessRecord app, boolean execInFg) throws RemoteException { ... r.app app; ... app.thread.scheduleCreateService(r, r.serviceInfo, mAm.compatibilityInfoForPackageLocked(r.serviceInfo.applicationInfo), app.repProcState); r.postNotification(); ... // requestServiceBindingsLocked(r, execInFg); updateServiceClientActivitiesLocked(app, null, true); ... } private final boolean requestServiceBindingLocked(ServiceRecord r, IntentBindRecord i, boolean execInFg, boolean rebind) throws TransactionTooLargeException { if (r.app null || r.app.thread null) { // If service is not currently running, cant yet bind. return false; } if ((!i.requested || rebind) i.apps.size() 0) { try { bumpServiceExecutingLocked(r, execInFg, bind); r.app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_SERVICE); r.app.thread.scheduleBindService(r, i.intent.getIntent(), rebind, r.app.repProcState); if (!rebind) { i.requested true; } i.hasBound true; i.doRebind false; } catch (TransactionTooLargeException e) { … … } } return true; } final class ProcessRecord { IApplicationThread thread; 这里是binder调用 在启动应用的过程中通过对AMS的binder调用传给了AMS一个ApplicationThread的proxy对象。 public abstract class ApplicationThreadNative extends Binder implements IApplicationThread { /** ActivityThread.java中有内部类 private class ApplicationThread extends ApplicationThreadNative { private static final String DB_INFO_FORMAT  %8s %8s %14s %14s  %s; 调用到ApplicationThread的 public final void scheduleBindService(IBinder token, Intent intent, boolean rebind, int processState) { updateProcessState(processState, false); BindServiceData s new BindServiceData(); s.token token; s.intent intent; s.rebind rebind; sendMessage(H.BIND_SERVICE, s); } 处理该消息时调用ActivityThread的 private void handleBindService(BindServiceData data) { Service s mServices.get(data.token); if (s ! null) { try { data.intent.setExtrasClassLoader(s.getClassLoader()); data.intent.prepareToEnterProcess(); try { if (!data.rebind) { IBinder binder s.onBind(data.intent); ActivityManagerNative.getDefault().publishService( data.token, data.intent, binder); } else { s.onRebind(data.intent); ActivityManagerNative.getDefault().serviceDoneExecuting( data.token, SERVICE_DONE_EXECUTING_ANON, 0, 0); } ensureJitEnabled(); } catch (RemoteException ex) { throw ex.rethrowFromSystemServer(); } } catch (Exception e) { } } } 在server进程中通过调用AMS服务publishService把binder对象传给AMS
http://www.ihoyoo.com/news/89382.html

相关文章:

  • 网站建设需要了解哪些信息怎样把域名和做的网站连接不上
  • 流行的网站建设技术有哪些彩页设计模板
  • 茶叶有什么网站可以做推广wordpress账号图片尺寸
  • 南宁网站搜索引擎优网页设计入门代码
  • 微信公众号 做不了微网站吗40岁软件工程师的出路
  • 东莞寮步镇网站徐州网站建设公司官网
  • 成都 网站建设培训班客户网站回访
  • 松江新城投资建设有限公司网站网站更换空间改版收录
  • 哪个做网站公司电视剧手机网站大全
  • 西安哪家网站建设公司好wordpress如何设置用户登录
  • 鹰潭网站开发免费代理服务器proxy
  • 排行榜网站暴走漫画网站建设目的
  • 烟台网站优化推广优质手机网站建设
  • 建站平台系统WordPress搭建點播流媒體
  • 站长之家域名查询大全做网站的专业叫什么软件
  • 四川省城乡建设网网站青海省制作网站专业
  • 不用写代码可以做网站的软件广州网站建设招聘
  • 电子商务网站建设的规划方案五莲网站建设
  • 中台网站开发专业做医院网站建设
  • 劳动人事争议仲裁网站建设广州网站建设服务商
  • 行业门户型网站制作长沙建个网站一般需要多少钱
  • 网站建设使用哪种语言好impreza wordpress
  • 馆陶网站建设费用cen wordpress
  • 做网站安全联盟解长治市郊区住房建设局网站
  • 晋江免费网站建设wordpress加载js
  • 网站改版的宣传词成都seo培训班
  • 企业 网站微信 建设山东一级造价师考试时间
  • 网站某个链接失效移动网站打不开解决办法
  • 陕西省建设厅网站官网织梦网站源码转换成wordpress
  • 提供邢台企业做网站如何做视频网站赚钱