Android開發(fā) Activity和Fragment詳解
1.Activity的生命周期
1)多個Activity組成Activity棧,當前活動位于棧頂。我們先來看看各種Activity基類的類圖:

當Activity類定義出來之后,這個Activity何時被實例化、它所包含的方法何時被調(diào)用,這些都不是由開發(fā)者所決定的,都應該由Android系統(tǒng)來決定。
下面我們來看一下Activity的生命周期:

2.Activity的用法
1)啟動、關閉Activity
// 首先需要創(chuàng)建啟動的Activity對應的Intent Intent intent = new Intent(MainActivity.this, TwoActivity.class); // 啟動Activity startActivity(Intent intent); startActivityForResult(Intent intent, int requestCode); // requestCode:請求碼 //startActivityForResult方法以指定的請求碼啟動Activity,并通過重寫onActivityResult方法獲取返回的結(jié)果。 // 關閉Activity finish(); finishActivity(int requestCode); // finishActivity方法結(jié)束以startActivityForResult方法啟動的Activity。
2)啟動其他Activity并返回結(jié)果
當前Activity重寫onActivityResult(int requestCode, int resultCode, Intent intent)
requestCode:請求碼(指出該方法是從哪個請求的結(jié)果觸發(fā)的)
resultCode:Activity返回的結(jié)果碼(指出返回的數(shù)據(jù)來自于哪個新的Activity)
被啟動的Activity需要調(diào)用setResult()方法設置處理結(jié)果。
實例:
在當前Activity中重寫onActivityResult方法
public class MainActivity extends Activity {
Button bn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 獲取界面上的組件
...
// 綁定事件監(jiān)聽器
bn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, TwoActivity.class);
startActivityForResult(intent, 0); // 0是請求碼,用于標識該請求
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
// 處理特定的結(jié)果
if (requestCode == 0 && resultCode == 0) {
// 取出Intent里的Extras數(shù)據(jù)
Bundle data = intent.getExtras();
// 取出Bundle中的數(shù)據(jù)
String result = data.getString("test");
Toast.makeText(getApplicationContext(), result, 0).show();
}
}
}
然后在被啟動的TwoActivity中調(diào)用setResult()方法設置處理結(jié)果
// 獲取啟動該Activity之前的Activity對應的Intent
Intent intent = getIntent();
intent.putExtra("test", "test");
// 設置該SelectActivity的結(jié)果碼,并設置結(jié)束之后退回的Activity
SelectCityActivity.this.setResult(0, intent);
// 結(jié)束TwoActivity
TwoActivity.this.finish();
3.使用Bundle在Activity之間交換數(shù)據(jù)
Intent提供了多個重載的方法來“攜帶”額外的數(shù)據(jù),如下:
intent.putExtras(Bundle data); // 向Intent放入數(shù)據(jù)包 intent.putExtras(String name, Xxx value); // 向Intent中按key-value對的形式放入數(shù)據(jù) intent.getExtras(); // 取出Intent中攜帶的數(shù)據(jù)包 intent.getXxxExtras(String name); //從Intent中按key取出指定類型的數(shù)據(jù)
上面方法中Bundle就是一個簡單的數(shù)據(jù)攜帶包,Intent主要通過Bundle對象來攜帶數(shù)據(jù),Bundle包含多個方法來存取數(shù)據(jù):
Bundle bundle = new Bundle(); // 首先創(chuàng)建一個Bundle對象 bundle.putXxx(String key, Xxx data); // 向Bundle中放入數(shù)據(jù) bundle.putSerializable(String key, Serializable data); // 向Bundle中放入一個可序列化的對象(即實現(xiàn)了java.io.Serializable接口) bundle.getXxx(String key); // 從Bundle中取出數(shù)據(jù) bundle.getSerializable(String key); // 從Bundle中取出一個可序列化的對象
4.Activity的四種加載模式
配置AndroidManifest.xml中Activity時,可指定android:launchMode屬性用于配置該Activity的加載模式,該屬性支持4個屬性值:
standard:標準模式;
singleTop:棧頂單例模式;
singleTask:棧內(nèi)單例模式(如果目標Activity已經(jīng)存在、但沒有位于棧頂,系統(tǒng)會把位于該Activity上面的所有Activity移出Task棧,從而使目標Activity轉(zhuǎn)入棧頂);
singleInstance:全局單例模式(新創(chuàng)建Activity將放入新棧,一個棧只包含一個Activity,如果目標Activity已經(jīng)存在,系統(tǒng)會把該Activity所在Task轉(zhuǎn)到前臺顯示出來)。
5.Fragment的生命周期
Fragment是AndroiD3.0引入的新API,F(xiàn)ragment代表Activity子模塊(Activity片段),F(xiàn)ragment必須嵌入到Activity中使用,F(xiàn)ragment的生命周期受它所在Activity的生命周期的控制。
Fragment可調(diào)用getActivity()方法獲取它所在Activity;
Activity可調(diào)用FragmentManager的findFragmentById()或findFragmentByTag()方法獲取Fragment;
在Activity運行過程中,可調(diào)用FragmentManager的add()、remove()、replace()方法動態(tài)的添加、刪除和替換Fragment。
1)我們先來看看各種Fragment基類的類圖:

2)下面我們來看一下Fragment的生命周期,并和Activity的生命周期做對比:


