简单好看个人主页网站模板,海拉尔网站设计,软件工程培训机构哪家好,上海网站建设网站开发使用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