android雜記1

學學android開發。有不明白的請搜索。
http://oyeal.iteye.com/blog/941183
http://blog.csdn.net/renguichao/article/details/7667245
http://www.360doc.com/content/13/0620/15/110467_294299969.shtml
AndroidManifest.xml
AndroidManifest.xml配置文件詳解 
 http://blog.chinaunix.net/uid-9185047-id-3460344.html
android關於AndroidManifest.xml詳細分析
 http://blog.csdn.net/i_lovefish/article/details/9622565
 http://www.cnblogs.com/zady/archive/2013/10/14/3368385.html

1.AndroidManifest.xml 的屬性
android:versionCode  是給設備程序識別版本用的,必須是一個整數值代表app更新過多少次
android:versionName  則是給用戶查看版本用的,需要具備一定的可讀性,比如“1.0.0”這樣的
android:sharedUserId 表明數據權限,因爲默認情況下,Android給每個APK分配一個唯一的UserID,所以是默認禁止不同APK訪問共享數據的。若要共享數據,第一可以採用Share Preference方法,第二種就可以採用sharedUserId了,將不同APK的sharedUserId都設爲一樣,則這些APK之間就可以互相共享數據了
android:sharedUserLabel 一個共享的用戶名,它只有在設置了sharedUserId屬性的前提下才會有意義
android:installLocation
安裝參數,是Android2.2中的一個新特性,installLocation有三個值可以選擇:internalOnly、auto、preferExternal
選擇preferExternal,系統會優先考慮將APK安裝到SD卡上(當然最終用戶可以選擇爲內部ROM存儲上,如果SD存儲已滿,也會安裝到內部存儲上)
選擇auto,系統將會根據存儲空間自己去適應
選擇internalOnly是指必須安裝到內部才能運行
(注:需要進行後臺類監控的APP最好安裝在內部,而一些較大的遊戲APP最好安裝在SD卡上。現默認爲安裝在內部,如果把APP安裝在SD卡上,首先得設置你的level爲8,並且要配置android:installLocation這個參數的屬性爲preferExternal)

2.Application標籤
一個AndroidManifest.xml中必須含有一個Application標籤,這個標籤聲明瞭每一個應用程序的組件及其屬性(如icon,label,permission等)
<application  
             android:allowClearUserData=["true" | "false"]
             android:allowTaskReparenting=["true" | "false"]
             android:backupAgent="string"
             android:debuggable=["true" | "false"]
             android:description="string resource"
             android:enabled=["true" | "false"]
             android:hasCode=["true" | "false"]
             android:icon="drawable resource"
             android:killAfterRestore=["true" | "false"]
             android:label="string resource"
             android:manageSpaceActivity="string"
             android:name="string"
             android:permission="string"
             android:persistent=["true" | "false"]
             android:process="string"
             android:restoreAnyVersion=["true" | "false"]
             android:taskAffinity="string"
             android:theme="resource or theme" >
</application>

