一. 什麼是Activity?
- Activity是android四大組件之一!!
- Activity 是一個應用組件,用戶可與其提供的屏幕進行交互
- 每個 Activity 都會獲得一個用於繪製其用戶界面的窗口。窗口通常會充滿屏幕,但也可小於屏幕並浮動在其他窗口之上。
- 一個應用通常由多個彼此鬆散聯繫的 Activity 組成。 一般會指定應用中的某個 Activity 爲“主” Activity, 即首次啓動應用時呈現給用戶的那個 Activity
- 當一個 Activity 因某個新 Activity 啓動而停止時,系統會通過該 Activity 的生命週期回調方法通知其這一狀態變化
二. 基本狀態
在android 中,Activity 擁有四種基本狀態:
- Active/Running
一個新 Activity 啓動入棧後,它顯示在屏幕最前端,處理是處於棧的最頂端(Activity棧頂),此時它處於可見並可和用戶交互的激活狀態,叫做活動狀態或者運行狀態(active or running)。 - Paused
當 Activity失去焦點, 被一個新的非全屏的Activity 或者一個透明的Activity 被放置在棧頂,此時的狀態叫做暫停狀態(Paused)。此時它依然與窗口管理器保持連接,Activity依然保持活力(保持所有的狀態,成員信息,和窗口管理器保持連接),但是在系統內存極端低下的時候將被強行終止掉。所以它仍然可見,但已經失去了焦點故不可與用戶進行交互。 - Stopped
如果一個Activity被另外的Activity完全覆蓋掉,叫做停止狀態(Stopped)。它依然保持所有狀態和成員信息,但是它不再可見,所以它的窗口被隱藏,當系統內存需要被用在其他地方的時候,Stopped的Activity將被強行終止掉。 - Killed
如果一個Activity是Paused或者Stopped狀態,系統可以將該Activity從內存中刪除,Android系統採用兩種方式進行刪除,要麼要求該Activity結束,要麼直接終止它的進程。當該Activity再次顯示給用戶時,它必須重新開始和重置前面的狀態。
三. Activity的創建
- 創建對應的佈局
- 創建一個類去繼承Activity或者其子類
可以創建一個Activity的子類,做一些公共的事情,讓所有Activity繼承他!! - 重寫onCreate生命週期方法
- onCreate方法中,添加setContentView方法,參數可以是layout中寫好的佈局,也可以是在java代碼中添加的view
- 在清單文件中註冊
注意:在清單文件中<activity>的name屬性是隱藏了包名
<activity android:name="com.yjh.createactivity.and_createactivity.SecondActivity"/>
在實際開發中最好是寫全路徑的名稱,以防止activity創建在其他包下導致頁面跳轉失敗
四. Activity生命週期
1、一個Activity的創建和銷燬生命週期
--當Activity運行時所走的生命週期
當Activity初次運行的時候:onCreate() --> onStart() --> onResume
當Activity銷燬的時候:onPause() --> onStop() --> onDestory()
當點擊了菜單鍵,Activity被切換到了後臺後又被切換到前臺,重新獲取焦點的時候:
onPause() --> onStop() --> onRestart() --> onStart() --> onResume()
2、可見和前端生命週期
可見的生命週期 (onStart() -----> onStop)兩者之間都是可見的,但是不包括這兩個方法
前端生命週期 (onResume -----> onPause)兩者之間都是在最前端的,可與用戶交互
onStart()在Activity即將對用戶可見之前是調用
onStop()
3、兩個Activity切換,所走的生命週期
onPause() 暫停 當頁面失去焦點的時候調用的生命週期! 可能預示着用於不會再回來了,需要保留用戶的頁面的數據!
注意:onPause()方法中,不能做耗時操作!
原因:因爲第一個頁面只有當第一個onPause()執行完畢後纔會創建下一個頁面!如果做耗時操作,影響下一個頁面的跳出
降低用戶體驗度!!
4、 生命週期如何使用: 合理利用生命週期 讓程序開發更靈活更強大
onCreate:全局變量的初始化、 layout加載
onstart:註冊廣播
onResume :生命優先級最高
onPause:可以保存一些數據,******但是必須是耗時操作小的動作!!!!!
如果做過多耗時操作,影響下一個頁面開啓
onStop:可以做一下輕量級的耗時操作,去保存數據!!
onDestory: 釋放資源、 全局變量置空
5、發生異常時候的生命週期
橫豎屏的切換!!!
思考 手機橫豎屏切換回影響生命週期嗎?
答:會!會銷燬當前頁面,並且重新加載!!
現場保護:在發生異常的時候,保存之前的狀態
1、不讓生命週期重新執行
android:configChanges="orientation|screenSize|keyboardHidden"
2、把屏幕的方向直接控制住 水平或者垂直
landscape 水平
portrait 垂直
3、發生異常在對應的方法中
onSaveInstanceState 在onPause方法之後調用,我們可以進行數據的保存!!
onRestoreInstanceState 在重啓後onStart方法進行調用,我們可以拿出保留的數據!!
五. Activity基本頁面跳轉及傳值
1、頁面跳轉
實現界面跳轉的四種方式(顯示意圖):
方式一:Intent(Context, Class<?>)
// 參數一:上下文;參數二:目的界面對應的Class的實例
startActivity(new Intent(this, NewActivity.class));
方式二:intent.setClassName(packageContext, className);
// 參數一:上下文;參數二:目的界面對應的類的全限定名
Intent intent = new Intent();
intent.setClassName(this, "com.pinkcandy.day07_03_activitycreatedemo.NewActivity");
startActivity(intent);
方式三:intent.setClassName(packageName, className)
// 參數一:源界面的包名;參數二:目的界面對應的類的全限定名
Intent intent = new Intent();
intent.setClassName(getPackageName(), "com.l000phone.day07_03_activitycreatedemo.NewActivity");
startActivity(intent);
方式四:intent.setClassName(packageName, className)
// 參數一:源界面的包名;參數二:目的界面對應的類的全限定名
Intent intent = new Intent();
ComponentName component = new ComponentName(this, NewActivity.class);
intent.setComponent(component);
startActivity(intent);
2、傳值
1、直接傳值
直接將值放到Intent中 intent.putExtra(key,valuse);
getIntent() 獲取其他頁面傳遞過來的數據
Intent中取值
intent.get類型Extra(key,defultVal)
2、Bundle傳值
直接傳值,在連續多頁面的時候,會比較麻煩,所以我們可以把數據放到Bundle中在進行傳遞!
放值intent.putExtras(Bundle);
取值Bundle bundle = intent.getExtras ();
3、傳遞對象
傳遞對象需要利用 1 2 種方法,需要對象類序列化 實現Serializable
4、利用Application傳值
1、創建一個類來繼承Application
2、在清單文件中,application標籤下聲明 android:name屬性 並指向Application
如何獲取Application中的對象!!
getApplication() 單例模式可以獲取對象,賦值或者取值
奇葩的寫法:(不推薦)
將靜態屬性的特徵發揮到極致,設計一個全局類,該類中所有的屬性都是public static的全局變量。
跳轉至其他程序:
//利用顯示意圖,跳轉到其他程序的Activity
Intent intent3 = new Intent();
//注意:目標程序已經在手機安裝過
//參數1: 目標程序的包名 (清單文件中)
//參數2: 目標程序Activity的全路徑
ComponentName componentName = new ComponentName("com.example.android_day06_launch02", "com.example.android_day06_launch02.MainActivity" );
intent3.setComponent(componentName);
startActivity(intent3);
六. 啓動Activity回傳數據
Activity具有返回值的頁面跳轉
需求:用戶登錄界面,根據用戶的賬號和姓名進行登錄操作,數據傳遞到目的界面後,目的界面進行check,若與後臺保存的信息吻合,就向源界面提示
“登錄成功信息!”,否則,就提示“登錄失敗信息!”。
請求碼的作用:
用來標識源界面上到底是哪個控件觸發的界面跳轉事件
結果碼的作用:
用來標識目的界面上到底是哪個控件觸發數據回傳的動作。
1.在首頁跳轉時添加請求碼
//跳轉頁面並要求返回值
//參數1: 意圖
//參數2: 請求碼 區分請求
startActivityForResult(intent, REQUEST_CODE);
2.第二個頁面設置結果
Intent intent = new Intent();
intent.putExtra("data", "我是第二個頁面傳遞的數據");
setResult( RESULT_OK, intent);
finish(); //關閉當前頁面
3.第一個頁面獲取結果(重寫回調方法onActivityResult)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 進行邏輯操作
}
七. Activity啓動模式及Intent屬性的特點及用法
詳解Activity啓動模式
Intent屬性的特點及用法
後期進行詳細介紹