天天看點

Android Day06四大元件之Activity多頁面跳轉和資料傳遞

ToolBar中menu無法同時顯示圖示和文字問題的解決方法 https://www.jb51.net/article/124726.htm

https://blog.csdn.net/shangming150/article/details/77914110

Toolbar添加傳回按鈕

https://www.jianshu.com/p/2b3785484d7f

ToolBar與ActionBar

https://www.jianshu.com/p/81d0bcb282cb

1.什麼是Activity

  官方文檔是這麼說的:An <code>Activity</code> is an application component that provides a screen     with which

users can interact in order to do something, such as dial the phone,     take a photo, send an email, or

view a map. Each activity is given a window in     which to draw its user interface. The window

typically fills the screen, but may be     smaller than the screen and float on top of other

windows.  

   大緻意思是說:Activity是一個應用程式元件,給使用者提供一個螢幕讓使用者可以與之互動做一些事

   情。

2.Activity的生命周期

  下面這張圖是官方文檔提供的Activity的生命周期的圖:

Android Day06四大元件之Activity多頁面跳轉和資料傳遞

   ·onCreate 方法    當Activity啟動的是調用

    ·onDestroy方法    當Activity銷毀的時候調用

    ·onStart 方法    當Activity可見的時候調用 

    ·onStop 方法     當Activity

不可見的時候調用 

    ·onResume 方法    當Activity上的按鈕 獲得焦點 可以被點選的時候調用 

    ·onPause 方法    當Activity 上的按鈕 失去焦點 按鈕不可以被點選的時候調用     

     ·onRestart 方法   當界面被重新加載的時候調用

注意這個方法

■手機按鍵對應的Activity生命周期的回調方法

    如果點選BACK鍵,會調用Activity的onPause()、onStop()、onDestroy()方法,Activity

  會登出掉。

    如果點選HOME鍵,會調用Activity的onPause()、onStop()方法,但不會執行onDestroy()   方法,程式會運作在背景。如果應用程式沒有被系統殺死,那麼再點選應用程式圖示會調用Activity的onRestart()、onStart()、OnResume()方法。

■特殊的回調方法組合

  如果打開第一個Activity之後,不關閉它,開啟另外一個Activity(非透明的),會調用第一個Activity的onPause()、onStop()方法。

    如果打開第一個Activity之後,不關閉它,開啟另外一個Activity(透明的),會調用第一個

  Activity的onPause()方法,而不會去調用onStop()方法,因為第一個Activity還是可見的。如果關

  閉透明的Activity,第一個Activity隻會回調onResume()方法。

■切屏對應的Activity生命周期的回調方法 

   手機在切屏的時候,會先銷毀,再建立.走onPause()、onStop()、onDestroy()方法,再走onCreate

 ()、onStart()、onResume()方法。這一過程就相當于關閉并重新進入應用一樣,那麼如何防止手機

 在切屏時生命周期發生改變呢?

   第一種方式:把Activity頁面的朝向寫死,通過這個屬性

    android:screenOrientation="portrait"  portrait代表豎屏  landscape代表橫屏

    朝向寫死,在手機上方向是不能改變的,但是在AVD上仍可以切屏,隻是生命周期沒有變化。

   第二種方式:android:configChanges="orientation|keyboardHidden|screenSize"

3.Activity的清單配置

  如果想讓Activity成為應用程式的入口,需要将activity的意圖過濾器配置如下:

   Android允許程式有多個activity作為應用程式的入口,隻要activity配置了以上的意圖過濾器,就會在手機桌面上建立多個應用程式圖示,點選圖示會進入對應的activity界面。

   如果activity節點沒有設定自己的label和icon,會預設使用application節點的label和icon。