A、android:allowClearUserData('true' or 'false')
用戶是否能選擇自行清除數據,默認爲true,程序管理器包含一個選擇允許用戶清除數據。當爲true時,用戶可自己清理用戶數據,反之亦然
B、android:allowTaskReparenting('true' or 'false')
是否允許activity更換從屬的任務,比如從短信息任務切換到瀏覽器任務
C、android:backupAgent
這也是Android2.2中的一個新特性,設置該APP的備份,屬性值應該是一個完整的類名,如com.project.TestCase,此屬性並沒有默認值,並且類名必須得指定(就是個備份工具,將數據備份到雲端的操作)
D、android:debuggable
這個從字面上就可以看出是什麼作用的,當設置爲true時,表明該APP在手機上可以被調試。默認爲false,在false的情況下調試該APP,就會報以下錯誤:
Device XXX requires that applications explicitely declare themselves as debuggable in their manifest.
Application XXX does not have the attribute 'debuggable' set to TRUE in its manifest and cannot be debugged.
E、android:description/android:label
此兩個屬性都是爲許可提供的,均爲字符串資源,當用戶去看許可列表(android:label)或者某個許可的詳細信息(android:description)時,這些字符串資源就可以顯示給用戶。label應當儘量簡短,之需要告知用戶該許可是在保護什麼功能就行。而description可以用於具體描述獲取該許可的程序可以做哪些事情,實際上讓用戶可以知道如果他們同意程序獲取該權限的話,該程序可以做什麼。我們通常用兩句話來描述許可,第一句描述該許可,第二句警告用戶如果批准該權限會可能有什麼不好的事情發生
F、android:enabled
Android系統是否能夠實例化該應用程序的組件,如果爲true,每個組件的enabled屬性決定那個組件是否可以被 enabled。如果爲false,它覆蓋組件指定的值;所有組件都是disabled。
G、android:hasCode('true' or 'false')
表示此APP是否包含任何的代碼,默認爲true,若爲false,則系統在運行組件時,不會去嘗試加載任何的APP代碼
一個應用程序自身不會含有任何的代碼,除非內置組件類,比如Activity類,此類使用了AliasActivity類,當然這是個罕見的現象
(在Android2.3可以用標準C來開發應用程序,可在androidManifest.xml中將此屬性設置爲false,因爲這個APP本身已經不含有任何的JAVA代碼了)
H、android:icon
這個很簡單,就是聲明整個APP的圖標,圖片一般都放在drawable文件夾下
I、android:killAfterRestore
是否復位需要重啓
J、android:manageSpaceActivity
讓應用手動管理應用的數據目錄
K、android:name
爲應用程序所實現的Application子類的全名。當應用程序進程開始時,該類在所有應用程序組件之前被實例化。
若該類(比方androidMain類)是在聲明的package下,則可以直接聲明android:name="androidMain",但此類是在package下面的子包的話,就必須聲明爲全路徑或android:name="package名稱.子包名成.androidMain"
L、android:permission
設置許可名,這個屬性若在上定義的話,是一個給應用程序的所有組件設置許可的便捷方式,當然它是被各組件設置的許可名所覆蓋的
M、android:presistent
該應用程序是否應該在任何時候都保持運行狀態,默認爲false。因爲應用程序通常不應該設置本標識,持續模式僅僅應該設置給某些系統應用程序纔是有意義的。
N、android:process
應用程序運行的進程名,它的默認值爲元素裏設置的包名,當然每個組件都可以通過設置該屬性來覆蓋默認值。如果你想兩個應用程序共用一個進程的話,你可以設置他們的android:process相同,但前提條件是他們共享一個用戶ID及被賦予了相同證書的時候
O、android:restoreAnyVersion
同樣也是android2.2的一個新特性,用來表明應用是否準備嘗試恢復所有的備份,甚至該備份是比當前設備上更要新的版本,默認是false
P、android:taskAffinity
擁有相同的affinity的Activity理論上屬於相同的Task,應用程序默認的affinity的名字是元素中設定的package名
Q、android:theme
是一個資源的風格,它定義了一個默認的主題風格給所有的activity,當然也可以在自己的theme裏面去設置它,有點類似style。



3.activity 屬性

<activity android:allowTaskReparenting=["true" | "false"]
          android:alwaysRetainTaskState=["true" | "false"]
          android:clearTaskOnLaunch=["true" | "false"]
          android:configChanges=["mcc", "mnc", "locale",
                                 "touchscreen", "keyboard", "keyboardHidden",
                                 "navigation", "orientation", "screenLayout",
                                 "fontScale", "uiMode"]
          android:enabled=["true" | "false"]
          android:excludeFromRecents=["true" | "false"]
          android:exported=["true" | "false"]
          android:finishOnTaskLaunch=["true" | "false"]
          android:icon="drawable resource"
          android:label="string resource"
          android:launchMode=["multiple" | "singleTop" |
                              "singleTask" | "singleInstance"]
          android:multiprocess=["true" | "false"]
          android:name="string"
          android:noHistory=["true" | "false"]  
          android:permission="string"
          android:process="string"
          android:screenOrientation=["unspecified" | "user" | "behind" |
                                     "landscape" | "portrait" |
                                     "sensor" | "nosensor"]
          android:stateNotNeeded=["true" | "false"]
          android:taskAffinity="string"
          android:theme="resource or theme"
          android:windowSoftInputMode=["stateUnspecified",
                                       "stateUnchanged", "stateHidden",
                                       "stateAlwaysHidden", "stateVisible",
                                       "stateAlwaysVisible", "adjustUnspecified",
                                       "adjustResize", "adjustPan"] >   
