onCreate源碼分析

原文地址Android面試題-onCreate源碼都沒看過,怎好意思說自己做android

Activity扮演了一個界面展示的角色,堪稱四大組件之首,onCreate是Activity的執行入口,都不知道入口到底干了嘛,還學什么android,所以本文會從源碼的角度對其進行分析。

熟悉源碼的會發現,真正啟動Activity的實現都在ActivityThread,前面的調用過程略過

ActivityThread的方法performLaunchActivity中調用了Instrumentation類中的方法callActivityOnCreate方法,繼而調用了TargetActivity中的onCreate方法。

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {......Activity activity = null;activity = mInstrumentation.newActivity( cl, component.getClassName(), r.intent);               ......if (r.isPersistable()) {mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);} else {mInstrumentation.callActivityOnCreate(activity, r.state);}......
}

源碼可知:

1)通過反射的機制創建的Activity

2)這里的mInstrumentation是類Instrumentation

3)Instrumentation類中的方法callActivityOnCreate方法源碼如下:

public void callActivityOnCreate(Activity activity, Bundle icicle) {prePerformCreate(activity);activity.performCreate(icicle);postPerformCreate(activity);
}

源碼可知:

1)activity.performCreate(icicle),其中的方法是通過activity,這個activity,形如:Activity activity = 子Activity的對象

2)在Activity類中的方法performCreate(icicle),源碼如下:

final void performCreate(Bundle icicle) {onCreate(icicle);mActivityTransitionState.readState(icicle);performCreateCommon();
}

源碼可知:

1)原來onCreate的生命周期方法是在這里回調的

2)在performCreate方法中調用的onCreate方法是MainActivity中的onCreate方法,那么到此MainActivity中的方法onCreate方法中的參數Bundle savedInstanceState也就知道來源了,此時,MainActivity中的方法也就被調用了。

再次看MainActivity中的方法onCreate:

@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);
super.onCreate(savedInstanceState),其實這條語句放在子類中的onCreate方法中的任何位置都可,問題只是super.onCreate(savedInstanceState)必須要被執行,所以,最好也就是放在第一行,看起來比較明確,至于為什么,參考onSaveInstanceState源碼分析
至此onCreate源碼分析完畢。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539538.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539538.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539538.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux php環境搭建教程,linux php環境搭建教程

linux php環境搭建的方法:首先獲取相關安裝包;然后安裝Apache以及mysql;接著修改配置文件“httpd.conf”;最后設置環境變量和開機自啟,并編譯安裝PHP即可。一、獲取安裝包PHP下載地址:http://cn.php.net/di…

Apache2.2與Tomcat7集成方案詳解

原文地址:http://my.oschina.net/u/919173/blog/159206 ------------------------------------ 首先談一下為什么要集成Apache和tomcat7? Apache是當前使用最為廣泛的WWW服務器軟件,具有相當強大的靜態HTML處理的能力。 Tomcat服務器是一個…

cocos 制作動態生成內容的列表_零代碼工具,讓你在線輕松制作交互內容!

在工作中設計師不會寫代碼,懂代碼的不會設計,2種不同工作互掐的情況屢見不鮮,那我們如何把這2項工作一并融合貫通呢?對于不懂代碼的職場“小白”,我們可以利用一些零代碼工具來完成。今天小編介紹幾款在線開發設計工具…

php怎樣數據緩存文件,php數據緩存到文件類設計

// 自定義緩存類class Cache_Filesystem {// 緩存寫保存function set ($key, $data, $ttl) {//打開文件為讀/寫模式$h fopen($this->get_filename($key), ‘a‘);if (!$h) throw new Exception("Could not write to cache");flock($h, LOCK_EX); //寫鎖定&#x…

jsp放在web-inf下的注意事項

原文:http://blog.csdn.net/whatlookingfor/article/details/38381881 ------------------------------------------------- web-inf目錄是不對外開放的,外部沒辦法直接訪問到。所有只能通過映射來訪問,比如映射為一個action或者servlet通過…

php打印布爾型,PHP數據類型之布爾型的介紹_PHP

布爾類型是PHP中 最簡單的類型。它的值可以為 TRUE 或 FALSE。如:$foofalse;$foo1true;echo "為假時輸出值為:".$foo; //沒有輸出值echo "為真時輸出值為:".$foo1; //輸出1這里主要的細節:當轉換為 boolean 時,以下值被認…

oracle 如何終止存儲過程的運行

