Dev Guide/Android Basics/Application Fundamentals

來源:互聯網
上載者:User

原文地址:http://developer.android.com/guide/topics/fundamentals.html
注意:翻譯不全,有選擇的閱讀。

應用基礎

Android是用Java語言寫的,所有的Java代碼和相關的資源檔被AAPT Tool 的工具打成一個Android包,尾碼為apk的可運行包。這種檔案專門用來發布 和安裝應用程式到行動裝置的。一個APK包裡所有的代碼都被看做一個程式。
在很多方面,每一個Android應用程式都在自己的世界(虛擬機器)裡單獨存活。
@ 預設情況下,每個應用程式都在自己的Linux進程裡。應用程式的任何一段代碼需要執行時,Android都會啟動這個進程,並且在處理完後要處理其他程 序時關閉這個進程。
@ 每個繼承擁有自己的虛擬機器,所以程式間的運行是互相隔離的。
@ 預設情況下,每個應用程式都會分到一個特殊的Linux使用者ID,並被設定許可權,只對應用程式自己可見和使用,當然可以對其他程式開放。
可以安排兩個程式共用一個UserID,這樣他們可以互相看到對方的檔案,共用系統資源,並且在同一個Linux線程裡運行,共用虛擬機器。
組件
Android的一個核心特點就是一個應用程式可以由其他應用程式的組件來組成(在其他程式允許的前提下)。例如:如果你的程式需要顯示一個圖片列表並且另一個程式已經開發了合適的捲軸且允許其 他應用程式添加,那麼你可以在他的捲軸基礎上開發,比自己開發要方便的多。你的程式不需要合并他的代碼只需要一個串連即可。相比之下,當我需要某個程式然後可以啟動他時是最簡單的。
想要這樣的話,當這個程式的某一部分被別人用到時,系統必須能都啟動一個應用程式的進程,並且執行個體化這些相關的Java對象,因此,與其他系統的應用程式不同的是,android程式沒有一個單一的入 口程式(例如main方法),相比下,android有四種基本的組件可以被系統執行個體化、啟動。包括:Activities、Services、Broadcast receivers、Content providers。
Activities
Activity提供了一個可視化的使用者介面,例如:一個activity可以提供一個列表,供使用者選擇,或者在拍照時顯示照片列表。一個簡訊程式有一個activity顯示連絡人清單,另一個activity可以寫簡訊 並且選擇連絡人發送,別的activity可以查看以往的簡訊內容並且更改設定。這幾個activity共同在一個使用者介面裡發揮著作用,他們之間互相依賴,每一個都是繼承自activity基類的子類。
一個應用程式可以包含一個或者多個activity,例如剛提到的簡訊程式。需要多少就可以包含多少。通常,被標記的第一個activity先運行。當前activity啟動完就啟動下一個。
每個activity都被分配一個預設的視窗來繪製。通常是全屏,也可以比螢幕小或者浮在其他視窗上。一個activity可以利用額外的視窗,例如:在activity裡探出一個讓使用者想用的彈出對話方塊,或者顯 示一個給使用者顯示重要訊息供使用者選擇的特殊選項。
視窗的可視內容由層式結構的view來顯示,他們繼承自view基類。每個view控制一個特定矩形空間內的視窗。父view控制並且組織子view 的顯示。子view(上層的view)被繪製在矩形裡響應使用者的操作 ,從而與使用者互動資訊。例如可以顯示一副小圖片使用者點擊圖片時響應一個事件。Android有很多現成的view可以被直接使用,包括按鈕、文字框、捲軸、菜單、選擇框等等。
通過Activity.setContentView()可以改變activity的顯示,content view 是根視圖。
Services
servers沒有使用者接介面,但它確實在後台不週期性運行著。例如:但使用者處理其他事情時,一個service可以背景播放音樂、後台讀取網路資料或者處理其他的東西並且提供給其他的activity,每一個 servers都繼承自Service基類。
一個最好的例子就是媒體播放器。播放器大概需要一個或多個activity來允許使用者選擇歌曲並且播放。然而,播放器不必是當前活動的activity,使用者可能在播放時做別的事情。播放器需要啟動一個後 台來持續播放音樂。系統會一直播放這個播放器service甚至當他隱藏時。
我們可以連結到一個正在啟動並執行service,或者啟動一個沒有啟動並執行service,當串連成功時,你可以和service的進程通訊。例如播放器,使用者可以控制他的開始暫停重放等功能。
像activity和其他的組件一樣,services運行在主線程。所以不會阻塞其他的組件或者使用者介面。他們往往啟動一個新的任務。可參考Process and Threads。
Broadcast receivers
Broadcast receiver這個組件只是接受receive和響應Broadcast廣播通知。很多廣播來源系統代碼,例如通知時區已經改變、低電量、圖片被選中、使用者改變了語言設定,此時使用者開始廣播,例如,同 事其他應用程式網路資料已經下載ok可以使用了。
一個Broadcast receiver 可以響應多個廣播,所有的Broadcast receiver 都繼承自BroadcastReceiver基類。
Broadcast receivers 沒有使用者介面。然而,他們可以在接收到訊息啟動一個activity,或者使用notificationManager 去提醒使用者。Notifications 可以通過一些方式引起使用者注意:閃動背光、 震動、發聲等等。通常在狀態列顯示一個提示表徵圖讓使用者可以查看。
Content providers 內容提供
Content providers為其他程式提供資料集,這些資料可以儲存在系統檔案裡或者sqlite資料庫裡,Content providers繼承自 ContentProvider基類,實現了一些標準的方法,可以 讓程式檢索或者改寫其中的資料。程式不能直接的調用那些方法。ContentResolver不能與content provider直接通訊,但可以用過ContentResolver 。ContentResolver 可以跟任何的content provider通訊,可以與provider合作管理通 信進程。
更多資訊查看Content Providers文檔。
當有需要特定的請求需要被處理時,Android都會確保他正在運行,需要時會建立一個執行個體。
啟用組件: intents
當ContentResolver接收到一個請求時,運行content providers。其他三個組件activities、services、broadcast receiver被Intents非同步訊息啟動。intent 裡包含著所傳遞訊息的內容。對於activity和services來說,intents定義了請求,指定了目標資料的URI。例如,可以讓發送一個請求讓使用者接受或者輸入一些文本資訊。對broadcast receivers來說,intents定義了一些聲明的事件(?),例如:他可以在相機的按鈕被按下時發出一些資訊。
下面是每個組件類型對應的啟動方法
@ Context.startActivity() 和 Activity.startActivityForResult()方法可以啟動一個activity。activity可以查看啟動他的的intent,通過調用getIntent()方法。Android 系統調用onNewIntent()方法來傳遞intents。
一個activity經常會啟動下一個activity。使用startActivityForResult() 代替 startActivity()方法可以從啟動的activity擷取一些傳回值。例如,可以啟動一個activity讓使用者選擇一張圖片並且返回所選的圖片,被傳遞迴來的資料被送到前一個activity的onActivityResult()方法裡。
@ Context.startService()可已啟動一個service。Android通過service的onStart()方法傳遞intent對象。類似的,intent可以傳遞至Context.bindService()來擷取一個正在啟動並執行服務的控制代碼,這個服務可通過onBind()方法擷取這個intent對象(如果服務沒有啟動可以通過bindService()來啟動服務)。例如,一個activity可以很容易的建立一個到音樂播放服務的串連,他可以提供給使用者一些控制音樂播放器的借口。activity可以調用bindService()方法來建立串連,然後調用已經定義的關於播放器的一些方法。
@ 應用程式可以通過傳遞intent來初始化一個Broadcast廣播,相關方法:Context.sendBroadcast()、Context.sendOrderedBroadcast()、Context.sendStickyBroadcast() ,activity會調用所有對此廣播關注的廣播接收器,然後將intent傳遞給這些方法。
關閉組件
只有當內容供應商從內容接收者接收到一個請求時才會啟動。廣播訊息接受者只有當接收到一個廣播訊息時才會被啟動。所以他們不需要手動關閉。
activity則另當別論,他們提供給使用者介面,他們和使用者保持長時間的對話並且保持活躍狀態,甚至空閑時,仍然保持聯絡。類似的,services也會運行很長一段時間。所以Android提供關閉activity和services的一些方法:
@ finish()會關閉activity,那些被startActivityForResult()方法啟動的activity可以通過finishActivity()關閉。
@ services 可以通過 stopSelf()和Context.stopService() 方法被關閉。
當系統不再使用他們或者沒有足夠記憶體世,系統可以自行關閉一些組件,後面的章節會討論這種情況。
manifest 檔案
在Android啟動一個應用組件前,必須讓activity知道那些組件的存在,所以應用程式必須在manifest檔案裡聲明自己的組件,並把manifest檔案打包到Android 包裡。apk檔案包含程式的代碼、檔案和資源。
manifest是一個結構化的xml檔案,被命名為AndroidManifest.xml,裡面聲明了應用的組件、一些除了系統預設庫的使用者自訂庫和程式希望被授予的一些許可權。
manifest主要任務是告訴Android應用程式的組件。例如,activity可以這樣聲明:
view plaincopy to clipboardprint?
<?xml version="1.0" encoding="utf-8"?>  
<manifest . . . >  
    <application . . . >  
        <activity android:name="com.example.project.FreneticActivity"  
                  android:icon="@drawable/small_pic.png"  
                  android:label="@string/freneticLabel"   
                  . . .  >  
        </activity>  
        . . .  
    </application>  
