title: Intent的使用
date: 2019-08-23 16:43:59
tags: android
如何使用Intent打開(kāi)新Activity以及實(shí)現(xiàn)Activity之間的數(shù)據(jù)傳遞
Intent的一個(gè)重要作用就是遮婶,打開(kāi)Activity以及作為不同Activity之間數(shù)據(jù)傳送的載體旗扑。
如何在MainActivity中打開(kāi)一個(gè)新的Activity
Activity類(lèi)有個(gè)方法叫startActivity(Intent intent)臀防,我們可以用它來(lái)啟動(dòng)一個(gè)新的activity边败。
Intent intent = new Intent(Context, Class);
// Context 傳一個(gè)上下文,一般傳當(dāng)前的Activity
// Class 傳你要打開(kāi)的activity的類(lèi)
startActivity(intent);
例:點(diǎn)一下按鈕就打開(kāi)一個(gè)新頁(yè)面
Button btn = findViewById(R.id.btn_go_to_second_activity);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 這里相當(dāng)于內(nèi)部類(lèi)致燥,調(diào)用外部類(lèi)的時(shí)候篡悟,要用 外部類(lèi)名.this 來(lái)調(diào)用
Toast.makeText(FirstActivity.this, "Intent to SecondActivity", Toast.LENGTH_SHORT).show();
// 這里使用的是Intent的顯式用法
// 按下按鈕就打開(kāi)SecondActivity
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}
});
以上是所謂的Intent顯式用法匾寝,除此之外艳悔,還有一種所謂的隱式用法女仰。
使用隱式用法需要在AndroidManifest.xml中配置要打開(kāi)的activity的intent-filter
在啟動(dòng)新活動(dòng)的時(shí)候,只有Intent里的action和category與目標(biāo)活動(dòng)中配置的相匹配才能成功打開(kāi)乔外。
例:我在第二個(gè)活動(dòng)設(shè)置一個(gè)按鈕杨幼,點(diǎn)一下回到第一個(gè)活動(dòng),只是這一次使用隱式用法差购。
<activity
android:name=".FirstActivity"
android:label="@string/FirstActivityLabel">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<!-- 在這里 添加action -->
<action android:name="com.konka.GO_BACK_TO_FIRST_ACTIVITY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
Intent intent = new Intent("com.konka.GO_BACK_TO_FIRST_ACTIVITY");
startActivity(intent);
}
});
這里沒(méi)有設(shè)置category,系統(tǒng)就使用默認(rèn)值 android.intent.category.DEFAULT 了饼暑。
如果你不用默認(rèn)值的話洗做,你可以用intent.addCategory()方法來(lái)添加category竭望。
個(gè)人認(rèn)為咬清,隱式用法是一種更好的方法奴潘,因?yàn)楸容^方便維護(hù)
如何通過(guò)Intent來(lái)傳遞數(shù)據(jù)呢?
Intent intent = new Intent(FirstActivity.this, ThirdActivity.class);
// putExtra(String key, String/int/boolean value)
// 這個(gè)方法能將數(shù)據(jù)打包進(jìn)intent里面
// 在新活動(dòng)里使用getIntent().getStringExtra(Sring key)獲得傳過(guò)去的數(shù)據(jù)
intent.putExtra("FirstData", "1ST HELLO WORLD");
startActivity(intent);
// startActivityForResult(Intent intent, int requestCode)
// 這個(gè)方法的作用也是打開(kāi)新活動(dòng)掘剪,但是要求新活動(dòng)銷(xiāo)毀時(shí)返回?cái)?shù)據(jù)夺谁。
// requestCode是用來(lái)識(shí)別返回的數(shù)據(jù)是來(lái)自哪一個(gè)活動(dòng)的匾鸥,只要唯一就好碉纳。
在打開(kāi)的新活動(dòng)里劳曹,用getIntent()得到一個(gè)Intent對(duì)象,調(diào)用getStringExtra()方法锭硼,能取得傳過(guò)來(lái)的數(shù)據(jù)蜕劝。如果傳的是int或boolean型就用對(duì)應(yīng)的getIntExtra()和getBooleanExtra()方法獲取就好熙宇。
例:
Intent intent = getIntent();
Log.d(TAG, "onCreate: " + intent.getStringExtra("FirstData"));
如果要在這個(gè)活動(dòng)銷(xiāo)毀的時(shí)候返回?cái)?shù)據(jù)給上一個(gè)活動(dòng),那么上一個(gè)活動(dòng)得使用startActivityForResult()來(lái)打開(kāi)這個(gè)活動(dòng)蒋荚。
在這個(gè)活動(dòng)期升,可以重寫(xiě)onBackPressed()方法
@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra("DataReturn", "I AM BACK");
setResult(RESULT_OK, intent);
finish();
}
這里的重點(diǎn)是要使用setResult()方法將intent傳進(jìn)去。
setResult(int resultCode, Intent data)
由于使用onActivityForResult()來(lái)打開(kāi)新活動(dòng)播赁,新活動(dòng)被銷(xiāo)毀之后會(huì)回調(diào)上一個(gè)活動(dòng)的onActivityResult()方法容为。因此我們要重寫(xiě)這個(gè)方法來(lái)獲取傳過(guò)來(lái)的數(shù)據(jù)坎背。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
switch (requestCode){
case 3:
if (resultCode == RESULT_OK){
String returnedData = data.getStringExtra("DataReturn");
Log.d(TAG, "onActivityResult: "+ returnedData);
}
break;
default:
}
}
參考書(shū)
《第一行代碼 Android》