關於那些Android中不常用的設定屬性,android設定屬性

來源:互聯網
上載者:User

關於那些Android中不常用的設定屬性,android設定屬性

很多在manifest中的屬性我們經常遺忘了它們,或者經常看到但又不是很明白它的作用。那麼在這裡我就拿了一些屬性簡單的解釋一下,防止以後碰到卻不知道其中的意思。不是很全,以後會斷斷續續的補充吧

 

一、android:installLocation="internalOnly"
android:installLocation隸屬於AndroidManifest.XML中的manifest節點.如下所示:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"          package="string"          android:sharedUserId="string"          android:sharedUserLabel="string resource"           android:versionCode="integer"          android:versionName="string"          android:installLocation=["auto" | "internalOnly" | "preferExternal"] >    . . .</manifest>

android:installLocation可以設定為"auto"、"internalOnly"、"preferExternal"三個值中的任何一個.

auto:程式可能被安裝在外部儲存介質上(例如:SD Card),但是預設會被安裝到手機記憶體中.當手機記憶體為空白時,程式將被安裝到外部儲存介質上.當程式安裝到手機上後,使用者可以決定把程式放在外部儲介質還是記憶體中.

internalOnly:預設值.當設定為該值時,程式只能被安裝在記憶體中,如果記憶體為空白,則程式將不能成功安裝.

preferExternal:將程式安裝在外部儲存介質上,但是系統不保證程式一定會被安裝到外部儲存介質上.當外部儲存介質不可以或空時,程式將被安裝到記憶體中.程式使用了forward-locking機制時也將被安裝到記憶體中,因為外部儲存不支援此機制.程式安裝後,使用者可以自由切換程式應該在外部還是內部儲存介質上.

簡而言之,就是控制應用是安裝在外部儲存上還是記憶體中,安裝在記憶體中
    ①Service

    正在啟動並執行服務將被終止,當外部儲存介質被重新載入時服務不會被重啟.

  ②Alarm Service

    鬧鐘服務將被取消,開發人員必須在外部儲存介質重新載入後重新註冊鬧鐘服務.

  ③Input Method Engines

    IME將被換成系統IME,當外部儲存介質被重新載入後使用者可以通過系統設定來啟動我們的IME

  ④Live Wallpapers

    我們的動態壁紙將被替換為預設的動態壁紙.外部儲存介質重載後,使用者可以更換回來.

  ⑤Live Folders

    我們的動態資料夾將被移出.

  ⑥App Widgets

    我們的小組件將被移出,通常只有系統重啟後我們的小組件才可用.

  ⑦Account Managers

    使用AccountManager建立的賬戶將會消失,直至儲存介質被重新載入.

  ⑧Sync Adapters

    只有外部儲存介質被重新載入時,我們的同步功能才可用

  ⑨Device Administrators

    我們的DeviceAdminReceiver將會失效

  ⑩監聽開機結束事件

    系統會在載入外部儲存介質之前發送ACTION_BOOT_COMPLETED廣播.因此安裝在外部儲存介質的程式將不能接受開機廣播.

 

二、android:versionCode

Google為APK定義了兩個關於版本屬性:VersionCode和VersionName,他們有不同的用途。

  • VersionCode:對消費者不可見,僅用於應用市場、程式內部識別版本,判斷新舊等用途。
  • VersionName:展示給消費者,消費者會通過它認知自己安裝的版本,下文提到的版本號碼都是說這個

 

三、android:protectionLevel="signature"
    normal:低風險許可權,只要申請了就可以使用(在AndroidManifest.xml中添加<uses-permission>標籤),安裝時不需要使用者確認;
    dangerous:高風險許可權,安裝時需要使用者的確認才可使用;
    signature:只有當申請許可權的應用程式的數位簽章與聲明此許可權的應用程式的數位簽章相同時(如果是申請系統許可權,則需要與系統簽名相同),才能將許可權授給它;
    signatureOrSystem:簽名相同,或者申請許可權的應用為系統應用(在system image中)。

    上述四類權限等級同樣可用於自訂許可權中。如果開發人員需要對自己的應用程式(或部分應用)進行存取控制,則可以通過在AndroidManifest.xml中添加<permission>標籤,將其屬性中的protectionLevel設定為上述四類層級中的某一種來實現。
