編輯:關於Android編程
安裝成功,這個Android程序就擁有了自己獨立的運行沙盒(沙盒是在受限的安全環境中運行應用程序的一種做法,這種做法是要限制授予應用程序的代碼訪問權限。)
Android操作系統是一個多用戶的Linux系統,其中的每一個應用程序都是一個獨立的用戶。
默認地,系統會為每一個應用程序分配一個唯一的Linux用戶ID(這個ID只能被系統使用,並且對於應用程序來說,這個ID是未知的)。系統為一個應用程序的所有文件 設置了權限,所以,只有分配給這個應用程序的用戶ID可以訪問它們。
每一個進程有它主機的虛擬機 (VM), 所以一個應用程序的代碼會獨立與其它的應用程序運行。
默認地,每一個應用程序在它自己的Linux進程中運行。Android會在一個應用程序的任何一個組件需要被調用的時候啟動這個進程。然後,當沒有任何組件被調用或者系統需要為其它應用程序回收內存的時候,就會 關閉這個進程。
通過這種方式,Android 系統實現了 最少特權原則。就是說,每一個應用程序,默認地,都只能調用它所需要的工作組件。 這就創造了這樣一種非常安全的環境,在這個環境中,一個應用程序不能訪問沒有被授予其權限的系統部分。
盡管如此,也有很多途徑可以讓一個應用程序和其它的應用程序共享數據,也可以讓一個應用程序去調用系統服務:
為兩個應用程序分配同一個Linux用戶ID是可行的,這樣它們就能訪問對方的文件。為了節約系統資源,擁有相同用戶ID的應用程序也可以被運行於相同的Linux進程 並且共享VM(它們必須用相同的證書簽名)。
應用程序可以通過請求權限來訪問設備數據,例如聯系人,SMS信息,可插拔存儲(SD卡),相機,藍牙,等等。所有的應用程序權限必須在安裝的時候由用戶授予。
Android系統設計的一個獨特方面是,任何程序都可以啟動其它程序的組件。 例如,如果你想讓用戶使用設備相機捕捉一個相片,有另外一個程序做這件事,那麼你的程序將可以調用它, 而不是你自己開發一個拍照的activity。你不必從相機程序中嵌入代碼或者連鏈接代碼也不需要。取而代之地,你可以簡單地啟動相機程序中拍照的activity。 當拍照完成,相片就會返回給你的程序供你使用。從用戶的角度,就好像相機就是你程序的一部分。
當系統啟動一個組件,它其實就啟動了這個程序的進程(如果這個進程還未被啟動的話)並實例化這個組件所需要的類。 例如,如果你的程序啟動了相機程序裡的activity去拍照,這個activity實際上是運行在相機程序的進程裡,而不是你自己的進程。 因此,不像其它系統裡的程序,Android程序並不是單入口的(例如它沒有main方法)。
由於系統把程序運行在一個個獨立的進程中,並使用文件權限來限制對其它程序的訪問,所以你的程序不能從其它程序中直接激活組件。 盡管如此,Android系統可以做到!激活一個其它程序的組件,你必須向系統發送一個信息,這個信息需要指定你的intent 來啟動一個指定的組件。 然後系統就會為你激活這個組件。
四分之三的組件類型—activitie, service, 和 broadcast receiver—是被一個叫做 intent的異步消息激活的。 Intent把不同的獨立的組件在運行期綁定在一起(你可以把它們當作從其它組件中請求動作的消息), 無論這些組件屬於你的或者其它的程序。
一個intent使用一個Intent 對象來創建, 它用於激活一個指定的或者指定類型的組件。— 一個intent可以分別是顯示的或者隱式的。
對於activity和service來說,一個intent定義了將要執行的動作。(例如, 查看或發送什麼)並且可以指定動作執行需要的數據URL(啟動組件所需要知道的其它數據)。 例如,一個intent可能發送一個請求,讓一個activity去顯示一張圖片或打開一個網頁。 某些情況下,你可以啟動一個activity來接收一個結果,此時,這個activity也通過一個Intent 來返回結果。 (例如, 你可以發送一個intent讓用戶獲取一個個人聯系人,並讓這個結果返回給你—返回的intent就包含了一個指向你選擇的聯系人的URI)。
對broadcast receiver來說, intent只是簡單地定義了需要廣播的公告(例如,一個指明設備電池電量低的廣播就只包含了一個已知的動作字符串:“電量低”)。
另外一個組件類型, content provider, 不是用intent來激活。 相對地,它是由一個 ContentResolver 發起的一個指向它的請求激活的。 這個content resolver掌握了所有content provider的直接事務,所以用這個provider來執行事務的組件不需要直接執行而是調用這個 ContentResolver 對象的方法。 它在content provider和這個組件請求信息之間放置了一個抽象層(為了安全)。
激活各種類型組件有不同的方法:
你可以啟動一個activity(或者讓讓它來做一些新的工作)通過傳遞一個Intent給startActivity() 或者 startActivityForResult() (當你想讓一個activity為你返回一個結果)。 你可以啟動一個service(或者給一個正在運行的service發送新的指令)通過傳遞一個 Intent 給 startService()。 或者你可以綁定一個服務通過傳遞一個Intent 給 bindService()。 你可以初始化一個broadcast通過傳遞一個Intent給一些方法像 sendBroadcast(), sendOrderedBroadcast(), 或者 sendStickyBroadcast()。 你可以讓content provider執行一個查詢操作通過調用 ContentResolver的query() 方法。在Android系統能夠啟動一個程序組件之前, 系統必須通過讀取程序的AndroidManifest.xml 文件 (“配置”文件)來知道這個組件是否存在。 你的程序必須在這個文件中聲明它所有的組件。這文件必須放在程序項目的根目錄中。
除了聲明程序組件外,這個配置文件還做一些其它的工作,例如:
確定程序需要哪些用戶權限,例如網絡訪問或者讀取用戶的聯系人。 聲明程序需要的最小的 API Level 這個要參照程序都使用了哪些API。 聲明程序使用或要求的硬件和軟件特性,例如相機,藍牙服務,或者多點觸屏。 程序需要鏈接的API類庫(除Android framework API之外的類庫),例如 Google Map類庫。 其它配置文件的主要任務是通知系統,該應用程序都使用了哪些組件。 例如,一個配置文件可以這樣聲明一個activity:
...
在 元素中, android:icon 屬性指定了應用程序的圖標資源。
在 元素中, android:name 屬性指定了 Activity 子類的完整正確類名, 而 android:label 屬性 指定了一個用於顯示activity的用戶可見標簽的字符串。
你必須像這樣聲明所有的組件:
activity的元素service的元素 broadcast receiver的元素 content provider的元素
你包含在你程序中但並沒有在配置文件中聲明的Activitie, service, 和 content provider 是不被系統識別的,因此,也無法運行。但是, broadcast receiver既可以在配置文件中聲明,也可以在代碼中被動態創建(作為 BroadcastReceiver 對象) 並且通過調用 registerReceiver() 注冊於系統中。
如前文 激活組件的討論中所說, 你可以使用一個Intent 來啟動一個activitie, service, 和 broadcast receiver。你可以明確地(使用組件的類名)在intent中聲明一個目標組件。 但是, intent最牛逼的地方其實是它的動作(action)概念, 使用action,你可以簡單地描述以下你想執行的動作(並且你也可以指定你想把哪些數據放在這個動作上) 並且允許系統去尋找設備上可以執行這個動作的組件並啟動它。如果有多個組件可以執行這個動作,那麼由用戶來決定哪個去執行。
系統識別能夠響應intent的組件的方法是比較收到的intent和設備的其它程序的配置文件中的intent filters
你在程序的配置文件中聲明組件的時候,你就可以選擇性地包含intent過濾器來聲明組件的功能,這樣它就能響應由其它程序發起的intent。 你可以通過添加一個 作為你組件的子元素 來為你的組件聲明一個intent過濾器。
例如,一個包含編輯新郵件頁面的郵件程序可能要在配置文件中聲明一個intent過濾器,以此作為入口來響應“發送”intent(為了發送郵件)。 你程序中的一個Activity就要創建一個包含”發送”動作(ACTION_SEND) 的intent,這樣系統在你通過startActivity() 調用了這個intent時就去比較郵件程序的“發送”頁面然後啟動它。
最近公司的產品在陸續做升級,上級領導給的任務是優化代碼結構以及項目架構,力爭把項目寫的精巧簡練,於是我們滿工程找冗余...我們都知道每一個項目基本上都是有登陸頁的,在登陸
(一)前言今天我們一起來看一下進度加載條ProgressBarAndroid控件的講解與基本使用。剛創建的React Native技術交流群(282693535),歡迎各
了解二維碼這個東西還是從微信中,當時微信推出二維碼掃描功能,自己感覺挺新穎的,從一張圖片中掃一下竟然能直接加好友,不可思議啊,那時候還不了解二維碼,呵呵,然後
仿微信通訊錄右側快速定位字母表控件先看效果圖: 界面比較單調,湊合看,主要看功能。這種控件在很多應用的通訊錄的界面,MIUI裡面的通訊錄都有這個功能,其實這是一