Android中Intent與Bundle的使用詳解
Intent
Intent是Android程序中個(gè)組件之間進(jìn)行交互的一種重要方式,它不僅可以指明當(dāng)前組件想要執(zhí)行的動(dòng)作,可以指定你想要啟動(dòng)的活動(dòng),也可以在不同組件之間傳遞數(shù)據(jù)。
第一部分:通過(guò)intent來(lái)啟動(dòng)一個(gè)活動(dòng)
Intent 分為顯示和隱式
我們先來(lái)了解一下顯示
其中一個(gè)常用的構(gòu)造方法是:
Intent intent=new Intent(registActivity.this,showActivity.class); //這樣我們構(gòu)造出了一個(gè)Intent
第一個(gè)參數(shù)為Context,要求提供一個(gè)活動(dòng)的上下文(告訴這個(gè)操作你要讓誰(shuí)來(lái)執(zhí)行)
第二個(gè)參數(shù)為class ,則表示你要啟動(dòng)的目標(biāo)(表示你要執(zhí)行哪個(gè)程序)這里是引用
通過(guò)這個(gè)構(gòu)造方法,你就已經(jīng)構(gòu)造好了Intent意圖
接下來(lái)就開(kāi)始使用這個(gè)Intent意圖
通過(guò)startActivity()方法啟動(dòng)目標(biāo)這里是引用
隱式
當(dāng)無(wú)法確定意圖目標(biāo),即目標(biāo)組件名稱時(shí),使用隱式Intent啟動(dòng)。通常用于啟動(dòng)其他應(yīng)用的組件。
例如:隱式Intent啟動(dòng)系統(tǒng)默認(rèn)瀏覽器:
//準(zhǔn)備Intent的data屬性數(shù)據(jù) Uri uri=Uri.parse("http://www.baidu.com"); //設(shè)置Intent的action屬性和data屬性 Intent intent=new Intent(Intent.ACTION_VIEW,uri); //啟動(dòng)目標(biāo)意圖 startActivity(intent);
第二部分:通過(guò)Intent向下一個(gè)活動(dòng)傳遞數(shù)據(jù)
Intent提供了一系列putExtra()方法的重載
相當(dāng)于先把我們想要傳遞的數(shù)據(jù)暫時(shí)存在intent中,當(dāng)我們啟動(dòng)了另一個(gè)活動(dòng)后,只需把這些數(shù)據(jù)再?gòu)腎ntent取出。
private void passdate() { //創(chuàng)建意圖對(duì)象 Intent intent=new Intent(registActivity.this,showActivity.class); //把數(shù)據(jù)存入intent intent.putExtra("name",et_name.getText().toString().trim()); intent.putExtra("password",et_password.getText().toString().trim()); //開(kāi)啟意圖 startActivity(intent); }
注意:通過(guò)顯示意圖啟動(dòng)了showActivity,并通過(guò)putExtra()方法傳遞一個(gè)字符串,putExtra()方法接收兩個(gè)參數(shù),第一個(gè)參數(shù)是鍵:用于后面intent中的取值,第二個(gè)參數(shù)才是我們真正想要傳遞的數(shù)據(jù)
//獲得開(kāi)啟頁(yè)面的意圖對(duì)象 Intent intent=getIntent(); //根據(jù)key取出對(duì)應(yīng)的value值 String name=intent.getStringExtra("name"); String password=intent.getStringExtra("password"); //把用戶名和密碼展示到控件上(覆蓋到控件的位置上) TextView tv_name=(TextView) findViewById(R.id.tv_name); TextView tv_password=(TextView) findViewById(R.id.tv_psw); tv_name.setText(name); tv_password.setText(password);
- 首先獲取上一個(gè)活動(dòng)的intent對(duì)象,通過(guò)getIntent()方法獲取啟動(dòng)showActivity的intent
- 然后調(diào)用getStringExtra方法,傳入相應(yīng)的鍵值,就可獲取傳遞的數(shù)據(jù)
- 如果你想傳遞的是整形則getIntExtra()方法獲取數(shù)據(jù),以此類推
- 最后,通過(guò)setText()開(kāi)始執(zhí)行,把我們的數(shù)據(jù)展示在控件的位置上
第三部分:返回?cái)?shù)據(jù)給上一個(gè)活動(dòng)
我們通常使用startActivityForResult()方法,這個(gè)方法也是用于啟動(dòng)活動(dòng),只不過(guò)他能夠在活動(dòng)銷毀后,返回一個(gè)結(jié)果給上一個(gè)活動(dòng)
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final EditText editText1 = (EditText) findViewById(R.id.et_name); Button button1 = (Button) findViewById(R.id.button); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, showActivity.class); Bundle bundle = new Bundle(); bundle.putCharSequence("name", (CharSequence) editText1.getText().toString()); //通過(guò)bundle來(lái)保存數(shù)據(jù) intent.putExtras(bundle); startActivityForResult(intent, 1);//和startActivity很像,就多了個(gè)請(qǐng)求碼用于后面判斷數(shù)據(jù)來(lái)源 } });
startActivity()方法接收兩個(gè)參數(shù),第一個(gè)參數(shù)是Intent,第二個(gè)參數(shù)是請(qǐng)求碼,用于之后回調(diào)判斷數(shù)據(jù)來(lái)源
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_show); final EditText editText2= (EditText) findViewById(R.id.show_name); Button button2=(Button) findViewById(R.id.show_button); //獲取上個(gè)活動(dòng)的intent和bundle Intent intent=getIntent(); Bundle bundle=intent.getExtras(); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(showActivity.this,MainActivity.class); Bundle bundle=new Bundle(); bundle.putCharSequence("edit",(CharSequence) editText2.getText().toString()); intent.putExtras(bundle); //setResult方法用于給上一個(gè)活動(dòng)傳遞數(shù)據(jù),第一個(gè)參數(shù)是返回上一個(gè)活動(dòng)的結(jié)果,第二個(gè)參數(shù)是將帶有數(shù)據(jù)的intent傳過(guò)去 setResult(1,intent); finish(); } }); }
在showActiviity活動(dòng)中,也構(gòu)建了一個(gè)Intent,這個(gè)Intent是用來(lái)傳遞數(shù)據(jù),
通過(guò)調(diào)用setResult()方法專門給上一個(gè)活動(dòng)返回?cái)?shù)據(jù),setResult()方法接收兩個(gè)參數(shù),第一個(gè)參數(shù):用于向上一個(gè)活動(dòng)返回處理結(jié)果,一般使用RESULT_OK或RESULT_CANCELED兩個(gè)值,第二個(gè)參數(shù)則將帶有數(shù)據(jù)的Intent傳遞回去,最后通過(guò)finish()銷毀當(dāng)前的活動(dòng)
//在showActivity中的finish被銷毀后,會(huì)回調(diào)上 一個(gè)活動(dòng)的onActivityResult()方法,因此我們要在MainActivity里重寫這個(gè)方法 @Override //requestCode就是我們啟動(dòng)時(shí)傳入的請(qǐng)求碼,resultCode是返回?cái)?shù)據(jù)時(shí)傳入的,data攜帶返回?cái)?shù)據(jù)的intent protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case 1: if (resultCode == RESULT_FIRST_USER) {//通過(guò)請(qǐng)求碼來(lái)判斷數(shù)據(jù)的來(lái)源 et_name = (EditText) findViewById(R.id.et_name); et_name.setText(data.getStringExtra("edit"));//從data中取值并輸出 //通過(guò)getStringExtra來(lái)獲取傳遞的數(shù)據(jù) } break; default: } }
由于我們是使用startActivity()方法來(lái)啟動(dòng)SecondActivity的,在SecondActivity被銷毀后就會(huì)回調(diào)上一個(gè)活動(dòng)的onActivityResult()方法,所以我們要在上一個(gè)活動(dòng)中重寫這個(gè)方法得到返回?cái)?shù)據(jù)。
OnActivityResult()方法帶有三個(gè)參數(shù),=第一個(gè)參數(shù)requestCode,啟動(dòng)活動(dòng)的請(qǐng)求碼,第二個(gè)參數(shù)resultCode,返回?cái)?shù)據(jù)的處理結(jié)果,第三個(gè)參數(shù),攜帶返回?cái)?shù)據(jù)的intent,由于一個(gè)活動(dòng)有可能會(huì)調(diào)用startActivityForResult()去啟動(dòng)很多不同的活動(dòng),每一個(gè)活動(dòng)都會(huì)返回?cái)?shù)據(jù)回調(diào)onActivityResult()這個(gè)方法,所以為了安全一般使用Switch語(yǔ)句來(lái)進(jìn)行判斷
通過(guò)resquestCode判斷數(shù)據(jù)來(lái)源,resultCode判斷處理結(jié)果是否成功,最后通過(guò)data中取值并打印出來(lái)
android中Intent和Bundle之間的關(guān)系
打個(gè)比方: 中國(guó)向美國(guó)海運(yùn)箱裝的水果
中國(guó)就是Activity1,美國(guó)是Activity2, 海運(yùn)則是 Intent,裝水果的箱子則是bundle,箱子上的編號(hào)就時(shí)key,水果就時(shí)data。
中國(guó)通過(guò)new一個(gè)intent對(duì)象指定意圖為 海運(yùn)到美國(guó) ,通過(guò)putExtras把箱裝的水果放至海運(yùn)的路上。
美國(guó)先要通過(guò)getIntent的方法獲取海運(yùn)的對(duì)象,然后通過(guò)getExtras獲得箱子,再根據(jù)箱子上的編號(hào)獲得水果。
如果Intent傳遞的數(shù)據(jù)只有一個(gè),那么就直接用Intent的putExtra()方法直接放進(jìn)參數(shù)即可。那如果Intent需要傳遞的是好幾個(gè)參數(shù),或者是一個(gè)類,那么這時(shí)候就需要用到Bundle
到此這篇關(guān)于Android中Intent與Bundle的使用詳解的文章就介紹到這了,更多相關(guān)Android Intent與Bundle內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android判斷現(xiàn)在所處界面是否為home主桌面的方法
這篇文章主要介紹了Android判斷現(xiàn)在所處界面是否為home主桌面的方法,涉及Android界面判斷的相關(guān)技巧,需要的朋友可以參考下2015-05-05詳解Kotlin Android開(kāi)發(fā)中的環(huán)境配置
這篇文章主要介紹了詳解Kotlin Android開(kāi)發(fā)中的環(huán)境配置的相關(guān)資料,需要的朋友可以參考下2017-06-06Android實(shí)現(xiàn)左滑關(guān)閉窗口
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)左滑關(guān)閉窗口,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04Android仿天貓橫向滑動(dòng)指示器功能的實(shí)現(xiàn)
這篇文章主要介紹了Android仿天貓橫向滑動(dòng)指示器,Android開(kāi)發(fā)中會(huì)有很多很新奇的交互,比如天貓商城的首頁(yè)頭部的分類,使用的是GridLayoutManager+橫向指示器實(shí)現(xiàn)的,需要的朋友可以參考下2022-08-08ListView上滑和下滑,顯示和隱藏Toolbar的實(shí)現(xiàn)方法
下面小編就為大家分享一篇ListView上滑和下滑,顯示和隱藏Toolbar的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01Flutter禁止手機(jī)橫屏的簡(jiǎn)單實(shí)現(xiàn)方法
app默認(rèn)是可以橫屏的,如果需要禁止橫屏話可以參考這篇文章,本文主要給大家介紹了關(guān)于Flutter禁止手機(jī)橫屏的簡(jiǎn)單實(shí)現(xiàn)方法,需要的朋友可以參考下2021-07-07Android開(kāi)發(fā)實(shí)現(xiàn)布局中為控件添加選擇器的方法
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)布局中為控件添加選擇器的方法,涉及Android開(kāi)發(fā)中布局設(shè)置的相關(guān)操作技巧,需要的朋友可以參考下2017-10-10Framework源碼面試之a(chǎn)ctivity啟動(dòng)流程
這篇文章主要為大家介紹了Framework源碼面試之a(chǎn)ctivity啟動(dòng)流程實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Android 虛擬按鍵適配動(dòng)態(tài)調(diào)整布局的方法
今天小編就為大家分享一篇Android 虛擬按鍵適配動(dòng)態(tài)調(diào)整布局的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07