A方:

<!-- 聲明許可權 -->   <permission android:name="com.example.testbutton.RECEIVE" />  <!-- 註冊Broadcast Receiver,並指定了給當前Receiver發送訊息方需要的許可權 -->          <receiver              android:name="com.example.testbutton.TestButtonReceiver"              android:permission="com.example.testbutton.RECEIVE" >              <intent-filter>                  <action android:name="com.test.action" />              </intent-filter>          </receiver> 

B方:

    <!-- 聲明使用指定的許可權 -->      <uses-permission android:name="com.example.testbutton.RECEIVE" />

 

四、uses-feature

Android Market會根據uses-feature過濾所有你裝置不支援的應用。通過使用<uses-feature>元素,一個應用可以指定它所 支援的硬體型號,舉個例子,有些裝置不支援多點觸控或者OpenGL ES 2.0,那麼過濾器就會過濾需要這些硬體支援(多點觸控或者OpenGL ES 2.0)的應用,使用者就不會在android market上看到這些應用。

android.hardware.touchscreen.multitouch:它要求裝置有一個多點觸控的螢幕以支援基本的多點觸控互動,就如收縮(放大)映像比例。這些類型的螢幕跟蹤多個手指的能力都有所不同,所以你必須確保這個螢幕的效能是能夠支援的遊戲進行。

android.hardware.touchscreen.multitouch.distinct: 這是一個多點觸控的兄弟屬性,它要求提裝置供完整的多點觸控功能。

現在只要記住在當你的遊戲需要一個支援多點觸控的螢幕的時候,我們可以使用 <uses-feature>元素來剔除所有不支援多點觸控的裝置,就像下面這樣:

<uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="true"/>

另外一個在遊戲開發中非常有用的是去指定需要的OpenGL ES版本。如果你的遊戲需要更強大的圖形處理能力,我們可以指定OpenGL ES 2.0,然後我們的遊戲只會被支援OpenGL ES 2.0的裝置所看見。注意,在本書中不會使用OPenGL ES 2.0, 我們只是過濾那些不能提供足夠圖形處理能力的裝置。下面顯示了我們怎麼去實現它。

<uses-feature android:glEsVersion="0x00020000" required="true"/>

 

五、android:supportsRtl="true"

android4.2有一個新特性 layoutRtl,當然是對於開發人員而言的,主要是方便開發人員去支援阿拉伯語/波斯語等閱讀習慣是從右往左的。 

可以在manifest的application標籤添加:android:supportsRtl 取值:true/false 

這樣就可以開啟layoutRtl這個功能。如果當前系統語言是阿拉伯語/波斯語,開啟了這個功能的應用的布局就會自動變成從右往左的,當然前提是布局沒有寫死控制項間的位置。 

 

六、android:sharedUserId

Android給每個APK進程分配一個單獨的空間,manifest中的userid就是對 應一個分配的Linux使用者ID,並且為它建立一個沙箱,以防止影響其他應用程式(或者其他應用程式影響它)。使用者ID 在應用程式安裝到裝置中時被分配,並且在這個裝置中保持它的永久性。

通常,不同的APK會具有不同的userId,因此運行時屬於不同的進程中,而不同進程中的資源是不共用的,在保障了程式啟動並執行穩定。然後在有些時候,我們自己開發了多個APK並且需要他們之間互相共用資源,那麼就需要通過設定shareUserId來實現這一目的。