6.Fragment的用法
1)創(chuàng)建Fragment
創(chuàng)建Fragment通常要實現(xiàn)如下三個方法:
onCreate()、onCreateView()、onPause()
為了控制Fragment顯示的組件,通常需要重寫onCreateView()方法,該方法返回的View將作為該Fragment顯示的View組件。
// 重寫該方法,該方法返回的View將作為Fragment顯示的組件
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// 加載/res/layout/目錄下的fragment.xml布局文件
View view = inflater.inflate(R.layout.fragment, container, false);
TextView name = (TextView)view.findViewById(R.id.name));
...
return view;
}
2)將Fragment添加到Activity
將Fragment添加到Activity有如下兩種方式:
第1種:在布局文件中使用<fragment.../>元素添加Fragment,<fragment.../>元素的android:name屬性指定Fragment的實現(xiàn)類。
第2種:在Java代碼中通過FragmentTransaction對象的add()方法來添加Fragment。
Activity的getFragmentManager()方法可返回FragmentManager,F(xiàn)ragmentManager對象的beginTransaction()方法即可開啟并返回FragmentTransaction對象。
3)如何在Activity中動態(tài)的添加、更新、以及刪除Fragment呢?
首先需要在MainActivity布局文件中添加FrameLayout(設置id為fl),然后簡單創(chuàng)建一個兩個Fragment(MyFragment和TwoFragment)如下:
public class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_my, container, false);
}
}
public class TwoFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_two, container, false);
}
}
接下來就可以在MainActivity中動態(tài)的添加、更新、以及刪除Fragment了,MainActivity中調(diào)用的方法如下:
// 設置默認的Fragment FragmentManager fm = getFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); myFragment = new MyFragment(); transaction.replace(R.id.fl, myFragment); transaction.commit();
假設點擊某按鈕更新Fragment,該按鈕點擊事件如下:
@Override
public void onClick(View v) {
FragmentManager fm = getFragmentManager();
// 開啟Fragment事務
FragmentTransaction transaction = fm.beginTransaction();
twoFragment = new TwoFragment();
// 使用當前Fragment的布局替代fl的控件
transaction.replace(R.id.fl, twoFragment);
// transaction.addToBackStack(); // 將事物添加到back棧,允許用戶按BACK按鍵返回到替換Fragment之前的狀態(tài)
// 事務提交
transaction.commit();
}
以上就是對Android Activity和Fragment 的資料整理,后續(xù)繼續(xù)補充相關資料,謝謝大家對本站的支持!
- Android基礎之Fragment與Activity交互詳解
- Android 管理Activity中的fragments
- Android中fragment與activity之間的交互(兩種實現(xiàn)方式)
- Android中Fragment與Activity的生命周期對比
- Android Fragment與Activity之間的相互通信實例代碼
- 詳解Android activity與fragment之間的通信交互
- Android基礎之使用Fragment控制切換多個頁面
- Android中fragment嵌套fragment問題解決方法
- Android程序開發(fā)之Fragment實現(xiàn)底部導航欄實例代碼
- Android的Fragment的生命周期各狀態(tài)和回調(diào)函數(shù)使用
- android開發(fā)教程之實現(xiàn)滑動關閉fragment示例
- Android開發(fā)教程之Fragment定義、創(chuàng)建與使用方法詳解【包含Activity通訊,事務執(zhí)行等】
相關文章
Android 5.0+ 屏幕錄制實現(xiàn)的示例代碼
這篇文章主要介紹了Android 5.0+ 屏幕錄制實現(xiàn)的示例代碼,從 5.0 開始,系統(tǒng)提供給了 app 錄制屏幕的一系列方法,不需要 root 權(quán)限,只需要用戶授權(quán)即可錄屏,相對來說較為簡單,感興趣的小伙伴們可以參考一下2018-05-05
Android自定義View實現(xiàn)照片裁剪框與照片裁剪功能
這篇文章主要介紹了Android自定義View實現(xiàn)照片裁剪框與照片裁剪功能的相關資料,需要的朋友可以參考下2016-07-07
基于RecyclerView實現(xiàn)橫向GridView效果
這篇文章主要為大家詳細介紹了基于RecyclerView實現(xiàn)橫向GridView效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07
Android NDK生成及連接靜態(tài)庫與動態(tài)庫的方法
這篇文章主要介紹了Android NDK生成及連接靜態(tài)庫與動態(tài)庫的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08
Android檢測Activity或者Service是否運行的方法
下面小編就為大家分享一篇Android檢測Activity或者Service是否運行的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03
android開發(fā)教程之文本框加滾動條scrollview
EditText與TextView加上滾動條其實很簡單,只需要在文本輸入框或者文本顯示框上面加上滾動條控件即可2014-02-02
Android WebView如何判定網(wǎng)頁加載的錯誤
這篇文章主要介紹了Android WebView如何判定網(wǎng)頁加載的錯誤,幫助大家更好的理解和學習使用Android,感興趣的朋友可以了解下2021-04-04
Kotlin StateFlow單數(shù)據(jù)更新熱流設計與使用介紹
StateFlow當值發(fā)生變化,就會將值發(fā)送出去,下流就可以接收到新值。在某些場景下,StateFlow比LiveData更適用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2022-09-09
Android TextView的TextWatcher使用案例詳解
這篇文章主要介紹了Android TextView的TextWatcher使用案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08

