<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                Android源碼里有不少關于代理模式的實現,比如源碼的[ActivityManagerProxy](https://www.androidos.net.cn/android/5.0.1_r1/xref/frameworks/base/core/java/android/app/ActivityManagerNative.java) 代理類, 其具體代理的是[ActivityManagerNative](https://www.androidos.net.cn/android/5.0.1_r1/xref/frameworks/base/core/java/android/app/ActivityManagerNative.java) 的子類[ActivityManagerService](https://www.androidos.net.cn/android/5.0.1_r1/xref/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java)。 [ActivityManager](https://www.androidos.net.cn/android/5.0.1_r1/xref/frameworks/base/core/java/android/app/ActivityManager.java)是Android中管理和維護Activity的相關信息的類,為了隔離它與ActivityManagerService,有效降低二者的耦合,在這中間使用了ActivityManagerProxy代理類,所有對ActivityManagerService的訪問都轉換成對代理類的訪問,這樣ActivityManager就與ActivityManagerService解耦了。 ![](https://box.kancloud.cn/a4d9e0c5cc30fe5a71a87f4d37285151_268x84.jpg) ![](https://box.kancloud.cn/a555c35a8896719796116df8b3beb40a_248x82.jpg) **ActivityManagerNative.java** ~~~ public abstract class ActivityManagerNative extends Binder implements IActivityManager{ ................................ } ~~~ **IActivityManager.java** ~~~ public interface IActivityManager extends IInterface { .................... } ~~~ **ActivityManagerService.java** ~~~ public final class ActivityManagerService extends ActivityManagerNative implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback { ..................... } ~~~ **ActivityManager.java** ~~~ public class ActivityManager { ................. } ~~~ 下面我們以API 21(Android 5.0.0_r7)來學習Android源碼中的代理模式 ActivityManagerProxy 這個類, 該類與ActivityManagerNative 這個類處于同一文件中。 ~~~ class ActivityManagerProxy implements IActivityManager{ .................. } ~~~ ActivityManagerProxy 實現了IActivityManager 接口,該接口定義了一些Activity 相關的接口方法, 其中有一些我們在應用開發中也時常接觸到。 **IActivityManager.java** ~~~ package android.app; /** * System private API for talking with the activity manager service. This * provides calls from the application back to the activity manager. * * {@hide} */ 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 ComponentName startService(IApplicationThread caller, Intent service, String resolvedType, int userId) throws RemoteException; public int stopService(IApplicationThread caller, Intent service, String resolvedType, int userId) throws RemoteException; ............. public int bindService(IApplicationThread caller, IBinder token, Intent service, String resolvedType, IServiceConnection connection, int flags, int userId) throws RemoteException; ................ public int checkPermission(String permission, int pid, int uid) throws RemoteException; ............... public void overridePendingTransition(IBinder token, String packageName, int enterAnim, int exitAnim) throws RemoteException; ............... } ~~~ IActivityManager 這個接口類就相當于代理模式中的抽象主題,那么真正的實現主題是誰呢?就是上面我們所提到過的繼承于ActivityManagerNative 的ActivityManagerService 類,這幾個類之間的大致關系如圖所示。 :-: ![](https://box.kancloud.cn/f720f39eb9bc2b2165922767d5e27b0f_643x498.png) IActivityManager的結構關系 通過UML類圖可以清晰地看到ActivityManagerProxy和ActivityManagerNative都實現了接口IActivityManager,嚴格來說, **ActivityManagerProxy 就是代理部分**,而ActivityManagerNative 就是真實部分,但**ActivityManagerNative 是個抽象類,其并不處理過多的具體邏輯, 大部分具體邏輯的實現都由其子類ActivityManagerService 承擔**,這就是為什么我們說真實部分應該為ActivityManagerService 而非ActivityManagerNative。**ActivityManagerService 是系統級的Service 并且運行于獨立的進程空間中,可以通過ServiceManger 來獲取它。而ActivityManagerProxy 也運行于自己所處的進程空間中,兩者并不相同,因此ActivityManager Proxy 與ActivityManagerService 的通信必定是通過跨進程來進行的,而由上述的類圖我們也可以了解到,這里跨進程的實現是基于Android 的Binder機制**,同時通過上面我們對代理模式的4 種適用情景可以判斷,**此處源碼所實現的代理實質為遠程代理**。**ActivityManagerProxy 在實際的邏輯處理中并未過多地被外部類使用,因為在Android 中管理與維護Activity 相關信息的類是另外一個叫做ActivityManager 的類**, **ActivityManager 雖說管理著Activity 的信息,但是實質上其大多數邏輯都由ActivityManagerProxy 承擔**,這里以其中的getAppTasks 方法為例,在ActivityManager 中getAppTasks 方法的邏輯如下。 **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; } ~~~ 主要只是簡單地調用了ActivityManagerNative的getDefault 方法獲取一個IActivityManager 類型的對象,然后通過該對象再調用其getAppTasks方法,注意,這里結合代理模式理解。而ActivityManagerNative的getDefault 方法只是單純地返回了。 **ActivityManagerNative:getDefault()** ~~~ static public IActivityManager getDefault() { return gDefault.get(); } ~~~ 這個gDefault 又是做什么的呢?具體如下代碼所示。 **ActivityManagerNative.getDefault** ~~~ 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** ,這里也就完成創建了一個對ActivityManagerService 的Client 代理對象ActivityManagerProxy 的實例。ActivityManagerProxy 中的getAppTasks 方法邏輯就很明確,將數據打包跨進程傳遞給Server 端ActivityManagerService 處理并返回結果。 **ActivityManagerProxy:getAppTasks** ~~~ 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<IAppTask>(); while (N > 0) { IAppTask task = IAppTask.Stub.asInterface(reply.readStrongBinder()); list.add(task); N--; } } data.recycle(); reply.recycle(); return list; } ~~~ 再來看看ActivityManagerService 中對getAppTasks 方法的邏輯處理 **ActivityManagerService:getAppTasks** ~~~ @Override public List<IAppTask> getAppTasks(String callingPackage) { int callingUid = Binder.getCallingUid(); long ident = Binder.clearCallingIdentity(); synchronized(this) { ArrayList<IAppTask> list = new ArrayList<IAppTask>(); try { if (localLOGV) Slog.v(TAG, "getAppTasks"); final int N = mRecentTasks.size(); for (int i = 0; i < N; i++) { TaskRecord tr = mRecentTasks.get(i); // Skip tasks that do not match the caller. We don't need to verify // callingPackage, because we are also limiting to callingUid and know // that will limit to the correct security sandbox. if (tr.effectiveUid != callingUid) { continue; } Intent intent = tr.getBaseIntent(); if (intent == null || !callingPackage.equals(intent.getComponent().getPackageName())) { continue; } ActivityManager.RecentTaskInfo taskInfo = createRecentTaskInfoFromTaskRecord(tr); AppTaskImpl taskImpl = new AppTaskImpl(taskInfo.persistentId, callingUid); list.add(taskImpl); } } finally { Binder.restoreCallingIdentity(ident); } return list; } } ~~~ 不了解Android 中的跨進程通信,也許對上述代碼理解起來會比較困難。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看