• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 安卓學習筆記

    標簽: 安卓

    學習安卓的學習筆記,留存一下,雖然以后可能都不會從事安卓相關的工作了,紀念一下。

    1 Activity

    1 返回棧

    活動可以層疊,啟動一個新的活動會覆蓋在原活動上,Back會銷毀最上面的活動,下面的一個活動就會重新顯示。

    用任務管理一系列活動。任務用返回棧描述。

    啟動一個新的活動,這個活動就在返回棧中入棧,finish()即棧頂元素出棧,系統總是會顯示處于棧頂的活動給用戶。(所以finish()銷毀的是棧頂,現在活動的會執行到finish()的也只有棧頂活動)
     

    2 生命周期

    2.1 活動的4種狀態

    1 運行狀態

    處于棧頂的活動,系統不愿意回收這種

    2 暫停狀態

    活動不處于棧頂,但是依然可見,雖然不處于棧頂,但是完全存活著的,系統也不愿意回收,除非,內存很低。

    3 停止狀態

    活動不處于棧頂,且完全不可見。

    系統仍會為這種活動保存相應的狀態和成員變量,但是不可靠,可能會被回收,看內存情況。

    4 銷毀狀態

    從返回棧中移除。

    系統傾向于回收處于這種狀態的活動。

     

    2.2 活動的生命周期
     

    2.2.1  7個回調函數

    1 OnCreate()

    在活動第一次被創建時候調用

    可以在這里完成一些初始化動作。

    2 onStart()

    在活動由不可見變為可見時候調用。

    3 onResume()

    在活動準備好和用戶進行交互的時候調用。

    此時活動一定位于棧頂,處于運行狀態。

    4 onPause()

    系統準備去啟動或者恢復另一個活動時候調用。

    可以用來釋放資源、保存關鍵數據。

    5 onStop()

    在活動完全不可見時候調用。

    和onPause()區別是,如果啟動的新活動是一個對話框式的活動(也就是之前的活動不會不可見),那么onPause()會得到執行。

    6 onDestroy()

    在活動被銷毀之前調用,之后活動狀態將變為銷毀狀態。

    (即活動出棧)

    7 onRestart()

    在活動由停止狀態變為運行狀態之前調用,也就是活動被重新啟動了。

     

    2.2.2 3種生存期

    • 完整生存期

    onCreate()~onDestroy()
     

    • 可見生存期

    onStart()~onStop()

    可見不等于可與用戶交互。
     

    • 前臺生存期

    onResume()~onPause()

    前臺生存期內,活動處于運行狀態,可以和用戶進行交互。

     

    測試:

    和書上不一樣的是對話框主題要設置成這樣,不然點擊就崩潰:

     <activity android:name=".DialogActivity"    
     android:theme = "@style/Theme.AppCompat.Dialog"></activity>  <!--配置成對話框式-> 

    MainActivity第一次被創建時,一次執行OnCreate() onStart() onResume()

     

    點擊按鈕,啟動NormalActivity時候,MainActivity會被完全遮擋住,因此onPause()和onStop()被調用。

    按下Back返回MainActivity,之前MainActivity已經進入了停止狀態,所以onRestart()方法執行,之后依次執行onStart()和onResume()

    恢復執行-->不可見到可見-->交互

    啟動DialogActivity,onPause()執行,關閉DialogActivity,onResume()執行,因為MainActivity沒有停止,也沒有不可見。

     

    最后在MainActivity按下Back,依次執行:

     

    2.2.3 Bundle

    如果B返回到A,A在B運行期間被系統回收,那么會執行A的onCreate()方法,如果A中存在臨時數據和狀態也被回收了,用戶體驗很不好。

    解決:onSaveInstanceState()回調方法,保證在活動回收之前一定被調用,??干嘛不重載下onDestroy啊?

    / / 在 回 收 前 ? 定 被 調 ? , 可 以 在 B u n d l e 中 保 存 數 據
     @Override 
    protected void onSaveInstanceState(@NonNull Bundle outState) { 
         super.onSaveInstanceState(outState); 
         outState.putString("tempData","hengheng");
     }
    

    在onCreate()里恢復

    //恢復在上次回收前在Bundle中保存的數據
     if(savedInstanceState !=null) {
         Log.d(TAG,savedInstanceState.getString("tempData"));
     }
    

    Bundle也可結合Intent一起傳遞數據。

    2.3 活動的啟動模式

    如圖四種,在AndroidMainfest.xml的activity屬性里修改android:launchMode

    2.3.1 standard

    standard 是活動默認的啟動模式。

    standard模式下,每當啟動一個新的活動,就會創建該活動一個新的實例,并入棧,不管它是否已在返回棧中存在。

    比如點擊某個按鈕啟動一個activity,點擊n次就會啟動n個,back回去要back n次。
     

    2.3.2 singleTop

    啟動活動時,如果該活動在棧頂就直接使用,否則創建新的實例。

    比如從MainActivity到SecondActivity,此時棧頂是SecondActivity,再從SecondActivity啟動MainActivity,這時因為棧頂不是MainActivity,會新建一個MainActivity實例,打印這兩個實例會看到不一樣。

     

    2.3.3 singleTask

    啟動活動時,會在棧中檢查有沒有,有就使用,當然在他之上的活動都會全部出棧。

    如果singleTask指定了不同的taskAffinity,也會啟動一個新的返回棧。
     

    2.3.4 singleInstance

    First、Second、Third三個不同的Activity

    把SecondActivity改成singleInstance,則啟動SecondActivity會把它加入一個新的返回棧,

    Log.d("SecondActivity","Task id is"+getTaskId());

    打印三個Activity的TaskId(所屬棧id)會發現,First和Third是相同的,Second是不同的,如果First啟動Second,Second中啟動Third,從Third Back會回到First而不是Second,因為他倆是一個棧

     

    版權聲明:本文為carlylll原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/carlylll/article/details/108759305

    智能推薦

    安卓學習筆記之Handler

    UI線程 當系統啟動的時候,就會創建一個主線程(Main Thread),然后這個主線程向UI組件分發事件,主線程和UI的組件進行交互,故稱UI線程。 線程安全 Android的UI線程是不安全的。引用一下,百度百科的解釋 線程安全就是多線程訪問時,采用了加鎖機制,當一個線程訪問該類的某個數據時,進行保護,其他線程不能進行訪問直到該線程讀取完,其他線程才可使用。不會出現數據不一致或者數據污染。 線...

    安卓學習筆記之Okhttp

    什么是okhttp? 我們如果原生的去寫一個網絡請求,需要用到的是HttpConnection等相關類去實現的,但是編寫原生的網絡請求,需要我們來實現更多復雜的功能,比如斷點續傳,都需要花費很長的時間去寫。效率也不高。所以我們為了方便在開發過程中能夠省電精力,需要運用到第三方網絡框架,那就是Okhttp。 Okhttp的使用 manifest添加網絡權限 < uses-permission ...

    安卓學習筆記之IntentService

    什么是IntentService 它會創建一個獨立的子線程來處理所有的Intent請求,創建的子線程來處理onHandleIntent()實現的代碼,無需處理多線程的問題。默認實現onBind()方法,返回為null;默認實現onStartCommand()方法,將請求的Intent添加到隊列中。這個類實際上是繼承自service,內部是封裝了HandlerThread和Handler類。 代碼實...

    安卓學習筆記之Activity(一)

    ** 安卓四大組件之Activity ** 1.介紹 ** Activity的出現無處不在,從手機開始啟動的第一個頁面的都是Activity。主要用于可見的狀態與用戶進行交互。好比一張紙,我們需要用代碼這只“筆”來描繪一些信息告訴讀者,這張紙里面有些什么內容和需要操作什么東西。總的來說就是能看到的基本上和Activity。如果有什么錯誤的地方,希望大家指出。感激不盡。 既然...

    安卓學習筆記之service(一)

    安卓四大組件之Service 今天來入門一下service這個組件,這玩意是在你后臺做一些必要的工作。 ** 1.什么是service? ** 從google官網看的,官方的描述是這樣的。 A Service is an application component representing either an application’s desire to perform a long...

    猜你喜歡

    安卓學習筆記10:相對布局

    文章目錄 零、學習目標 一、相對布局 1、布局特點 2、繼承關系圖 3、常用屬性 (1)相對于父容器居中 (2)相對于其它控件的位置 (3)相對于其它控件對齊 (4)相對于父容器對齊 (5)標識符問題 二、教學案例 —— 相對布局演示 (一)運行效果 (二)實現步驟 1、創建安卓應用【RelativeLayoutDemo】 2、主布局資源文件activity_main.xm...

    安卓學習筆記08:線性布局

    文章目錄 零、學習目標 一、界面與布局概述 (一)界面 (二)布局 1、視圖層次結構圖 2、UI容器 (Container) 3、UI控件 (Control) 4、兩種方式聲明布局 二、線性布局 (一)繼承關系圖 (二)常用屬性 (三)案例演示 —— 線性布局屬性 1、創建安卓應用【LinearLayoutDemo】 2、主布局資源文件activity_main.xml (...

    安卓學習筆記——服務(Service)

    目錄 安卓實驗(Service) 1. 創建兩個按鈕控件 2. 創建用于計時的服務(Service) 3. 注冊TimerService服務 4. 按鈕功能實現 5. 進行調試運行 安卓實驗(Service) 在Android Studio創建計時服務,并使用兩個按鈕進行控制 1. 創建兩個按鈕控件 在activity_main.xml中添加如下代碼新建兩個按鈕控件,也可在Design窗口中拖動控...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    精品国产乱码久久久久久蜜桃不卡