標籤:android sdk 硬體加速 屬性 許可權
AndroidManifest.xml檔案中<permission>和<uses-permission>的區別和用法
1. <uses-permission>是官方定義的許可權,是調用別人的東西的時候自己需要聲明的許可權;而<permission>是自己定義的許可權,是別人要調用這個程式時需要聲明的許可權。因而一般情況下是不需要為自己的應用程式聲明某個許可權,除非提供了供其他應用程式調用的代碼或者資料,這個時候才需要使用<permission>標籤。
2. <uses-permission>和<permission>的作用於不同,兩者是在與<application>同級節點的地方聲明,但<uses-permission>是作用於整個application中,而<permission>只作用於application內部的各個組件,如<activity>、<service>、<provider>等內部中。
用法樣本
在<application>同節點出聲明了自己的許可權 <permissionandroid:name= “com.notfatboy.project.VIEW_MYDATA”>,則在<application>中的某個<activity>中便可使用這個許可權,如下:
<application…>
<activity android:name= “com.notfatboy.project.FileManageActivity”…
Android:permission= “com.notfatboy.project.VIEW_MYDATA”
…
</activity>
當然,還需使用<uses-permission>來聲明該應用程式需要這個許可權,這樣應用程式才能正常工作。如下:
<uses-permission android:name= “com.notfatboy.project.FileManageActivity”>
<permission>文法格式如下:
<permission android:description= “string resource”
android:icon= “drawableresource”
android:label= “string resource”
android:name= “string”
android:permissionGroup= “string”
android:protectionLevel= [“normal”| “dangerous” | “signature” | “signatureOrSystem”] />
其中,android:name是描述許可權的名稱;androidLprotectionLevel屬性是必須要聲明的,用於告訴系統通知使用者的應用的許可要求;permissionGroup屬性是可選的,用於協助系統向使用者顯示許可權,很少自訂,最好使用已經定義的,使用起來更方便。
Android控制硬加速hardwareAccelerated
從Android 3.0 (API level 11)開始,Android的2D顯示管道被設計成更加支援硬加速,硬加速使用GPU承擔所有在View的canvas上執行的繪製操作。啟用硬加速最簡單的方法是對整個應用啟用硬體加速。如果你的應用程式只使用標準的view和Drawable,全域啟用硬加速不會帶來任何負面影響。然而,硬加速不是被所有的2D繪製支援,所以啟用它時可能對自訂繪製產生影響。出現的問題經常是不可見的,可能是異常,也可能是錯誤地顯示了像素。為避免這些問題,Android允許在<application>, <activity>, <window>, <view>中啟用會禁止硬加速的能力。即添加屬性android:hardwareAccelerated=“true”。
Window層級是比application和activity層級更高粒度的控制,用以下方法為一個window啟用硬加速:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
但不能在window層級禁止硬加速。
View層級是比application,activity和window層級更高粒度的控制,可以在運行時使用以下代碼禁止個別view的硬加速:myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null),但不能在view層級啟用硬體加速。
如何判定一個View是否被硬加速: 有時一個應用瞭解是否啟用了硬體加速是很有用的,對那些自訂View之類的東西尤其重要。在應用中做了一些不被最新的管線所支援的自訂繪製時這更加重要。有兩種方法可以檢查應用是否被硬加速: View.isHardwareAccelerated(): 如果View附加到一個硬加速的window上就返回true;Canvas.isHardwareAccelerated(): 如果Canvas被硬加速了就返回true。如果你必須在你的繪製代碼中做這個,應使用Canvas.isHardwareAccelerated()而不是 View.isHardwareAccelerated()。當一個view附加到一個硬加速的window上,它仍可以使用非硬體速的Canvas進行 繪製操作.比如當為了快取而把一個view畫到一個bitmap中。
Android:configChanges屬性
android:configChanges屬性用在<activity>元素中控制切屏(橫屏與豎屏之間切換)時,是否重新調用各個聲明周期。值為“orientation|screenSize”表示切屏時可以阻止程式在運行時重新載入Activity;值為“orientation”表示切屏時會重新調用各個生命週期,切橫、豎屏時只會執行一次;不設定android:configChanges屬性,切屏會重新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次。
android:screenOrientation屬性
該屬性用於限制橫豎屏的切換,屬性值為“portrait”表示限制該頁面只顯示豎屏,屬性值為“landscape”表示限制該頁面只顯示橫屏。
android:launchMode屬性
launchMode在多個Activity跳轉的過程中扮演著重要的角色,它可以決定是否產生新的Activity執行個體,是否重用已存在的Activity執行個體,是否和其他Activity執行個體共用一個task。這裡簡單介紹下task的概念,task是一個具有棧結構的對象,一個task可以管理多個Activity。啟動一個應用,也就建立了一個與之對應的task。
Activity一共有四種launchMode:standard, singleTop, singleTask, singleInstance。我們可以在AndroidManifest.xml配置<activity>的android:launchMode屬性為以上四種之一。下面分別介紹四個值:
1. standard: standard模式是預設的啟動模式,不管task中有沒有已存在的Activity執行個體,當載入Activity執行個體時,系統都會產生新的執行個體放在task的棧頂。
2. singleTop: 從Activity1跳到Activity2,再從Activity2跳到Activity1,如果此時task棧頂為Activity1執行個體,則不建立新的執行個體,直接使用該執行個體;如果棧頂不是Activity1的執行個體,則需要建立Activity1的新的執行個體。
3. singleTask: 從Activity1跳到Activity2,再從Activity2跳到Activity1時,只要task棧中Activity1的執行個體,不管是在棧頂還是棧底,都不會建立Activity1的新執行個體,而是直接使用已存在的Activity1執行個體。
4. singleInstance: 在全域範圍內一個Activity只有一個對應的執行個體,即便是在不同的apk中調用。
android:windowSoftInputMode屬性
用於定義activity主視窗與軟鍵盤的互動模式,可以用來避免IME面板遮擋的問題,Android1.5後新增加的一個特性。該屬效能影響兩件事:
1. 當有焦點產生時,軟鍵盤是隱藏還是顯示
2. 是否減少活動主視窗大小以便騰出空間存放軟鍵盤、
它的設定必須是下面列表中的一個值,或者是一個“state…”值加一個“adjust…”值的組合。在任一組設定多個值—多個“state…”values,例如&mdash有未定義的結果。各個值之間用|分開。例如: <activityandroid:windowSoftInputMode= “stateVisible|adjustResize”…>,在這設定的值將覆蓋在主題中設定的值。
各值的含義:
stateUnspecified:軟鍵盤的狀態並沒有指定,系統將選擇一個合適的狀態或依賴於主題的設定
stateUnchanged:當這個activity出現時,軟鍵盤將一直保持在上一個activity裡的狀態,無論是隱藏還是顯示
stateHidden:使用者選擇activity時,軟鍵盤總是被隱藏
stateAlwaysHidden:當該Activity主視窗擷取焦點時,軟鍵盤也總是被隱藏的
stateVisible:軟鍵盤通常是可見的
stateAlwaysVisible:使用者選擇activity時,軟鍵盤總是顯示的狀態
adjustUnspecified:預設設定,通常由系統自行決定是隱藏還是顯示
adjustResize:該Activity總是調整螢幕的大小以便留出軟鍵盤的空間
adjustPan:當前視窗的內容將自動移動以便當前焦點從不被鍵盤覆蓋和使用者能總是看到輸入內容的部分
android:exported屬性
這個屬性用於指示該服務是否能夠被其他應用程式組件調用或跟它互動。如果設定為true,則能夠被調用或互動,否則不能。設定為false時,只有同一個應用程式的組件或帶有相同使用者ID的應用程式才能啟動或綁定該服務。它的預設值依賴與該服務所包含的過濾器。沒有過濾器則意味著該服務只能通過指定明確的類名來調用,這樣就是說該服務只能在應用程式的內部使用(因為其他外部使用者不會知道該服務的類名),因此這種情況下,這個屬性的預設值是false。另一方面,如果至少包含了一個過濾器,則意味著該服務可以給外部的其他 應用提供服務,因此預設值是true。這個屬性不是限制把服務暴露給其他應用程式的唯一方法。還可以使用許可權來限制能夠跟該服務互動的外部實體。
android:authorities屬性
用於表明content的供應商,值為provider所在包的名字+provider本身。例如: android:authorities="com.bbk.VoiceAssistant.provider"
Android學習筆記(一)