<1>關于Activity和AndroidManifest
我們AS項目里的AndroidManifest.xml文件其實就是一個清單文件,用于描述我們的項目內容
其中包含了一些Application、activity、包名等信息,還包括一些權限的聲明(例如在數據存儲時使用SD卡讀寫的權限聲明)
四大組件也都需要在這里注冊之后才能使用
?
Application就代表一個應用程序,其中可以包含四大組件
而Activity是用于處理用戶操作,與用戶進行交互的(可以理解為一個容器,一個窗口,主要用于承載UI內容)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.androidactivitydemo"> //包名
//這兩行就是設置權限,允許外置存儲卡讀寫操作
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
//一個application就代表了一個應用程序
<application
android:allowBackup="true" //允許系統(tǒng)備份
android:icon="@mipmap/ic_launcher" //設置應用的桌面圖標(這些圖標存儲在res文件夾的mipmap里的lc_launcher下)
android:label="@string/app_name" //設置應用程序的名稱(它存儲在res文件夾的values下的strings里)
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" //支持從右到左
android:theme="@style/Theme.AndroidActivityDemo"> //用于控制樣式(它存儲在res文件夾的values下的themes里)
<activity
android:name=".MainActivity" //四大組件的靜態(tài)注冊都要這樣
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
?
如何在一個Application中再新建一個activity呢?(即如何再新建一個UI窗口)
——首先新建一個類SecondActivity,這個類繼承Activity
——重寫其中的onCreate()方法
——然后再新建一個布局activity_second,在SecondActivity類中setContentView()顯示這個布局
——最后要使這個新的Activity可以使用,需要在配置列表里注冊一下
可以看到,在一個application中注冊了有兩個activity,一個標簽設置為“第一個ActivityDemo”,另一個設置為“第二個ActivityDemo”,同時給了兩個intent-filter,都聲明的是主入口
所以最終的結果是,在手機中有兩個app圖標,都可以打開這個程序,分別是這個程序的兩個界面
?
<2>利用顯式意圖來實現界面跳轉
(顯式Intent:按名稱(完全限定類名)指定要啟動的組件)
用一個案例來學習顯式意圖的界面跳轉(目標是在主界面輸入賬號和密碼,點擊登錄按鍵后,跳轉到另一個界面,并在其中顯示我們輸入的賬號和密碼)
——首先,在MainActivity中和原來一樣,通過id找到我們輸入的賬號和密碼
——然后判斷賬號和密碼是否為空,如果不為空,則創(chuàng)建一個意圖對象 Intent ,把我們的賬號和密碼的值存儲到這個對象里 putExtra()方法,存儲了鍵值對
——調用startActivity()方法進行界面的跳轉
——新建一個類SecondActivity,繼承Activity并重寫其中的onCreate()方法
——這個activity記得要在配置清單中聲明一下才能使用
——最后在SecondActivity類中的onCreate方法里,getIntent()得到第一個界面中我們創(chuàng)建的意圖對象,然后獲取其中的內容并顯示
——最終效果如下
?
<3>利用隱式意圖來實現界面跳轉
(隱式Intent:不會指定特定的組件,而是聲明要執(zhí)行的常規(guī)操作,從而允許其他應用中的組件來處理它)
隱式意圖實現界面跳轉的方式和顯式差不多,主要差別就是創(chuàng)建Intent的方法
?
<4>區(qū)別
顯式意圖:也就是可以直接看到我們要跳轉到的目標組件,例如之前要從MainActivity跳轉到SecondActivity,用的是new Intent(this, SecondActivity.class);在這里面我們直接就可以看到目標組件的名稱(一般是用于應用內組件的跳轉)
隱式意圖:用于跳轉到第三方應用(一般是用于各個應用之間的跳轉)
?
——創(chuàng)建顯式意圖的幾種寫法:
//第一種:
Intent intent = new Intent();
intent.setClassName("包名","類名");
startActivity(intent);
?
//第二種:
Intent intent = new Intent();
ComponentName componentName = new ComponentName("包名","類名");
startActivity(intent);
?
//第三種:
Intent intent = new Intent(this, 要跳轉的界面類名.class );
startActivity(intent);
其實還有很多種寫法,沒有全部列出來
創(chuàng)建顯式意圖主要就是要找到組件的名稱 ComponentName = 包名/類的路徑名稱
由于顯式意圖主要是用在應用內部各個組件之間的跳轉,所以第三種方式就很方便
?
——創(chuàng)建隱式意圖
隱式意圖的創(chuàng)建步驟為:
創(chuàng)建Intent對象
給這個intent對象設置Action,設置它的category值,設置包名(可以在Android系統(tǒng)源碼里查找過濾器 intent-filter 查看各個系統(tǒng)應用的action值和category值)
使用startActivity()方法跳轉到另一個界面
Intent intent = new Intent();
intent.setAction(" 目標應用的組件的action值? ");
intent.setCategory(" 目標應用的組件的category值 ");
intent.setPackage(" 目標應用的組件的包名 ");
startActivity(intent);
采用這種方式,在創(chuàng)建和使用的時候我們是看不見這個組件的名稱的,只通過它的action值,category值和包名就可以使用了
?
<5>組件之間的數據傳遞
Activity之間的數據傳遞和組件之間的數據傳遞是一樣的
數據傳遞又分為兩種:1 基本數據類型的數據傳遞??? 2? 引用數據類型的數據傳遞(對象的傳遞)
?
——基本數據類型數據的傳遞
直接創(chuàng)建一個意圖intent,調用intent中的putExtra()方法就可以把基本數據類型的數據以鍵值對的形式存儲在這個intent中
然后切換界面,在接收界面中首先getIntent()拿到這個intent對象,然后再用intent.getExtra()方法用鍵獲取到相應的值即可
?
——引用數據類型數據的傳遞
其實引用數據類型的傳遞和基本數據類型的數據傳遞方式差不多,都是利用了putExtra()和getIntent()兩個方法,不同的是引用數據類型的數據在傳遞前必須要把數據序列化
要把數據序列化,就是要在傳遞的對象的類中實現Parcelable接口或者實現Serializable接口
Parcelable接口是Google自定義的接口,使用起來比較高效,直接將數據存儲到內存中,然后傳遞
Serializable接口則是Java自帶的,是寫到持久化存儲單元里然后再傳遞的,比較慢
例如我們要傳遞一個user對象,首先要對User類實現可序列化的接口
然后再傳遞
(需要注意的是,String類和Bitmap類本身就以及實現了序列化接口的,所以在傳遞string類型數據或bitmap類型的數據的時候,不需要再對其實現序列化接口,直接和基本數據類型傳遞一樣的使用就可以了)
?
?
?
?
來寫一個撥打電話的按鍵,練習一下用協(xié)議來傳數據:
?
?注意要在配置清單中打開打電話的權限
?
?類似的打電話,發(fā)短信,或者操作其他應用的都可以通過這種方法,在Android源碼中找到相應的參數,通過創(chuàng)建隱式意圖的方法進行跳轉和根據其中規(guī)定的協(xié)議進行數據傳輸
?
——也可以自己按這種方法定義界面操作,在配置清單中配置一下即可,其中 action 內容就是包名.應用名稱 , category 意思就是這個應用的類別(例如DEFAULT就表示這是一個應用),data 后面可以自己設置約束
然后通過隱式意圖,填寫相關的配置信息,就可以跳轉到該應用界面并傳輸數據
?
?<6>Activity之間的數據回傳
例如我們發(fā)微信朋友圈的時候,需要從朋友圈編輯界面先跳轉到相冊界面,選擇想要發(fā)布的相片,然后選完之后會自動返回到朋友圈的編輯界面,并且選中的相片會傳到這里
這種類似的情況就用到了Activity之間的數據回傳
數據回傳和跳轉界面差不多,主要的區(qū)別在于數據回傳要用到startActivityForResult(intent)這個方法而不是startActivity(intent)方法
?
寫一個充值的例子來練習,具體要求是:
在主界面點擊充值按鍵,跳轉到充值界面,在充值界面充值等操作后,自動返回到主界面并顯示操作結果
主界面中的操作
?
?支付界面的操作
?
?
?
?
?主要的思路就是,主界面調用startActivityForResult(intent,requestCode<1> )方法
在充值界面中,當完成充值操作會調用setResult(resulCode<2> , intent)方法,當完成取消充值會調用setResult(resultCode<3> ,intent)方法
在主界面中重寫onActivityResult()方法,在這個方法中通過判斷requestCode來確定返回數據應該去到哪個部位
通過判斷resultCode來判斷跳轉的那個界面到底做了什么操作,用data.getExtra()方法獲取到相應操作的數據結果
?
本文摘自 :https://www.cnblogs.com/