通過Shared User id,擁有同一個User id的多個APK可以配置成運行在同一個進程中.所以預設就是可以互相訪問任意資料. 也可以配置成運行成不同的進程, 同時可以訪問其他APK的資料目錄下的資料庫和檔案.就像訪問本程式的資料一樣。

shareUserId設定:

在需要共用資源的項目的每個AndroidMainfest.xml中添加shareuserId的標籤。

android:sharedUserId="com.example"

id名自由設定,但必須保證每個項目都使用了相同的sharedUserId。一個mainfest只能有一個Shareuserid標籤。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.shareusertesta"    android:versionCode="1"    android:versionName="1.0"     android:sharedUserId="com.example">

\data\data\自訂的package\ 路徑下的互相訪問

每個安裝的程式都會根據自己的包名在手機檔案系統的data\data\your package\建立一個檔案夾(需要su許可權才能看見),用於儲存程式相關的資料。

在代碼中,我們通過context操作一些IO資源時,相關檔案都在此路徑的相應檔案夾中。比如預設不設定外部路徑的檔案、DB等等。

正常情況下,不同的apk無法互相訪問對應的app檔案夾。但通過設定相同的shareUserId後,就可以互相訪問了。

如:A程式中

//預設建立在data/data/xxx/file/             fOut = openFileOutput("settings.dat", MODE_PRIVATE);                        
osw = new OutputStreamWriter(fOut); osw.write(data); osw.flush();

B程式中

        //擷取程式A的context                    Context ctx = this.createPackageContext("com.example.shareusertesta",Context.CONTEXT_IGNORE_SECURITY);                    String msg = ReadSettings(ctxDealFile);                    Toast.makeText(this, "DealFile2 Settings read" + msg,Toast.LENGTH_SHORT).show();                    WriteSettings(ctx, "deal file2 write");

兩個程式就能互相的訪問資源了。(當然前提是都設定了相同的shareUserId)

Resources和SharedPreferences的共用

通過shareuserId共用,我們可擷取到程式A的context。因此,我們就可以通過context來擷取程式A對應的各種資源。比較常用的就是Raw資源的擷取,如一些軟體的apk皮膚包就是採用了這種技術,將主程式和皮膚資源套件分在兩個apk中。

獲 取Resources很簡單,在程式A和B的mainfest中設定好相同的shareuserId後,通過createPackageContext獲 取context即可。之後就和原來的方式一樣,通過getResources函數擷取各種資源,只是此時的context環境是目標APP的 context環境。

看見程式A和B之間的聯絡有三個:

1 mainfest中聲明shareuserId時需要知道一個共同的userId

2 createpackageContext時需要知道目標APK的package的name

3 擷取資源時需要知道該資源的對應ID

 

七、android:settingsActivity

不知道怎麼用的==,這是在一個源碼裡看到

 

八、android:launchMode="singleTop"  <Activity節點下>

Activity一共有以下四種launchMode:

1.standard    2.singleTop   3.singleTask    4.singleInstance

(1)standard:系統預設的標準型,每次跳轉系統都會在task中產生一個新的Activity執行個體,並且放於棧結構的頂部,當我們按下後退鍵時,才能看到原來的Activity執行個體。

這就是standard啟動模式,不管有沒有已存在的執行個體,都產生新的執行個體。跟普通的棧一樣,先進後出。

(2)single:它是在standard的標準下加了一個屬性。即當你要跳轉的activity是位於棧頂時,它不會再new一個新的執行個體出來。但如果是firstactivity和secondactivity交替跳轉,那跟普通的standard模式一樣。

(3)singleTask。它的原理是保證這個activity執行個體產生後是不會再產生新的執行個體。比如說兩個activity,first和second。First設為singleTask,然後跳轉到second,再返回first時,first不會產生執行個體,而是從棧中取出first放在棧頂。還有一點比較重要的一點是,在first上的activity會全部移除出棧,不管你這個activitys是不是也是singleTask模式,一律移除。

