關於那些Android中不常用的設置屬性

来源:http://www.cnblogs.com/shouce/archive/2016/04/27/5437452.html
-Advertisement-
Play Games

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


很多在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

    輸入法將被換成系統輸入法,當外部存儲介質被重新載入後用戶可以通過系統設置來啟動我們的輸入法

  ④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,當然是對於開發者而言的,主要是方便開發者去支持阿拉伯語/波斯語等閱讀習慣是從右往左的。 

可以在manifestapplication標簽添加: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共用,我們可獲取到程式Acontext。因此,我們就可以通過context來獲取程式A對應的各種資源。比較常用的就是Raw資源的獲取,如一些軟體的apk皮膚包就是採用了這種技術,將主程式和皮膚資源包分在兩個apk中。

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

看見程式AB之間的聯繫有三個:

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

2 createpackageContext時需要知道目標APKpackagename

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

 

七、android:settingsActivity

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

 

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

Activity一共有以下四種launchMode

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

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

這就是standard啟動模式,不管有沒有已存在的實例,都生成新的實例。跟普通的棧一樣,先進後出。

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

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

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

 

九、android:taskAffinity

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

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

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

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

 

十、android:configChanges

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

1、不設置Activityandroid:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次

2、設置Activityandroid:configChanges="orientation"時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次

3、設置Activityandroid: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列表中顯示,就是使用該activityapp不會出現在最近使用app列表中

 

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

 

 

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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用場景 一個半透明的框上面 放了一些label 改變半透明view的alpha 結果 label的 alpha 也跟著改變了。 其實不用那麼麻煩 給你們UI 要一個色值也可以 不需要 自己寫了 這樣比較好一點 。 既然 這樣寫了 出現問題 就解決問題。 針對放在一個view的label 字體顏色的 ...
  • 首先,什麼是block:block其實就是一個代碼塊,把你想要執行的代碼封裝在這個代碼塊里,等到需要的時候再去調用。那block是OC對象嗎?答案是肯定的 做一道很簡單的關於block的測試題。: 這道題是我公司面試題中的一道,來面試的都是至少兩年工作經驗的,但是很鬱悶,這道題絕大多數人寫的都是6。 ...
  • 新手一枚,在學習過程中,整理自己的筆記,與各位新手大大一起分享,一起進步(PS:其實是怕自己會忘記,又苦於沒有錢買筆記本,哈哈),如有錯誤,望大家提出,我一定最快修改,這僅僅是小生的自我理解,並不想誤人子弟,不喜勿噴. 首先,整理一下在OC基礎中會接觸到的類: NSString,NSMutableS ...
  • WebView的使用 WebView既可以和Intent一樣實現界面跳轉一樣,讓系統瀏覽器打開頁面,也可以在應用程式中打開頁面 註意用WebView時,需要註冊網路服務 代碼如下: package com.example.webviewexample; import android.app.Acti ...
  • 這裡我們將採取的方案是使用組合View的方式,先自定義一個佈局繼承自LinearLayout,然後在這個佈局中加入下拉頭和ListView這兩個子元素,並讓這兩個子元素縱向排列。初始化的時候,讓下拉頭向上偏移出屏幕,這樣我們看到的就只有ListView了。然後對ListView的touch事件進行監 ...
  • 轉載:http://blog.csdn.net/way_ping_li/article/details/8487866 把自己應用的調試信息寫入到SD卡中。 系統許可權 時間工具類: 方法的調用: pspspspspsp ...
  • 代碼: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.title=@"拍照動畫"; } //點擊任何處,彈出動畫 -(void)touchesBeg ...
  • UITableView UITableView的樣式有兩種,一種是Grouped(左圖),另一種是Plain(右圖),如下圖,它的屬性是style,類型為UITableViewStyle,枚舉值分別是UITableViewStyleGrouped和UITableViewStylePlain; 用這個 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...