Android Framework中的PolicyManager簡介

來源:互聯網
上載者:User

PolicyManager類位於framework\base\core\java\com\android\internal\policy目錄中的PolicyManager.java檔案中。PolicyManager主要用於建立Window類、LayoutInflater類和WindowManagerPolicy類,它扮演著簡單原廠模式中的工廠類角色,而抽象產品角色由IPolicy介面實現,具體產品角色由Policy類實現。它們的關係如所示:

從下面三個類的代碼可以看出,都使用了hide註解,因此,這三個類都是不對外公開的API,只限於Framework內部使用。

抽象產品類IPolicy實現如下(IPolicy.java):

package com.android.internal.policy;</p><p>import android.content.Context;<br />import android.view.LayoutInflater;<br />import android.view.Window;<br />import android.view.WindowManagerPolicy;</p><p>/**<br /> * {@hide}<br /> */</p><p>/* The implementation of this interface must be called Policy and contained<br /> * within the com.android.internal.policy.impl package */<br />public interface IPolicy {<br /> public Window makeNewWindow(Context context);</p><p> public LayoutInflater makeNewLayoutInflater(Context context);</p><p> public WindowManagerPolicy makeNewWindowManager();<br />}<br />

具體產品類Policy實現如下(Policy.java):

package com.android.internal.policy.impl;</p><p>import android.content.Context;<br />import android.util.Log;</p><p>import com.android.internal.policy.IPolicy;<br />import com.android.internal.policy.impl.PhoneLayoutInflater;<br />import com.android.internal.policy.impl.PhoneWindow;<br />import com.android.internal.policy.impl.PhoneWindowManager;</p><p>/**<br /> * {@hide}<br /> */</p><p>// Simple implementation of the policy interface that spawns the right<br />// set of objects<br />public class Policy implements IPolicy {<br /> private static final String TAG = "PhonePolicy";</p><p> //需要在Policy類建立時積極式載入的一些類<br /> private static final String[] preload_classes = {<br /> "com.android.internal.policy.impl.PhoneLayoutInflater",<br /> "com.android.internal.policy.impl.PhoneWindow",<br /> "com.android.internal.policy.impl.PhoneWindow$1",<br /> "com.android.internal.policy.impl.PhoneWindow$ContextMenuCallback",<br /> "com.android.internal.policy.impl.PhoneWindow$DecorView",<br /> "com.android.internal.policy.impl.PhoneWindow$PanelFeatureState",<br /> "com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState",<br /> };</p><p> static {<br /> // 出於效能考慮,在Policy類載入時提前載入會用到的相關類<br /> for (String s : preload_classes) {<br /> try {<br /> //載入指定類到Java虛擬機器中,並執行類中的靜態程式碼片段<br /> Class.forName(s);<br /> } catch (ClassNotFoundException ex) {<br /> Log.e(TAG, "Could not preload class for phone policy: " + s);<br /> }<br /> }<br /> }</p><p> public PhoneWindow makeNewWindow(Context context) {<br /> return new PhoneWindow(context);<br /> }</p><p> public PhoneLayoutInflater makeNewLayoutInflater(Context context) {<br /> return new PhoneLayoutInflater(context);<br /> }</p><p> //PhoneWindowManager實現了WindowManagerPolicy介面<br /> //這裡傳回值直接寫成WindowManagerPolicy更合理些<br /> public PhoneWindowManager makeNewWindowManager() {<br /> return new PhoneWindowManager();<br /> }<br />}<br />

工廠類PolicyManager實現如下(PolicyManager.java):

<pre class="java" name="code">package com.android.internal.policy;import android.content.Context;import android.view.LayoutInflater;import android.view.Window;import android.view.WindowManagerPolicy;import com.android.internal.policy.IPolicy;/** * {@hide} */public final class PolicyManager { private static final String POLICY_IMPL_CLASS_NAME = "com.android.internal.policy.impl.Policy"; private static final IPolicy sPolicy; static { // 運行時動態裝載IPolicy實作類別 try { //載入Policy類的同時會執行其中的靜態程式碼片段 Class policyClass = Class.forName(POLICY_IMPL_CLASS_NAME); sPolicy = (IPolicy)policyClass.newInstance(); } catch (ClassNotFoundException ex) { throw new RuntimeException( POLICY_IMPL_CLASS_NAME + " could not be loaded", ex); } catch (InstantiationException ex) { throw new RuntimeException( POLICY_IMPL_CLASS_NAME + " could not be instantiated", ex); } catch (IllegalAccessException ex) { throw new RuntimeException( POLICY_IMPL_CLASS_NAME + " could not be instantiated", ex); } } // 建構函式私人,保證是單例類 private PolicyManager() {} // The static methods to spawn new policy-specific objects public static Window makeNewWindow(Context context) { return sPolicy.makeNewWindow(context); } public static LayoutInflater makeNewLayoutInflater(Context context) { return sPolicy.makeNewLayoutInflater(context); } public static WindowManagerPolicy makeNewWindowManager() { return sPolicy.makeNewWindowManager(); }}</pre><p>


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.