0.查詢正在執行的存儲過程: select * from v$db_object_cache where locks > 0 and pins > 0 and typePROCEDURE;1. 在V$ACCESS視圖中找到要停止進程的SID: 舉例:存儲過程名:CRH_ENTRY SELECT t.* FROM V$ACCESS t WHERE t.objectCRH_…

python install zabbix.4.0

1.安裝 MySQLdb 模塊; #!/bin/bash #this is rpm python Environment depends on function depends_rpm(){ yum clean all yum -y install gcc* python-devel python-pip mariadb mariadb-devel mariadb-server if [ $? -eq 0 ]thenpip install MySQL-python1.2.5 elsee…

asp.net 獲取全部在線用戶_Qamp;A | 在線考試問卷答疑

01.如何批量導入試題?如果您已經在word或者excel中準備好了考試文檔,通過批量導入試題的方式,可以讓考試問卷的制作更加方便快捷。詳細了解批量導入考試的文本格式:【點擊此處】02.如何進行考試隨機抽題?老師事先建立題…

PHP 框架 模塊化,Laravel 的模塊化開發框架 Notadd RC1

本文我們要和大家分享 Laravel 的模塊化開發框架 Notadd RC1 的介紹,它的優點是修復了首頁編輯模式下滾動的BUG (Eleven),修復了后臺菜單管理修改后不跳轉的BUG (ganlanshu0211),修復后臺 ESLint 的 Camelcase 的錯誤 (狒狒),暫時…

spring mvc 工作流程

1A)客戶端發出http請求,只要請求形式符合web.xml 文件中配置的*.action的話,就由DispatcherServlet 來處理。 1B)DispatcherServlet再將http請求委托給映射器 的對象來將http請求交給對應的Action來處理 2&#xff0…

9-2 鏈表

package gather;import java.util.LinkedList; import java.util.List; import java.util.ListIterator;public class TestFour {public static void main(String[] args) {// TODO Auto-generated method stub/*** 1、通過整數遍歷元素時,不要使用鏈表結構&#xf…

excel切片器_如何在Excel表格中使用切片器

切片器除了在數據透視表中會使用到,在Excel的表格功能下面,也是可以進行使用的。下面就來介紹一下如何使用切片器這個工具。創建和使用切片器1.首先就是要創建一個表格。選中目標區域,使用快捷鍵CtrlT,創建一個表格。2.點擊“插入…

分階段付款 學php,項目整理-支付寶的支付問題

支付寶作為一個被廣泛使用的支付工具,在是用的時候可以被廣泛使用。可以使用demo提取(由于當時開發時SDK下載路徑無法下載,直接從DEMO中篩選了需要部分)------------------我是開始開發思路的分割線--------------------------本次主要是APP支付的流程。…

使用sqlldr導入文本數據到oracle

1.sqlldr介紹 用法: SQLLDR keywordvalue [,keywordvalue,...]有效的關鍵字:userid -- ORACLE 用戶名/口令 control -- 控制文件名 log -- 日志文件名 bad -- 錯誤文件名 data -- 數據文件名 dis…

Mac os區別_SN及Mac地址燒錄

platform:RK3399 OS:Android 7.1 參考: 1.比特人生 https://blog.csdn.net/ielife/article/details/86719313 2.KrisFei https://blog.csdn.net/kris_fei/article/details/79447343?ops_request_misc%257B%2522request%255Fid%2522%253A%2522158883304619726869022990%2522%25…

linux 查看數據庫和表 mysql 命令

2019獨角獸企業重金招聘Python工程師標準>>> 查看是否有安裝數據庫 :rpm -qa|grep -i mysql 如圖已安裝: 未安裝: 查看MySQL版本的四種方法 1 在終端下執行 mysql -V 2 在help中查找 mysql --help |grep Distrib 3 在mysql 里查看…

php mvc 邏輯層在哪,mvc的業務邏輯應該放哪里?

背景: 基于laravel的后臺管理系統,CURD密集型業務問題:當直接在控制器方法中調用orm處理業務邏輯時,代碼復用性差,控制器層很肥嘗試解決1:新建一個model層,將原先在控制器中的處理邏輯移到mode…

servlet/filter/listener/interceptor區別與聯系

下面從幾個方面闡述一下題目中四個概念的區別與聯系: 1、概念 2、生命周期 3、職責 4、執行過程 一、概念: 1、servlet:servlet是一種運行服務器端的Java應用程序,具有獨立于平臺和協議的特性,并且可以動態的生成web頁…