【Android 应用开发】Activity生命周期 与 Activity 之间的通信
一. Activity生命周期
上圖
1. Activity狀態
激活狀態 : Activity出于前臺 , 棧頂位置;
暫停狀態 : 失去了焦點 , 但是用戶仍然可以看到 , 比如彈出一個對話框 , 后面的Activity出于暫停狀態;
停止狀態 : 被其它的Activity覆蓋 , 用戶不可見 , 但是仍然存在;
2.Activity操作生命周期的方法
onCreate() : 初始化一些成員變量 , 如View等 , 此時進入停止狀態;
onStart() : 被用戶可見之前調用 , 調用之后進入暫停狀態 , 如果不滿足條件我們不想讓用戶進入應用 , 可以在這里進行限制 , finish掉該Activity;
onResume() : 在與用戶交互之前調用 , 調用之后進入激活狀態;
onPause() : 激活另一個Activity時調用 , 調用之后進入暫停狀態 , 界面可見 , 失去焦點; 該操作用來保存當前Activity數據;
onStop() : Activity被覆蓋前調用 , 調用之后該Activity不可見; 該方法用來關閉舊的Activity , 注意是完全不可見的時候才會調用這個方法;
onDestroy() : Activity被銷毀前調用 ;
注意 : 在暫停狀態 和 停止狀態 , 如果內存緊張 , 該Activity會被系統回收;
3.Activity運作流程
(1)第一次啟動Activity A ?
首先調用onCreate()方法創建Activity進入停止狀態 -> 調用onStart()方法進入暫停狀態 -> 調用onResume()方法進入激活狀態;?
(2)從Activity A 跳轉到 Activity B?
A先執行onPause()方法進入暫停狀態 -> B執行onCreate()方法進入停止狀態 -> B執行onStart()方法進入暫停狀態 -> B執行onResume()方法進入激活狀態 -> A被完全覆蓋執行onStop()方法進入停止狀態;
(3)從ActivityB 回到 Activity A
B執行onPause()方法進入暫停狀態 -> A調用onRestart()方法進入停止狀態 -> A調用onStart()方法進入暫停狀態 -> A調用onResume()方法進入激活狀態 -> B被覆蓋調用onStop()方法進入停止狀態 -> B執行onDestroy()方法銷毀
這里注意Activity的棧是不可逆的 , 只能后退 , 不能前進 , 回退后 , 原來的棧頂的Activity就馬上銷毀了.
二.?Activity之間的通信
1. Intent傳遞參數的方式
intent傳遞參數有兩種方式 :?
注意 : 在onCreate()方法中創建Intent的時候 , 上下文參數不能使用this , 要使用getApplicationContext();
(1)通過Bundle對象傳遞參數
Bundle對象是一個HashMap<String, Object>, 我們將數據存到這個Bundle對象中 , 然后將Bundle對象放入到Intent中去.
eg:
Intent intent = new Intent(getApplicationContext(), SecondActivity.class);Bundle bundle = new Bundle();bundle.putString("name", "MainActivity");intent.putExtra("bundle", bundle);startActivity(intent); 注意?:?向bundle中存放數據的時候 , 對于不用的數據類型要調用不同的方法 , String類型就要調用putString()方法 ...
向Intent對象中存放bundle對象的時候 , 直接調用Intent的putExtra()方法即可;
從Intent對象取出數據?:?
取出Bundle對象 : Bundle bundle = intent.getBundleExtra("bundle")方法.
從Bundle中取出數據 :?
String string = bundle.getString("string")獲取字符串數據.
Boolean boolean = bundle.getBoolean("boolean")獲取布爾變量.
(2)直接將數據放入Intent對象
存放時直接調用Intent的putExtra()方法 , 無論什么類型都是這個方法 , 但是取出的時候要調用相應類型的方法 , 如果是boolean類型就調用getBooleanExtra()方法 , 如果是字符串類型就調用getStringExtra()方法 .
Intent intent = new Intent(getApplicationContext(), MainActivity.class);intent.putExtra("name", et_second.getText().toString());startActivity(intent);(3)在跳轉的Activity獲取數據
在Activity中想要取出跳轉之前放入的數據 , 調用Activity的getIntent()方法 , 獲取Intent對象 , 在調用Intent對象的方法獲取數據;
①獲取Bundle對象 , 并從Bundle對象中獲取數據?:?
Bundle bundle = this.getIntent().getBundleExtra("bundle");String name = bundle.getString("name");tv_second.setText(name);注意 : 獲取Bundle對象的方法 : getBundleExtra("key");從Bundle中獲取數據的方法 : bundle.getString("key")調用相應數據類型的方法;
②獲取Intent對象中的數據?:?
String name = this.getIntent().getStringExtra("name");tv_main.setText(name);2. startActivityForResult()方法解析
在創建了Intent之后 , 一般情況下是使用startActivity()啟動另一個Activity , 如果我們需要啟動另外一個Activity , 并且需要將這個Activity中的數據返回的時候 , 就需要調用startActivityForResult()方法啟動Activity;
在Activity A 中啟動另外一個Activity , 需要重寫 A 中的 onActivityResult()方法?, 這個方法是用來處理返回的數據的.
在Activity B 中需要調用setResult()方法?, 設置返回的Intent , 同時注意要finish()掉這個Activity;
相關參數 :?
startActivityForResult(Intent intent, int requestCode) : 第二個參數是請求碼 , 請求碼在 A 中的onActivityResult()方法中識別intent用的;
onActivityResult(int requestCode, int resultCode, Intent intent) : 第一個參數是請求碼 , 第二個參數是結果碼 , 這里我們只需要識別一種就可以 , 也可以兩個都進行識別;
setResult(int resultCode, Intent intent) : 第一個參數是結果碼 , 用于 A 中的onActivityResult()中的Intent對象識別.
注意 : startActivityForResult()方法與setResult()方法的參數順義不一致;
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的【Android 应用开发】Activity生命周期 与 Activity 之间的通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 应用开发】Androi
- 下一篇: 【Android 应用开发】Androi