1. 程式人生 > >老羅的Android之旅——Android應用程式的Activity啟動過程簡要介紹和學習計劃

老羅的Android之旅——Android應用程式的Activity啟動過程簡要介紹和學習計劃

在Android系統中,Activity和Service是應用程式的核心元件,它們以鬆藕合的方式組合在一起構成了一個完整的應用程式,這得益於應用程式框架層提供了一套完整的機制來協助應用程式啟動這些Activity和Service,以及提供Binder機制幫助它們相互間進行通訊。在前面的文章和中,我們已經系統地介紹了Binder機制和Service的啟動過程了,在本文中,簡要介紹Activity的啟動過程以及後續學習計劃。

        在Android系統中,有兩種操作會引發Activity的啟動,一種使用者點選應用程式圖示時,Launcher會為我們啟動應用程式的主Activity;應用程式的預設Activity啟動起來後,它又可以在內部通過呼叫startActvity介面啟動新的Activity,依此類推,每一個Activity都可以在內部啟動新的Activity。通過這種連鎖反應,按需啟動Activity,從而完成應用程式的功能。

        這裡,我們通過一個具體的例子來說明如何啟動Android應用程式的Activity。Activity的啟動方式有兩種,一種是顯式的,一種是隱式的,隱式啟動可以使得Activity之間的藕合性更加鬆散,因此,這裡只關注隱式啟動Activity的方法。

        首先在Android原始碼工程的packages/experimental目錄下建立一個應用程式工程目錄Activity。關於如何獲得Android原始碼工程,請參考在Ubuntu上下載、編譯和安裝Android最新原始碼一文;關於如何在Android原始碼工程中建立應用程式工程,請參考在Ubuntu上為Android系統內建Java應用程式測試Application Frameworks層的硬體服務