</manifest>
複製代碼
<activity>元素的name屬性是繼承自activity基類的activity的類名,icon和label指向了資源檔。別的組件聲明起來就簡單的多了。服務的標籤:<service>,廣播接受者標籤:<receiver>,內容供應商標籤:<provider>。activity、services和內容供應商不在這裡聲明的話是不能啟動並執行。然而,廣播可以在manifest檔案裡聲明或者動態在代碼裡建立並且調用Context.registerReceiver()方法聲明。Intent filtersIntent對象可以顯示的定義一個目標組件。那樣的話,Android就可以找到並運行它。如果目標組件沒有明確的定義出來,Android會相應最佳的組件來響應這個Intent,這是通過比較<intent
filters>標籤裡的所有組件來選擇相應的。intent filters (Intent過濾器)告訴Android所有可以處理的組件。和組件的其他重要訊息一樣,在manifest檔案裡聲明。下面是一個添加了兩個Intents過濾器的例子:
view plaincopy to clipboardprint?
<?xml version="1.0" encoding="utf-8"?>  
<manifest . . . >  
    <application . . . >  
        <activity android:name="com.example.project.FreneticActivity"  
                  android:icon="@drawable/small_pic.png"  
                  android:label="@string/freneticLabel"   
                  . . .  >  
            <intent-filter . . . >  
                <action android:name="android.intent.action.MAIN" />  
                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
            <intent-filter . . . >  
                <action android:name="com.example.project.BOUNCE" />  
                <data android:mimeType="image/jpeg" />  
                <category android:name="android.intent.category.DEFAULT" />  
            </intent-filter>  
        </activity>  
        . . .  
    </application>  
</manifest>
複製代碼
例子中的第一個過濾器是常見的。他標記了所有顯示給使用者讓使用者選擇啟動的組件。換句話說就是程式的進入點。是使用者啟動程式後最先見到的。第二個過濾器聲明了可以提供(perform)的特殊資料類型。(對否?呵呵)一個組件可以有數個Intent過濾器。每一個都可以聲明不同的許可權。如果沒有添加過濾器的話,只能使用Intent方式被啟動。對於廣播接受者來說,如果在代碼中被建立和註冊,那麼直接被執行個體化成一個IntentFilters對象,其他的過濾器都在manifest檔案裡被聲明。

相關文章

聯繫我們

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