4.Activity的頁面跳轉及資料傳遞

  拓展:話說android Activity之間資料傳遞      http://blog.csdn.net/maylian7700/article/details/7323993

   注意的問題,序列化的類中還有自定義的類,則這個類也要序列化,否則會出錯.

  ■啟動Activity傳資料和取資料

    本Activity:傳資料,通過Intent對象的setData()和putExtra()方法封裝資料至Intent對象。

    被調用的的Activity:取資料,通過Activity類的getIntent()方法先得到開啟這個Activity的

               Intent對象,也就是本Activity裡傳資料用到的Intent對象,然後通過

               Intent對象的getXxxExtra()方法得到資料。

   ■啟動Activity的2種方式

      第一種:不需要被啟動的Activity傳回資料

      第二種:需要被啟動的Activity傳回資料      

    對于第二種Activity的啟動方式,需要思考的兩個問題?

     1)被調用的Activity怎麼傳回資料?

        首先,調用者Activity啟動被調用的Activity的方式是

         其次,在被調用的Activity裡面,建立Intent對象,将要傳回的資料封裝進Intent對

      象,調用Activity類的setResult(int resultCode, Intent data)方法傳回Intent對象。

       如:  

     2)調用者Activity怎麼擷取被調用的Activity所傳回的資料?   

         通過複寫Activity的onActivityResult方法可以得到其它的一個或多個Activity返

       回的資料.

       如:

Android Day06四大元件之Activity多頁面跳轉和資料傳遞

      上面的截圖是Android官方文檔的截圖,利用了雙重判斷确定是哪個對象傳回的資料,這樣顯

    得更加嚴密. 傳回的資料就存儲在方法中的參數data中,調用Intent對象的方法取出即可.

5.應用1_短信大全

    需求:将一些好的短信顯示到ListView上,點選某一條短信,就跳到手機的短信發送頁面,并把

       ListView選中條目的内容添加到短信發送頁面的短信内容中.

    分析:這個需求首先涉及到ListView的使用,然後跳到手機短信發送頁面,涉及到隐式意圖啟動系

       統應用,并且要将本應用的資料傳遞到系統應用裡,涉及到頁面跳轉和資料傳遞.

     效果圖:

      假如我點選了ListView短信清單的第2條短信,然後就跳轉到短信發送頁面

Android Day06四大元件之Activity多頁面跳轉和資料傳遞

    核心代碼:

    那麼問題來了,上面意圖對象的過濾條件及傳遞資料格式我是怎麼知道的呢?

     1)先打開Logcat,然後打開手機短信發送頁面,會看到Locat上列印這樣一行資訊(如果沒有

      列印任何資訊,先安裝一個自己的應用,然後重新打開系統的短信發送頁面。):

Android Day06四大元件之Activity多頁面跳轉和資料傳遞

     2)然後去系統應用源碼裡找到短信發送應用Sms,在清單檔案裡找到ComposeMessageActivity

       的配置

       短信發送頁面有很多的過濾器,都是用于發現不同格式資料的(用mimetype屬性來限制),

      我們這裡就隻需要文本類型的資料,就選擇mimetype為text/plain的進行過濾了。 

Android Day06四大元件之Activity多頁面跳轉和資料傳遞

       知道了意圖對象的過濾器,那麼就可以為意圖對象設定過濾資訊

       3)但是,怎麼給intent傳遞資料呢?那麼就得看短信發送頁面的Activity是如何擷取調用

         它的Intent的資料的?

        通過在ComposeMessageActivity.java裡搜尋getStringExtra可以得到×××是根據

        sms_body鍵名來擷取短信内容的。

Android Day06四大元件之Activity多頁面跳轉和資料傳遞

        是以Intent在putExtra時采用的鍵名是“sms_body”。

 6.應用2_×××

    需求:做一個如下圖所示的×××,布局采用混合線性布局。

       功能1:在主UI界面中點選“添加聯系人”那個+号按鈕,就彈出一個窗體列出聯系人(是

          模拟資料,學到内容提供者即可擷取手機真正的聯系人),選擇一個聯系人後關閉

          選擇聯系人頁面,并将選擇的聯系人電話傳回顯示到主UI界面的文本框中。

       功能2:在主UI界面中點選“插入模闆”按鈕,就彈出一個窗體列出一些短信,選擇一條

          短信後關閉短信大全頁面,将将選擇的短信傳回顯示到主UI界面的短信内容文本框