(4)singleInstance。這個就比較特殊了,不過也比較簡單。就是新開一個task棧專門放這個activity,而其它activity不讓它進去。

 

九、android:taskAffinity

每 個Activity都有taskAffinity屬性,這個屬性指出了它希望進入的Task。如果一個Activity沒有顯式的指明該 Activity的taskAffinity,那麼它的這個屬性就等於Application指明的taskAffinity,如果 Application也沒有指明,那麼該taskAffinity的值就等於包名。而Task也有自己的affinity屬性,它的值等於它的根 Activity的taskAffinity的值。 一開始,建立的Activity都會在建立它的Task中,並且大部分都在這裡度過了它的整個生命。

allowTaskReparenting用來標記Activity能否從啟動的Task移動到taskAffinity指定的Task,預設是繼承至 application中的allowTaskReparenting=false,如果為true,則表示可以更換;false表示不可以。

這兩個屬性通常是放在一起用的。

簡而言之,用了taskAffinity的activity執行個體化的時候會先看看有沒有與taskAffinity相同的task,如果有,則會跑到那邊的task中,並執行個體化。

 

十、android:configChanges

對android:configChanges屬性,一般認為有以下幾點:

1、不設定Activity的android:configChanges時,切屏會重新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次

2、設定Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命週期,切橫、豎屏時只會執行一次

3、設定Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命週期,只會執行onConfigurationChanged方法

但是,自從Android 3.2(API 13),在設定Activity的android:configChanges="orientation|keyboardHidden"後,還是一樣 會重新調用各個生命週期的。因為screen size也開始跟著裝置的橫豎切換而改變。所以,在AndroidManifest.xml裡設定的MiniSdkVersion和 TargetSdkVersion屬性大於等於13的情況下,如果你想阻止程式在運行時重新載入Activity,除了設定"orientation", 你還必須設定"ScreenSize"。 

http://www.cnblogs.com/adamzuocy/archive/2009/10/15/1583670.html

 

十一、android:exported
這個屬性用於指示該服務是否能夠被其他應用程式組件調用或跟它互動。如果設定為true,則能夠被調用或互動,否則不能。設定為false時,只有同一個應用程式的組件或帶有相同使用者ID的應用程式才能啟動或綁定該服務。它的預設值依賴與該服務所包含的過濾器。沒有過濾器則意味著該服務只能通過指定明確的類名來調用,這樣就是說該服務只能在應用程式的內部使用(因為其他外 部使用者不會知道該服務的類名),因此這種情況下,這個屬性的預設值是false。另一方面,如果至少包含了一個過濾器,則意味著該服務可以給外部的其他 應用提供服務,因此預設值是true。
這個屬性不是限制把服務暴露給其他應用程式的唯一方法。還可以使用許可權來限制能夠跟該服務互動的外部實體。

十二、android:immersive

貌似是全屏的設定,可以用來隱藏標題列和功能表列。可以通過代碼來實現不同的UI響應事件

十三、android:excludeFromRecents

控制在不在recent列表中顯示,就是使用該activity時app不會出現在最近使用app列表中

 

========================================

  

作者:cpacm
出處:(http://www.cnblogs.com/cpacm/p/4083443.html)

 
android 中button控制項都有些什常用的屬性

<Button
android:id="@+id/loginButton"
android:layout_width="50dp
android:layout_height="@dimen/button_footer_height"
android:layout_alignParentRight="true"
android:layout_gravity="center"
android:text="Login"
android:textSize="12dp"
android:visibility="invisible" />
我用到這些
 
android一些屬性問題

android:contentDescription="@string/app_name"

這是對你那個ImageView的圖片解釋,有沒有這個屬性對程式沒有什麼影響,只是方便程式員看;

style="?android:attr/buttonStyleSmall"這個意思是說這個是個小類型的button
android:minHeight="20dip" 設定最小高度
android:minWidth="50dip" 設定最小寬度
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.