day4 Activity相關

什么是Activity?

與用戶交互的接口,提供用戶觸摸,點擊,滑動的界面。Android中的activity全都歸屬于task管理 。task 是多個 activity 的集合,這些 activity 按照啟動順序排隊存入一個棧(即“back stack”)。android默認會為每個App維持一個task來存放該app的所有activity,task的默認name為該app的packagename。

四種狀態(tài)?

  • running
    活動狀態(tài),也是activity處于棧頂?shù)臓顟B(tài),這時用戶觸摸屏幕,activity會響應事件
  • paused
    activity失去焦點或者被比如對話框覆蓋時的狀態(tài),這時activity只是失去焦點,所有的成員變量和狀態(tài)都還在
  • stopped
    被其它Activity完全覆蓋
  • killed
    activity被銷毀

Activity生命周期,常見類型概述

Activity生命周期

第一想到的是那副經典的生命周期圖,怎么敘述呢。Activity可以理解為一個界面,為了便于界面編程,安卓設計者賦予了Activity生命周期的概念,從產生到消亡,我們開發(fā)者可以在生命周期的對應階段做相應處理,那么怎么做處理呢?就是Activity每到一個生命周期的階段,就會回調對應的一個方法,比如創(chuàng)建時回調onCreate()。然后我簡單介紹下Activity的一個完整的生命周期是怎樣的順序:

  • 首先創(chuàng)建時回調onCreate(),這里可以進行一些初始化操作,比如設置布局資源,然后onStart(),表明Acitivity正在啟動,activity已處于可見狀態(tài),但是還沒有處于前臺顯示的,就是用戶還不能在此Activity進行交互。接著是onResume(),這個調用后會處于前臺可見狀態(tài),用戶可進行交互。
  • 點擊Home鍵回到主界面(Activity不可見),會讓activity退居到后臺,這時onPause()會被調用,一般情況下,onStop()會在onPause()執(zhí)行后調用,這時候表明整個Activity被停止或被完全覆蓋,因為這個時候activity是不可見得,完全處于后臺運行,另外當調用onPause后,如果系統(tǒng)內存吃緊,activity是有可能被回收的。
  • 當我們再次回到原Activity時,onRestart()會調用,表示這個Activity正在重新啟動,從桌面回到APP,,onRestart()調用完后會調用onStart(),activity回到可見狀態(tài),和前面一樣之后調用onResume,activity回到前臺可見可交互狀態(tài)。
  • 退出當前Activity時->onPause() -> onStop() -> onDestroy(),onDestroy會在activity徹底銷毀前調用

anroid 進程優(yōu)先級

  • 前臺:處于前臺和用戶交互的activity或者和前臺進程Activity綁定的Service所處的進程
  • 可見:處于可見,但不處于前臺,用戶不可以交互的進程
  • 服務:后臺開啟的Service服務
  • 后臺:點擊了Home,前臺進程變?yōu)楹筇爝M程

activity被回收的狀態(tài)和信息保存和恢復過程

onSaveInstanceState方法在Activity可能被回收之前調用,用來保存自己的狀態(tài)和信息,以便回收后重建時恢復數(shù)據(在onCreate()或onRestoreInstanceState()中恢復),旋轉屏幕重建Activity會調用此方法,而且要調用的話就一定發(fā)生在onStop方法之前,但并不保證發(fā)生在onPause的前面還是后面。onRestoreInstanceState方法這個方法在onStart 和 onPostCreate之間調用,在onCreate中也可以狀態(tài)恢復,但有時候需要所有布局初始化完成后再恢復狀態(tài)。

Activity的啟動模式,每個啟動模式的不同點是什么?

啟動模式簡單的說就是定義Activity實例與tack的關聯(lián)方式

為什么定義啟動模式:

  • 讓某些Activity啟動一個新的task
  • 讓activity復用,而不是重新創(chuàng)建一個實例

定義方式:

  • 使用manitest文件,通過Activity的 android:launchMode="standard"屬性
  • intent設置:靠Flag
    • FLAG_ACTIVITY_NEW_TASK:指定為singleTask模式
    • FLAG_ACTIVITY_SINGLE_TOP:指定為singleTop模式
    • FLAG_ACTIVITY_CLEAR_TOP:標識此Activity,當它啟動時,在同一個任務棧中位于它上面的Activity都要出棧
    • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:標識此Activity不會出現(xiàn)在歷史Activity的列表中