</activity>

A、android:alwaysRetainTaskState
是否保留狀態不變, 比如切換回home, 再從新打開,activity處於最後的狀態。比如一個瀏覽器擁有很多狀態(當打開了多個TAB的時候),用戶並不希望丟失這些狀態時,此時可將此屬性設置爲true
B、android:clearTaskOnLaunch
比如 P 是 activity, Q 是被P 觸發的 activity, 然後返回Home, 重新啓動 P,是否顯示 Q
C、android:configChanges
當配置list發生修改時, 是否調用 onConfigurationChanged() 方法 比如 "locale|navigation|orientation". 這個我用過,主要用來看手機方向改變的. android手機在旋轉後,layout會重新佈局, 如何做到呢?正常情況下. 如果手機旋轉了.當前Activity後殺掉,然後根據方向重新加載這個Activity. 就會從onCreate開始重新加載.如果你設置了 這個選項, 當手機旋轉後,當前Activity之後調用onConfigurationChanged() 方法. 而不跑onCreate方法等.
D、android:excludeFromRecents
是否可被顯示在最近打開的activity列表裏,默認是false
E、android:finishOnTaskLaunch
當用戶重新啓動這個任務的時候,是否關閉已打開的activity,默認是false如果這個屬性和allowTaskReparenting都是true,這個屬性就是王牌。Activity的親和力將被忽略。該Activity已經被摧毀並非re-parented
F、android:launchMode(Activity加載模式)
在多Activity開發中,有可能是自己應用之間的Activity跳轉,或者夾帶其他應用的可複用Activity。可能會希望跳轉到原來某個Activity實例,而不是產生大量重複的Activity。這需要爲Activity配置特定的加載模式,而不是使用默認的加載模式
Activity有四種加載模式:
standard、singleTop、singleTask、singleInstance(其中前兩個是一組、後兩個是一組),默認爲standard
standard:就是intent將發送給新的實例,所以每次跳轉都會生成新的activity。
singleTop:也是發送新的實例,但不同standard的一點是,在請求的Activity正好位於棧頂時(配置成singleTop的Activity),不會構造新的實例
singleTask:和後面的singleInstance都只創建一個實例,當intent到來,需要創建設置爲singleTask的Activity的時候,系統會檢查棧裏面是否已經有該Activity的實例。如果有直接將intent發送給它。
singleInstance:首先說明一下task這個概念,Task可以認爲是一個棧,可放入多個Activity。比如啓動一個應用,那麼Android就創建了一個Task,然後啓動這個應用的入口Activity,那在它的界面上調用其他的Activity也只是在這個task裏面。那如果在多個task中共享一個Activity的話怎麼辦呢。舉個例來說,如果開啓一個導遊服務類的應用程序,裏面有個Activity是開啓GOOGLE地圖的,當按下home鍵退回到主菜單又啓動GOOGLE地圖的應用時,顯示的就是剛纔的地圖,實際上是同一個Activity,實際上這就引入了singleInstance。singleInstance模式就是將該Activity單獨放入一個棧中,這樣這個棧中只有這一個Activity,不同應用的intent都由這個Activity接收和展示,這樣就做到了共享。當然前提是這些應用都沒有被銷燬,所以剛纔是按下的HOME鍵,如果按下了返回鍵,則無效
G、android:multiprocess
是否允許多進程,默認是false
在實際開發中,CP有以下兩種用法:
1)和應用在一個APK包裏
這種情況下和應用在同一進程中。process name和uid都一樣。
2)單獨在一個APK包裏。
這種情況下,如果在AndroidManifest.xml文件裏聲明瞭和某個進程同屬一個進程,如:
package="com.android.providers.telephony"
android:sharedUserId="android.uid.phone">                
android:allowClearUserData="false"                 
android:label="Dialer Storage"                 
android:icon="@drawable/ic_launcher_phone">  
android:authorities="telephony" 
android:multiprocess="true" />
這個裏面通過android:sharedUserId="android.uid.phone"和android:process="com.android.phone"聲明瞭該CP是和phone進程同屬一個進程,擁有同樣的process name和uid.
如果沒有上述聲明,那麼該CP是在獨立的進程中,擁有屬於自己的process name和uid.
以上兩種用法可以總結爲:
1)CP和某個進程同屬一個進程
這種情況下,當該進程啓動時,會搜索屬於該進程的所有CP,並加載。
2)CP屬於獨立的一個進程。
這種情況下,只有需要用到該CP時,纔會去加載。
那麼,當一個進程想要操作一個CP時,先需要獲取該CP的對象,系統是如何處理呢:
1)如果該CP屬於當前主叫進程,因爲在進程啓動時就已經加載過了,所以系統會直接返回該CP的對象。
2)如果該CP不屬於當前主叫進程,那麼系統會進行相關處理(由ActivityManagerService進行,以下簡稱爲AMS):
所有已加載的CP信息都已保存在AMS中。當需要獲取某個CP的對象時,AMS會先判斷該CP是否已被加載
----如果已被加載,該CP和當前主叫進程不屬一個進程,但是該CP設置了multiprocess的屬性(如上例中的android:multiprocess="true"),並且該CP屬於系統級CP,那麼就在當前主叫進程內部新生成該CP的對象。否則就需要通過IPC機制進行調用。
----如果還未被加載,該CP和當前主叫進程不屬一個進程,但是該CP設置了multiprocess的屬性(如上例中的android:multiprocess="true"),並且該CP屬於系統級CP,那麼就在當前主叫進程內部新生成該CP的對象。否則就需要先創建該CP所在的進程,然後再通過IPC機制進行調用。
H、android:noHistory
當用戶從Activity上離開並且它在屏幕上不再可見時,Activity是否從Activity stack中清除並結束。默認是false。Activity不會留下歷史痕跡
I、android:screenOrientation
activity顯示的模式
默認爲unspecified:由系統自動判斷顯示方向
landscape橫屏模式,寬度比高度大
portrait豎屏模式, 高度比寬度大
user模式,用戶當前首選的方向
behind模式:和該Activity下面的那個Activity的方向一致(在Activity堆棧中的)
sensor模式:有物理的感應器來決定。如果用戶旋轉設備這屏幕會橫豎屏切換
nosensor模式:忽略物理感應器,這樣就不會隨着用戶旋轉設備而更改了
J、android:stateNotNeeded
activity被銷燬或者成功重啓時是否保存狀態
K、android:windowSoftInputMode
activity主窗口與軟鍵盤的交互模式,可以用來避免輸入法面板遮擋問題,Android1.5後的一個新特性。
這個屬性能影響兩件事情:
【A】當有焦點產生時,軟鍵盤是隱藏還是顯示
【B】是否減少活動主窗口大小以便騰出空間放軟鍵盤
各值的含義:
【A】stateUnspecified:軟鍵盤的狀態並沒有指定,系統將選擇一個合適的狀態或依賴於主題的設置
【B】stateUnchanged:當這個activity出現時,軟鍵盤將一直保持在上一個activity裏的狀態,無論是隱藏還是顯示
【C】stateHidden:用戶選擇activity時,軟鍵盤總是被隱藏
【D】stateAlwaysHidden:當該Activity主窗口獲取焦點時,軟鍵盤也總是被隱藏的
【E】stateVisible:軟鍵盤通常是可見的
【F】stateAlwaysVisible:用戶選擇activity時,軟鍵盤總是顯示的狀態
【G】adjustUnspecified:默認設置,通常由系統自行決定是隱藏還是顯示
【H】adjustResize:該Activity總是調整屏幕的大小以便留出軟鍵盤的空間
【I】adjustPan:當前窗口的內容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能總是看到輸入內容的部分

