<1>關于Activity和AndroidManifest
我們AS項目裡的AndroidManifest.xml檔案其實就是一個清單檔案,用于描述我們的項目内容
其中包含了一些Application、activity、包名等資訊,還包括一些權限的聲明(例如在資料存儲時使用SD卡讀寫的權限聲明)
四大元件也都需要在這裡注冊之後才能使用
Application就代表一個應用程式,其中可以包含四大元件
而Activity是用于處理使用者操作,與使用者進行互動的(可以了解為一個容器,一個視窗,主要用于承載UI内容)
如何在一個Application中再建立一個activity呢?(即如何再建立一個UI視窗)
——首先建立一個類SecondActivity,這個類繼承Activity
——重寫其中的onCreate()方法
——然後再建立一個布局activity_second,在SecondActivity類中setContentView()顯示這個布局
——最後要使這個新的Activity可以使用,需要在配置清單裡注冊一下
可以看到,在一個application中注冊了有兩個activity,一個标簽設定為“第一個ActivityDemo”,另一個設定為“第二個ActivityDemo”,同時給了兩個intent-filter,都聲明的是主入口
是以最終的結果是,在手機中有兩個app圖示,都可以打開這個程式,分别是這個程式的兩個界面
<2>利用顯式意圖來實作界面跳轉
用一個案例來學習顯式意圖的界面跳轉(目标是在主界面輸入賬号和密碼,點選登入按鍵後,跳轉到另一個界面,并在其中顯示我們輸入的賬号和密碼)
——首先,在MainActivity中和原來一樣,通過id找到我們輸入的賬号和密碼
——然後判斷賬号和密碼是否為空,如果不為空,則建立一個意圖對象 Intent ,把我們的賬号和密碼的值存儲到這個對象裡 putExtra()方法,存儲了鍵值對
——調用startActivity()方法進行界面的跳轉
——建立一個類SecondActivity,繼承Activity并重寫其中的onCreate()方法
——這個activity記得要在配置清單中聲明一下才能使用
——最後在SecondActivity類中的onCreate方法裡,getIntent()得到第一個界面中我們建立的意圖對象,然後擷取其中的内容并顯示
——最終效果如下
<3>利用隐式意圖來實作界面跳轉
隐式意圖實作界面跳轉的方式和顯式差不多,主要差别就是建立Intent的方法
<4>差別
顯式意圖:也就是可以直接看到我們要跳轉到的目标元件,例如之前要從MainActivity跳轉到SecondActivity,用的是new Intent(this, SecondActivity.class);在這裡面我們直接就可以看到目标元件的名稱(一般是用于應用内元件的跳轉)
隐式意圖:用于跳轉到第三方應用(一般是用于各個應用之間的跳轉)
——建立顯式意圖的幾種寫法:
//第一種:
Intent intent = new Intent();
intent.setClassName("包名","類名");
startActivity(intent);
//第二種:
ComponentName componentName = new ComponentName("包名","類名");
//第三種:
Intent intent = new Intent(this, 要跳轉的界面類名.class );
其實還有很多種寫法,沒有全部列出來
建立顯式意圖主要就是要找到元件的名稱 ComponentName = 包名/類的路徑名稱
由于顯式意圖主要是用在應用内部各個元件之間的跳轉,是以第三種方式就很友善
——建立隐式意圖
隐式意圖的建立步驟為:
建立Intent對象
給這個intent對象設定Action,設定它的category值,設定包名(可以在Android系統源碼裡查找過濾器 intent-filter 檢視各個系統應用的action值和category值)
使用startActivity()方法跳轉到另一個界面
intent.setAction(" 目标應用的元件的action值 ");
intent.setCategory(" 目标應用的元件的category值 ");
intent.setPackage(" 目标應用的元件的包名 ");
采用這種方式,在建立和使用的時候我們是看不見這個元件的名稱的,隻通過它的action值,category值和包名就可以使用了
<5>元件之間的資料傳遞
Activity之間的資料傳遞群組件之間的資料傳遞是一樣的
資料傳遞又分為兩種:1 基本資料類型的資料傳遞 2 引用資料類型的資料傳遞(對象的傳遞)
——基本資料類型資料的傳遞
直接建立一個意圖intent,調用intent中的putExtra()方法就可以把基本資料類型的資料以鍵值對的形式存儲在這個intent中
然後切換界面,在接收界面中首先getIntent()拿到這個intent對象,然後再用intent.getExtra()方法用鍵擷取到相應的值即可
——引用資料類型資料的傳遞
其實引用資料類型的傳遞和基本資料類型的資料傳遞方式差不多,都是利用了putExtra()和getIntent()兩個方法,不同的是引用資料類型的資料在傳遞前必須要把資料序列化
要把資料序列化,就是要在傳遞的對象的類中實作Parcelable接口或者實作Serializable接口
Parcelable接口是Google自定義的接口,使用起來比較高效,直接将資料存儲到記憶體中,然後傳遞
Serializable接口則是Java自帶的,是寫到持久化存儲單元裡然後再傳遞的,比較慢
例如我們要傳遞一個user對象,首先要對User類實作可序列化的接口
然後再傳遞
(需要注意的是,String類和Bitmap類本身就以及實作了序列化接口的,是以在傳遞string類型資料或bitmap類型的資料的時候,不需要再對其實作序列化接口,直接和基本資料類型傳遞一樣的使用就可以了)
來寫一個撥打電話的按鍵,練習一下用協定來傳資料:
注意要在配置清單中打開打電話的權限
類似的打電話,發短信,或者操作其他應用的都可以通過這種方法,在Android源碼中找到相應的參數,通過建立隐式意圖的方法進行跳轉和根據其中規定的協定進行資料傳輸
——也可以自己按這種方法定義界面操作,在配置清單中配置一下即可,其中 action 内容就是包名.應用名稱 , category 意思就是這個應用的類别(例如DEFAULT就表示這是一個應用),data 後面可以自己設定限制
然後通過隐式意圖,填寫相關的配置資訊,就可以跳轉到該應用界面并傳輸資料
<6>Activity之間的資料回傳
例如我們發微信朋友圈的時候,需要從朋友圈編輯界面先跳轉到相冊界面,選擇想要釋出的相片,然後選完之後會自動傳回到朋友圈的編輯界面,并且選中的相片會傳到這裡
這種類似的情況就用到了Activity之間的資料回傳
資料回傳和跳轉界面差不多,主要的差別在于資料回傳要用到startActivityForResult(intent)這個方法而不是startActivity(intent)方法
寫一個充值的例子來練習,具體要求是:
在主界面點選充值按鍵,跳轉到充值界面,在充值界面充值等操作後,自動傳回到主界面并顯示操作結果
主界面中的操作
支付界面的操作
主要的思路就是,主界面調用startActivityForResult(intent,requestCode<1> )方法
在充值界面中,當完成充值操作會調用setResult(resulCode<2> , intent)方法,當完成取消充值會調用setResult(resultCode<3> ,intent)方法
在主界面中重寫onActivityResult()方法,在這個方法中通過判斷requestCode來确定傳回資料應該去到哪個部位
通過判斷resultCode來判斷跳轉的那個界面到底做了什麼操作,用data.getExtra()方法擷取到相應操作的資料結果