本節(jié)內容
1.開機到點擊應用圖標的過程
2.創(chuàng)建ActivityThread和Application
3.Activity的加載流程
4.Context上下文的理解
5.實現顯式跳轉和返回
6.數據傳遞和回傳
7.隱式啟動系統(tǒng)服務
8.隱式跳轉到其他程序的頁面
一、開機到點擊應用圖標的過程
1.手機開機之后,會啟動一個進程管理手機的頁面,然后就有一些系統(tǒng)服務。比如(WindowManagerService,ActivityManagerService,CameraService)等。
二、創(chuàng)建ActivityThread和Application
1.一個程序運行起來就是一個進程,但是點開一個應用圖標然后執(zhí)行具體任務的是由線程來實現的。
2.點擊圖標,就會啟動ActivityThread。線程的入口點是main函數,在main函數里面創(chuàng)建ActivityThread。
3.將ActivityThread 對象進行綁定,調用thread.attach(false,startSeq)方法
4.創(chuàng)建儀表類對象 ,管理程序的生命周期
mInstrumentation = new Instrumentation()
5.創(chuàng)建上下文,再創(chuàng)建應用程序,然后回調application的onCreate()方法。
Context ContextImpl appContext =
ContextImpl.createAppContext.makeApplication(true,null)
6.當重寫父類的方法時,是否需要調用父類的方法
1.如果父類實現是空的 ,通常不需要調用
2.如果父類有實現,那么通常需要使用super調用一下父類的方法三、Activity的加載流程
1. 在handleLaunchActivity 里面調用 performLaunchActivity,通過這個方法創(chuàng)建上下文
ContextImpl appContext = createBaseContextForActivity(r);
2.創(chuàng)建啟動的頁面
activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);
3.將界面和window綁定 ,activity.attach(appContext,window)還有其他參數沒寫出來
4.調用onCreate()方法布局Activity界面
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
5.在Activity的子類中 通過實現onCreate()方法來對界面進行初始化(UI布局,邏輯初始化)
四、Context上下文的理解
1.Application Activity Service都是有上下文的,上下文其實就是一個運行環(huán)境
2.Context提供了訪問系統(tǒng)資源的方法 可以理解為就是一個橋梁,連接設備和context應用界面。
3.什么時候用到context呢,看你什么時候需要系統(tǒng)資源,你什么時候需要,那你就什么時候用context。
4.Activity 的Context和applicationContext的區(qū)別:
大多數情況下 ,可以相互使用。如果在涉及界面跳轉的時候 ,盡量使用activity的context 因為它提供了默認的任務站,而applicationContext沒有提供任務站。
5.Activity就是一個獨立的頁面。實現頁面之間的跳轉通過Intent類管理。
6.跳轉有兩種: 1.顯式跳轉 同一個應用程序不同界面之間的跳轉 明確指定從哪個頁面切換到哪個頁面。2.隱式跳轉 :不同程序之間進行界面的跳轉 (微信支付 支付寶支付 微信分享),打開系統(tǒng)提供的服務 (相機 撥號 發(fā)信息 聯(lián)系人信息)
五、實現顯式跳轉和返回
1.給某個按鈕設置一個點擊事件,然后監(jiān)聽它來實現跳轉
mJump.setOnClickListener {
Intent().apply {
}.also {
startActivity(it)
}
}
2.實現返回,可以在跳轉后的界面添加一個按鈕,并為其設置一個點擊事件,一旦它被點擊,就結束這個界面。
mBackBtn.setOnClickListener {
//結束當前頁面
finish()
}
3.實現返回還有一種方法,就是在AndroidManifest.xml中,給第二個界面添加一個父界面即可。
<activity android:name=".SecondActivity"
android:parentActivityName=".MainActivity">
六、數據傳遞和回傳
1.從一個頁面跳轉到另一個頁面,可以通過intent.putExtra()方法來傳遞數據,但是只能傳遞系統(tǒng)默認的基本類型。
intent.putExtra("name","jack")
intent.putExtra("pwd","123")
2.跳轉后的頁面需要接收傳遞過來的數據,只需要獲取對應的Intent對象。
val name:String= intent.getStringExtra("name")
val password :String=intent.getStringExtra("pwd")
3.一個一個傳遞會有點麻煩,所以可以創(chuàng)建一個Bundle()對象來管理這些鍵值對。
val bundle = Bundle()
bundle.putString("name","jack")
bundle.putInt("age",20)
intent.putExtras(bundle)
4.如果用bundle傳遞數據,那么接收數據也要使用bundle
val bundle = intent.extras
val name = bundle?.getString("name")
val age = bundle?.getInt("age")
5.如果需要有返回值的跳轉,那么就需要使用以下代碼實現跳轉
startActivityForResult(intent,1)
6.回調結果,就使用setResult()方法,以下是不帶數據回調
setResult(1)
7.有一個onActivityResult()方法專門用來處理回調的數據
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
//判斷是不是我請求的數據 -> requestCode
if(requestCode==1){
//判斷處理結果 resultCode
if(resultCode==0){
//成功
Log.v("666","處理成功 : ${data?.getStringExtra("uid")}")
}else{
//失敗
Log.v("666","處理失敗")
}
}
}
8.如果帶數據回調,就使用以下方法
Intent().apply {
putExtra("uid","001")
setResult(0,this)
}
七、隱式啟動系統(tǒng)服務
1.跳轉到撥打電話,或者是發(fā)短信的系統(tǒng)軟件
Intent().apply {
//撥打電話
//通過配置文件的意圖過濾器來查找我們需要的Activity
//action動作行為
action= Intent.ACTION_DIAL
//data 傳遞數據,Uri是資源索引
啟動撥號界面,將電話號碼傳遞過去,就可以進行跳轉
data = Uri.parse("tel:13879122222")
}.also{
startActivity(it)
}
2.發(fā)送短信消息
action = Intent.ACTION_VIEW
data = Uri.parse("sms: 這是我的消息")
3.啟動相機
action = "android.media.action.IMAGE_CAPTURE"
八、隱式跳轉到其他程序的頁面
1.在AndroidManifest.xml中添加意圖過濾器
<!--添加意圖過濾器-->
<intent-filter>
//系統(tǒng)提供的這種行為
<action android:name="android.intent.action.SEND"/>
//可以自己定義action
<action android:name="666.action.balabala"/>
//如果希望外部程序能夠啟動這個頁面,必須設置category為default
<category android:name="android.intent.category.DEFAULT"/>
//如果希望外部啟動這個界面的時候 傳遞數據回來 必須定義數據的格式
<data android:scheme="666"/>
</intent-filter>
2.重新布局一下activity_main.xml頁面,添加一個按鈕,并給按鈕添加一個id叫mGo.然后在MainActivity里面給這個按鈕設置一個監(jiān)聽事件,一旦它被點擊,就跳轉到我們設置的程序頁面
mGo.setOnClickListener {
Intent().apply {
action = Intent.ACTION_SEND
data = Uri.pause("666:MyApplication傳遞過來的數據")
}.also {
startActivity(it)
}
}
3.上面用的是系統(tǒng)的name,也可以使用自己定義的name
action = "666.action.balabala"
4.在SecondActivity里面可以添加以下這段代碼,判斷數據是否傳過來了
val content= intent.data?.schemeSpecificPart
Log.v("666",content)