一文。這裡,工程名稱就是Activity了,它定義了一個路徑為shy.luo.activity的package,這個例子的原始碼主要就是實現在這裡了。下面,將會逐一介紹這個package裡面的檔案。

       應用程式的預設Activity定義在src/shy/luo/activity/MainActivity.java檔案中:

  1. package shy.luo.activity;  
  2. import shy.luo.activity.R;  
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import
     android.os.Bundle;  
  6. import android.util.Log;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.Button;  
  10. publicclass MainActivity extends Activity  implements OnClickListener {  
  11.     privatefinalstatic String LOG_TAG = "shy.luo.activity.MainActivity";  
  12.     private Button startButton = null;  
  13.     @Override
  14.     publicvoid onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.main);  
  17.         startButton = (Button)findViewById(R.id.button_start);  
  18.         startButton.setOnClickListener(this);  
  19.         Log.i(LOG_TAG, "Main Activity Created.");  
  20.     }  
  21.     @Override
  22.     publicvoid onClick(View v) {  
  23.         if(v.equals(startButton)) {  
  24.             Intent intent = new Intent("shy.luo.activity.subactivity");  
  25.             startActivity(intent);  
  26.         }  
  27.     }  
  28. }  
        它的實現很簡單,當點選它上面的一個按鈕的時候,就會啟動另外一個名字為“shy.luo.activity.subactivity”的Actvity。

        名字為“shy.luo.activity.subactivity”的Actvity實現在src/shy/luo/activity/SubActivity.java檔案中:

  1. package shy.luo.activity;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import android.util.Log;  
  5. import android.view.View;  
  6. import android.view.View.OnClickListener;  
  7. import android.widget.Button;  
  8. publicclass SubActivity extends Activity implements OnClickListener {  
  9.     privatefinalstatic String LOG_TAG = "shy.luo.activity.SubActivity";  
  10.     private Button finishButton = null;  
  11.     @Override
  12.     publicvoid onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.         setContentView(R.layout.sub);  
  15.         finishButton = (Button)findViewById(R.id.button_finish);  
  16.         finishButton.setOnClickListener(this);  
  17.         Log.i(LOG_TAG, "Sub Activity Created.");  
  18.     }  
  19.     @Override
  20.     publicvoid onClick(View v) {  
  21.         if(v.equals(finishButton)) {  
  22.             finish();  
  23.         }  
  24.     }  
  25. }  
        它的實現也很簡單,當點選上面的一個銨鈕的時候,就結束自己,回到前面一個Activity中去。

        這裡我們可以看到,Android應用程式架構中非常核心的一點:MainActivity不需要知道SubActivity的存在,即它不直接擁有SubActivity的介面,但是它可以通過一個字串來告訴應用程式框架層,它要啟動的Activity的名稱是什麼,其它的事情就交給應用程式框架層來做,當然,應用程式框架層會根據這個字串來找到其對應的Activity,然後把它啟動起來。這樣,就使得Android應用程式中的Activity藕合性很鬆散,從而使得Android應用程式的模組性程度很高,並且有利於以後程式的維護和更新,對於大型的客戶端軟體來說,這一點是非常重要的。

        當然,應用程式框架能夠根據名字來找到相應的Activity,是需要應用程式本身來配合的,這就是要通過應用程式的配置檔案AndroidManifest.xml來實現了:

  1. <?xmlversion="1.0"

    相關推薦

    Android——Android應用程式Activity啟動過程簡要介紹學習計劃

    在Android系統中,Activity和Service是應用程式的核心元件,它們以鬆藕合的方式組合在一起構成了一個完整的應用程式,這得益於應用程式框架層提供了一套完整的機制來協助應用程式啟動這些Activity和Service,以及提供Binder機制幫助它們相

    Android應用程式Activity啟動過程簡要介紹學習計劃

            在Android系統中,Activity和Service是應用程式的核心元件,它們以鬆藕合的方式組合在一起構成了一個完整的應用程式,這得益於應用程式框架層提供了一套完整的機制來協助應用程式啟動這些Activity和Service,以及提供Binder機制幫助它

    AndroidA面試題②Activity啟動過程簡要介紹學習計劃

            在Android系統中,Activity和Service是應用程式的核心元件,它們以鬆藕合的方式組合在一起構成了一個完整的應用程式,這得益於應用程式框架層提供了一套完整的機制來協助應用程式啟動這些Activity和Service,以及提供Binder機制幫助它

    Android》閱讀筆記——Activity啟動過程

    ActivityManagerService啟動Activity的過程大致如下圖所示: 在這個圖中,ActivityManagerService和ActivityStack位於同一個程序中,而ApplicationThread和ActivityThread位於另一個程序

    Android程序間通訊(IPC)機制Binder簡要介紹學習計劃

    轉載:http://blog.csdn.net/luoshengyang/article/details/6618363/在Android系統中,每一個應用程式都是由一些Activity和Service組成的,這些Activity和Service有可能執行在同一個程序中,也有

    Android應用程式視窗(Activity)實現框架簡要介紹學習計劃

            前面我們學習了SurfaceFlinger服務的實現原理。有了這個基礎之後,從本文開始,我們就可以分析Android系統在Java層的UI實現了。我們知道,在Android應用程式的四大元件中,只有Activity元件與UI相關,它描述的是應用程式視窗,因此,

    Android進程間通信(IPC)機制Binder簡要介紹學習計劃

    trac named 組成 get tle 能力 計劃 英文 其中 轉自:http://blog.csdn.net/luoshengyang/article/details/6618363/ 在Android系統中,每一個應用程序都是由一些Activity和Ser

    Android系統匿名共享記憶體Ashmem(Anonymous Shared Memory)簡要介紹學習計劃

                            在Android系統中,提供了獨特的匿名共享記憶體子系統Ashmem(Anonymous Shared Memory),它以驅動程式的形式實現在核心空間中。它有兩個特點,一是能夠輔助記憶體管理系統來有效地管理不再使用的記憶體塊,二是它通過Binder程序間通訊機

    Android WebView簡要介紹學習計劃

            我們通常會在App的UI中嵌入WebView,用來實現某些功能的動態更新。在4.4版本之前,Android WebView基於WebKit實現。不過,在4.4版本之後,Android WebView就換成基於Chromium的實現了。基於Chrom

    Android視窗管理服務WindowManagerService的簡要介紹學習計劃

            在前一個系列文章中,我們從個體的角度來分析了Android應用程式視窗的實現框架。事實上,如果我們從整體的角度來看,Android應用程式視窗的實現要更復雜,因為它們的型別和作用不同,且會相互影響。在Android系統中,對系統中的所有視窗進行管理是視窗管理服

    Android應用程式程序啟動過程(前篇)

    前言 在此前我講過Android系統的啟動流程,系統啟動後,我們就比較關心應用程式是如何啟動的,這一篇我們來一起學習Android7.0 應用程式程序啟動過程,需要注意的是“應用程式程序啟動過程”,而不是應用程式啟動過程。關於應用程式啟動過程,我會在後

    Android應用程式啟動過程

    前言 在Android系統中,Activity和Service是應用程式的核心元件,它們以鬆藕合的方式組合在一起構成了一個完整的應用程式,這得益於應用程式框架層提供了一套完整的機制來協助應用程式啟動這些Activity和Service,以及提供Binder機制幫

    Android應用程式程序啟動過程(後篇)

    前言 在前篇中我們講到了Android應用程式程序啟動過程,這一篇我們來講遺留的知識點:在應用程式程序建立過程中會啟動Binder執行緒池以及在應用程式程序啟動後會建立訊息迴圈。 1.Binder執行緒池啟動過程 我們首先來看RuntimeInit

    [筆記]Android應用程式程序啟動過程的理解

    疑問: 1.Process.fork是啥意思?類似new嗎? 2.接著1問,新APP程序和ActivityThread類是怎麼關聯起來的?是zygote程序呼叫執行的ActivityThread類的main方法,怎麼就執行在了新APP程序中? 3.UI主執行緒是啥時候建

    Android應用程式activity啟動流程簡介

      無論是通過點選應用程式圖示來啟動Activity,還是通過Activity內部呼叫startActivity介面來啟動新的Activity,都要藉助於應用程式框架層的ActivityManagerService服務程序。Service也是由ActivityManager

    Windows 中一個應用程式啟動過程

    轉載自:https://blog.csdn.net/cpp_mybest/article/details/80194158 1. Explorer.exe      Windows 能夠流行起來,很大一個原因是它有友好的使用者圖形介面,操作方便簡單,容易上手。在

    筆記-iOS應用程式啟動過程

    程式的啟動 使用Xcode開啟一個專案,很容易會發現一個檔案main.m檔案,此處就是應用的入口。 程式啟動時,先執行main函式,main函式是iOS程式的入口點 內部會呼叫UIApplicationMain函式 UIApplicationMain裡會建立一個UIApplication物

    應用程式程序啟動過程

    --摘自《Android進階解密》 1.AMS在啟動應用程式時會檢查者應用程式需要的應用程序是否存在,不存在就會請求Zygote程序啟動需要的應用程式程序 2.Zygote的Java框架層中會建立一個Server端的Socket,這個Socket用來等待AMS請求Zygote來建立新的應用程式程序 3.

    Spring Application (Spring 應用程式啟動過程

    Spring應用程式啟動過程:1. Spring將"bean配置檔案"中的資訊載入到容器的“Bean定義登錄檔(BeanDefinitionRegistry)”中,此時bean還未初始化。2.呼叫工廠後處理器。 從BeanDefinitionRegistry中找出型別是Bea

    Android硬體抽象層(HAL)概要介紹學習計劃

          Android的硬體抽象層,簡單來說,就是對Linux核心驅動程式的封裝,向上提供介面,遮蔽低層的實現細節。也就是說,把對硬體的支援分成了兩層,一層放在使用者空間(User Space),一層放在核心空間(Kernel Space),其中,硬體抽象層執行在使用者空