4.intent-filter 屬性
<intent-filter  android:icon="drawable resource"
               android:label="string resource"
               android:priority="integer" >
      <action />
      <category />
      <data />
</intent-filter>

A、intent-filter屬性
android:priority(解釋:有序廣播主要是按照聲明的優先級別,如A的級別高於B,那麼,廣播先傳給A,再傳給B。優先級別就是用設置priority屬性來確定,範圍是從-1000~1000,數越大優先級別越高)Intent filter內會設定的資料包括action,data與category三種。也就是說filter只會與intent裏的這三種資料作對比動作
B、action屬性
action很簡單,只有android:name這個屬性。常見的android:name值爲android.intent.action.MAIN,表明此activity是作爲應用程序的入口。
C、category屬性
category也只有android:name屬性。常見的android:name值android.intent.category.LAUNCHER(決定應用程序是否顯示在程序列表裏)

D、data屬性
<data  android:host="string"
      android:mimeType="string"
      android:path="string"
      android:pathPattern="string"
      android:pathPrefix="string"
      android:port="string"
      android:scheme="string"/>


```【1】每個<data>元素指定一個URI和數據類型(MIME類型)。
它有四個屬性scheme、host、port、path對應於URI的每個部分: 
scheme://host:port/path
scheme的值一般爲"http",host爲包名,port爲端口號,path爲具體地址。如:http://com.test.project:200/folder/etc
其中host和port合起來構成URI的憑據(authority),如果host沒有指定,則port也會被忽略
要讓authority有意義,scheme也必須要指定。要讓path有意義,scheme+authority也必須要指定
【2】mimeType(指定數據類型),若mimeType爲'Image',則會從content Provider的指定地址中獲取image類型的數據。還有'video'啥的,若設置爲video/mp4,則表示在指定地址中獲取mp4格式的video文件
【3】而pathPattern和PathPrefix主要是爲了格式化path所使用的

5.service 
【1】service與activity同級,與activity不同的是,它不能自己啓動的,運行在後臺的程序,如果我們退出應用時,Service進程並沒有結束,它仍然在後臺運行。比如聽音樂,網絡下載數據等,都是由service運行的
【2】service生命週期:Service只繼承了onCreate(),onStart(),onDestroy()三個方法,第一次啓動Service時,先後調用了onCreate(),onStart()這兩個方法,當停止Service時,則執行onDestroy()方法,如果Service已經啓動了,當我們再次啓動Service時,不會在執行onCreate()方法,而是直接執行onStart()方法
【3】service與activity間的通信
Service後端的數據最終還是要呈現在前端Activity之上的,因爲啓動Service時,系統會重新開啓一個新的進程,這就涉及到不同進程間通信的問題了(AIDL),Activity與service間的通信主要用IBinder負責。
【4】
<service android:enabled=["true" | "false"]
         android:exported[="true" | "false"]
         android:icon="drawable resource"
         android:label="string resource"
         android:name="string"
         android:permission="string"
         android:process="string">
</service>

6.receiver
receiver的屬性與service一樣,這裏就不顯示了
BroadcastReceiver:用於發送廣播,broadcast是在應用程序之間傳輸信息的一種機制,而BroadcastReceiver是對發送出來的 Broadcast進行過濾接受並響應的一類組件Android BroadcastReceiver 簡介
在 Android 中使用 Activity, Service, Broadcast, BroadcastReceiver
活動(Activity) - 用於表現功能

服務(Service) - 相當於後臺運行的 Activity
廣播(Broadcast) - 用於發送廣播

廣播接收器(BroadcastReceiver) - 用於接收廣播
Intent - 用於連接以上各個組件,並在其間傳遞消息
BroadcastReceiver
在Android中,Broadcast是一種廣泛運用的在應用程序之間傳輸信息的機制。而BroadcastReceiver是對發送出來的 Broadcast進行過濾接受並響應的一類組件。下面將詳細的闡述如何發送Broadcast和使用BroadcastReceiver過 濾接收的過程:
首先在需要發送信息的地方,把要發送的信息和用於過濾的信息(如Action、Category)裝入一個Intent對象,然後通過調用 Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent對象以廣播方式發送出去。
當Intent發送以後,所有已經註冊的BroadcastReceiver會檢查註冊時的IntentFilter是否與發送的Intent相匹配,若 匹配則就會調用BroadcastReceiver的onReceive()方法。所以當我們定義一個BroadcastReceiver的時候,都需要 實現onReceive()方法。

註冊BroadcastReceiver有兩種方式:
一種方式是,靜態的在AndroidManifest.xml中用標籤生命註冊,並在標籤內用標籤設置過濾器。
另一種方式是,動態的在代碼中先定義並設置好一個 IntentFilter對象,然後在需要註冊的地方調 Context.registerReceiver()方法,如果取消時就調用Context.unregisterReceiver()方法。如果用動 態方式註冊的BroadcastReceiver的Context對象被銷燬時,BroadcastReceiver也就自動取消註冊了。
另外,若在使用sendBroadcast()的方法是指定了接收權限,則只有在AndroidManifest.xml中用標籤聲明瞭擁有此權限的BroascastReceiver纔會有可能接收到發送來的Broadcast。
同樣,若在註冊BroadcastReceiver時指定了可接收的Broadcast的權限,則只有在包內的AndroidManifest.xml中 用標籤聲明瞭,擁有此權限的Context對象所發送的Broadcast才能被這個 BroadcastReceiver所接收。
動態註冊:
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(String);--爲 BroadcastReceiver指定action,使之用於接收同action的廣播 registerReceiver(BroadcastReceiver,intentFilter);
一般:在onStart中註冊,onStop中取消unregisterReceiver
發送廣播消息:extends Service
指定廣播目標Action:Intent Intent = new Intent(action-String)
--指定了此action的receiver會接收此廣播
需傳遞參數(可選) putExtra();
發送:sendBroadcast(Intent);


7.provider
<provider android:authorities="list"
          android:enabled=["true" | "false"]
          android:exported=["true" | "false"]
          android:grantUriPermissions=["true" | "false"]
          android:icon="drawable resource"
          android:initOrder="integer"
          android:label="string resource"
          android:multiprocess=["true" | "false"]
          android:name="string"
          android:permission="string"
          android:process="string"
          android:readPermission="string"
          android:syncable=["true" | "false"]
          android:writePermission="string">
           <grant-uri-permission/>
           <meta-data/>
</provider>


```contentProvider(數據存儲)
【1】android:authorities:
標識這個ContentProvider,調用者可以根據這個標識來找到它
【2】android:grantUriPermission:
對某個URI授予的權限
【3】android:initOrder