Android Day06四大元件之Activity多頁面跳轉和資料傳遞

     分析:上面的需求,也涉及到頁面跳轉和資料傳遞,不同的是被調用的頁面在關閉的同時還要

       向調用者(主UI界面)傳回選擇的資料。那麼,這個應用要求的技術有以下幾點:

       1)主UI界面在啟動其它Activity的時候,應當使用startActivityForResult的方式,并

        複寫Activity的onActivityResult方法。

       2)兩個傳回資料的ListView都要設定item點選事件,在事件中傳回資料并關閉頁面。

       3)發送短信的功能   

     核心代碼:

       1)短信模闆頁面

        因為ListView隻需顯示單列資料,擴充卡就直接使用ArrayAdapter了。

       2)選擇聯系人頁面      

     3)主UI頁面 

         ★擷取模闆頁面和聯系頁面資料并顯示

        ★發送短信

          通過SmsManager這個類,注意它的擷取方式是通過SmsManager.getDefault方法

          與打電話不同,打電話是通過隐式意圖來調用的。 

          記得要在清單檔案裡加上權限: 

            &lt;uses-permission android:name="android.permission.SEND_SMS"/&gt;

7.Android中的任務棧  

棧 :先進後出  

隊列  先進先出 

任務棧  :是用來維護Activity的

 ,| Activity是用來維護使用者的操作體驗的

打開一Activity 叫

進棧 

關閉一個Activity 出棧

我們使用者操作的Activity

永遠是棧頂的Activity

說我們應用程式退出了

實際上是任務棧清空了

一般情況下

一個應用程式對應一個任務棧 

8.Android中4種啟動模式 

 1.android:launchMode="standard"(預設)

Android Day06四大元件之Activity多頁面跳轉和資料傳遞

  2.singletop 單一頂部模式 在activity的配置檔案中設定android:launchMode="singleTop"

    如果任務棧的棧頂存在這個要開啟的activity,不會重新的建立activity,而是複用已經存在

   的activity。保證棧頂Activity如果存在,不會重複建立。

    應用場景:浏覽器的書簽

Android Day06四大元件之Activity多頁面跳轉和資料傳遞

 3. singetask 單一任務棧,在目前任務棧裡面隻能有一個執行個體存在

    當開啟activity的時候,就去檢查在任務棧裡面是否有執行個體已經存在,如果有執行個體存在就複用

   這個已經存在的activity,并且把這個activity上面的所有的别的activity都清空,複用這個已經

   存在的activity。保證整個任務棧裡面一個Activity隻有一個執行個體存在

     應用場景:浏覽器的activity

    如果一個activity的建立需要占用大量的系統資源(cpu,記憶體)一般配置這個activity為

   singletask的啟動模式。webkit核心

c代碼

Android Day06四大元件之Activity多頁面跳轉和資料傳遞

  4.singleInstance啟動模式非常特殊, activity會運作在自己的任務棧裡面,并且這個任務棧裡面

   隻有一個執行個體存在

   如果你要保證一個activity在整個手機作業系統裡面隻有一個執行個體存在,使用singleInstance

   應用場景: 來電頁面   有道詞典

Android Day06四大元件之Activity多頁面跳轉和資料傳遞

和Activity相關的其它技術點:

   1.當 Activity 以全屏模式運作時,如何允許 Android 系統狀态欄在頂層出現,而不迫使 Activity 重新布局讓

             出空間?

      http://www.zhihu.com/question/19760889

   1.設定activity不可點選  

9.LoadManager

    https://blog.csdn.net/bangyiqing/article/details/17475179

     http://www.voidcn.com/article/p-zyuprzwa-bsv.html

9.Android螢幕旋轉導緻Activity重建的幾種解決辦法

    https://blog.csdn.net/a_salty_fish/article/details/91491147