哪些啟動模式:

  • standard 標準模式:總會為activity創(chuàng)建一個新的實例,并將該實例添加到當前task中,這種方式不會啟動新的Task,只是將新的 Activity添加到原有的Task中。
  • singleTop:棧頂復用模式,這種模式下,如果新Activity已經位于任務棧的棧頂,那么此Activity不會被重新創(chuàng)建,同時他的onNewIntent方法會被回調。
  • singleTask:棧內復用模式
  • singleInstance:單實例模式,此種模式的Activity只能單獨的位于一個任務棧中

如何在非活動Activity內存不足時被系統(tǒng)銷毀前保存數(shù)據?

Activity中提供了一個方法:onSavedInstanceState(Bundle obj).當系統(tǒng)銷毀一個Activity時,會將Activity的狀態(tài)信息已鍵值對形式存放在bundle對象中. 第一次啟動Activity時,這個bundle對象是空的,null.如果Activity被系統(tǒng)銷毀了,然后用戶要回退回去看的話,系統(tǒng)會調用這個Activity的onCreate方法,并把bundle對象傳遞過去.

橫豎屏切換時,Activity的生命周期會有那些變化?

1、不設置Activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執(zhí)行一次,切豎屏時會執(zhí)行兩次
2、設置Activity的android:configChanges=”orientation”時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執(zhí)行一次
3、設置Activity的android:configChanges=”orientation|keyboardHidden”時,切屏不會重新調用各個生命周期,只會執(zhí)行onConfigurationChanged方法

Activity如何設置為Dialog樣式?

在AndroidManifest.xml 中定義Activity的地方一句話android:theme=”@android:style/Theme.Dialog”或android:theme=”@android:style/Theme.Translucent”就變成半透明的,也可以在onCreate代碼中設置主題。

Context,Application,Activity的區(qū)別與聯(lián)系?

Context:提供應用環(huán)境全局信息的接口,并且這個接口是由抽象類實現(xiàn)的,它的執(zhí)行被android系統(tǒng)所提供,允許我們獲取以應用為特征的資源和類型,同時啟動應用級的操作,如啟動Activity,broadcasting和接收intent。

Application-Context的生命周期與Application的生命周期相關,context隨著Application的銷毀而銷毀,伴隨application的一生,與Activity的生面周期無關。

Activity-Context:這個Context的生命周期是和得到它的引用的Activity一樣長,如果這個Activity結束了,那么,這個Context也會得到釋放

使用context的時候,要小心內存泄漏,防止內存泄漏

  • 不要讓生命周期長的對象引用Activity context,即保證引用activity的對象要與activity本身生命周期是一樣的
  • 對于生命周期長的對象,可以使用Application-context
  • 避免非靜態(tài)的內部類,盡量使用靜態(tài)類,避免生命周期問題,注意內部類對外部類對象引用導致的生命周期的變化。

Activity之間進行數(shù)據傳遞的方式有哪些?

  • intent傳遞數(shù)據
  • 先把數(shù)據保存到本地,然后在下一個Activity中從本地獲取,存儲方式可以是四種持久化存儲方式:SharePreferences,SQlite,Content Provider和File
  • 使用EventBus類似的事件總線
  • 使用廣播

如何退出Activity?如何安全退出已調用多個Activity的Application?

  • 記錄打開的Activity:每打開一個Activity,就記錄下來,在需要退出時,關閉每一個Activity,Activity記錄可在自定義的Application執(zhí)行,Application可實現(xiàn)一個接口,該接口會返回相應啟動或銷毀的Activity實例
  • 在需要結束應用時,發(fā)送一個特定的廣播,每一個Activity收到廣播后關閉
  • 通過intent的flag來實現(xiàn),根據應用界面的交互場景利用Activity的啟動模式來設計。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,039評論 25 709
  • 個人總結: 一個應用程序只有一個任務棧(Stack); 一個應用程序可以有多個Task(一個Task表現(xiàn)于回退棧,...
    畫十閱讀 1,878評論 0 3
  • 希望自己能夠堅持自我。開始全新。能夠做的自己的要求。不要逼到眼前才會去做,不要傻了。你一個人加油吧
    卡卡巖閱讀 296評論 6 3
  • 1. 他死了為了尋一只三個月大的小羊掉進了山崖再未醒來 晚上八點一路尋到深夜四點山路崎嶇 妻在家一夜未睡心里有著從...
    大小簡閱讀 263評論 0 0
  • 目錄 這一夜雖身在荒山野嶺之中,我卻睡得格外安穩(wěn),不知是凈玄的梵語起了作用,還是因為有他在身邊,讓人覺得分外安心的...
    冷清持閱讀 590評論 7 18

友情鏈接更多精彩內容