8.uses-sdk
<uses-sdk android:minSdkVersion="integer"
          android:targetSdkVersion="integer"
          android:maxSdkVersion="integer"/>
描述應用所需的api level,就是版本,目前是android 2.2 = 8,android2.1 = 7,android1.6 = 4,android1.5=3在此屬性中可以指定支持的最小版本,目標版本以及最大版本

9.permission

最常用的當屬permission,當我們需要獲取某個權限的時候就必須在我們的manifest文件中聲明,此與同級,具體權限列表請看此處
通常情況下我們不需要爲自己的應用程序聲明某個權限,除非你提供了供其他應用程序調用的代碼或者數據。這個時候你才需要使用 這個標籤。很顯然這個標籤可以讓我們聲明自己的權限。比如:

<permission android:name="com.teleca.project.MY_SECURITY" . . . />
那麼在activity中就可以聲明該自定義權限了,如:

<application . . .>
        <activity android:name="XXX" . . . >
                  android:permission="com.teleca.project.MY_SECURITY"> </activity>
 </application>
當然自己聲明的permission也不能隨意的使用,還是需要使用來聲明你需要該權限
就是聲明一個標籤,該標籤代表了一組permissions,而是爲一組permissions聲明瞭一個namespace。這兩個標籤可以看之前的系列文章。
 Android uses-permission 權限大全 
http://blog.chinaunix.net/uid-9185047-id-3460348.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章