使用Intent實(shí)現(xiàn)Activity跳轉(zhuǎn)的兩種方式
1. 使用startActivity(intnet)
方法實(shí)現(xiàn)無回傳數(shù)據(jù)的Activity跳轉(zhuǎn):
使用方法:
為實(shí)現(xiàn)跳轉(zhuǎn)動(dòng)作的控件綁定監(jiān)聽器扫尖,在點(diǎn)擊事件中使用startActivity
跳轉(zhuǎn)到目標(biāo)Activity即可膊夹。
代碼示例如下:
button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FActivity.this,SActivity.class);
startActivity(intent);
}
});
2. 使用StartActivityForResult(intent, requestCode)
方法實(shí)現(xiàn)有回傳數(shù)據(jù)的Activity跳轉(zhuǎn):
使用方法:
- 為實(shí)現(xiàn)跳轉(zhuǎn)動(dòng)作的控件綁定監(jiān)聽器,在點(diǎn)擊事件中實(shí)現(xiàn)
StartActivityForResult(intent, requestCode)
方法婆瓜。 - 在目標(biāo)Activity為實(shí)現(xiàn)數(shù)據(jù)回傳的控件綁定監(jiān)聽器,并實(shí)現(xiàn)
setResult(resultCode,data)
方法。 - 在原Activity中重寫
onActivityResult(int requestCode, int resultCode, Intent data)
方法廉白。
方法詳解:
-
StartActivityForResult(intent,requestCode)
使用這個(gè)方法從當(dāng)前Activity跳轉(zhuǎn)到另一個(gè)Activity个初。該方法需要兩個(gè)參數(shù),一個(gè)是intent對象猴蹂,一個(gè)是requesCode勃黍。intent對象在當(dāng)前Activity中實(shí)例好,requestCode參數(shù)是當(dāng)前方法的請求碼晕讲,定義一個(gè)請求碼作為當(dāng)前跳轉(zhuǎn)方法的標(biāo)識覆获。 -
setResult(resultCode,data)
方法需要兩個(gè)參數(shù),一個(gè)是resultCode瓢省,定義一個(gè)resultCode作為當(dāng)前目標(biāo)Activity的標(biāo)識弄息。另一個(gè)是data,是當(dāng)前目標(biāo)Activit的intent對象勤婚,也是存放回傳數(shù)據(jù)的容器摹量,回傳到第一個(gè)Activity的實(shí)際上就是一個(gè)Intent對象,將數(shù)據(jù)攜帶在這個(gè)intent對象中回傳過去馒胆。 -
onActivityResult(int requestCode, int resultCode, Intent data)
這個(gè)方法用來接收從目標(biāo)Activity中返回來的數(shù)據(jù)缨称,該方法需要3個(gè)參數(shù),第一個(gè)是requestCode祝迂,第二個(gè)是resultCode睦尽,通過requestCode和resultCode可以確定接收哪一個(gè)StartActivityForResult方法和哪一個(gè)目標(biāo)Activity返回來的數(shù)據(jù),data參數(shù)用來接收目標(biāo)Activity返回的數(shù)據(jù),實(shí)際上也就是接收回傳回來的那個(gè)Intent對象型雳,讀出其中攜帶的數(shù)據(jù)当凡。
下面用一個(gè)Demo來詳細(xì)說明這兩種方法的具體用法:
- 首先我們需要兩個(gè)Layout,分別命名為flayout和slayout纠俭。
flayout如下:
<LinearLayout xmlns:
android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/bt1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:text="第一種啟動(dòng)方式" />
<Button
android:id="@+id/bt2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:text="第二種啟動(dòng)方式" />
<TextView
android:id="@+id/tv"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:textSize="20sp"
android:text="這里顯示第二個(gè)頁面回傳的數(shù)據(jù)" />
</LinearLayout>
我在flayout中定義了兩個(gè)Button用于對應(yīng)兩種不同的跳轉(zhuǎn)方式沿量,一個(gè)TextView用于顯示第二個(gè)Avtivity中回傳過來的數(shù)據(jù)。
slayout如下:
<LinearLayout xmlns:
android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:text="發(fā)送回傳數(shù)據(jù)"
android:id="@+id/button"/>
</LinearLayout>
在slayout中定義了一個(gè)Button冤荆,由于目標(biāo)Activity中回傳數(shù)據(jù)是被動(dòng)式的朴则,只有在我們觸發(fā)回傳動(dòng)作的時(shí)候,目標(biāo)Activity才會將數(shù)據(jù)傳遞給第一個(gè)Activity钓简,所以我們需要在這里定義一個(gè)Button乌妒,用于傳送數(shù)據(jù)。
- 然后我們開始編寫對應(yīng)的Activity涌庭,分別為FActivity和SActivity芥被。
FActivity如下:
public class FActivity extends AppCompatActivity {
private Button bt1;
private Button bt2;
private TextView tv;
//由于使用匿名內(nèi)部類的方式實(shí)現(xiàn)監(jiān)聽器,
//而匿名內(nèi)部類中無法訪問當(dāng)前Context坐榆,
//所以定義一個(gè)全局Context變量
private Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.flayout);
bt1 = (Button)findViewById(R.id.bt1);
bt2 = (Button)findViewById(R.id.bt2);
tv = (TextView)findViewById(R.id.tv);
mContext = FActivity.this;
//使用第一種方式實(shí)現(xiàn)無回傳數(shù)據(jù)的Activity跳轉(zhuǎn)
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(mContext,SActivity.class);
startActivity(intent);
}
});
//使用第二種方式實(shí)現(xiàn)有回傳數(shù)據(jù)的Activity跳轉(zhuǎn)
bt2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(mContext,SActivity.class);
//在這里將requestCode定義為1
startActivityForResult(intent,1);
}
});
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//判斷requestCode和resultCode的值便可以確定是哪個(gè)Activity回傳回來的數(shù)據(jù)
if (requestCode == 1 && resultCode == 2){
//將回傳回來的數(shù)據(jù)放進(jìn)一個(gè)String變量content中拴魄,
String content = data.getStringExtra("key");
//將content中的內(nèi)容放到tv中
tv.setText(content);
}
}
}
SActivity如下:
public class SActivity extends AppCompatActivity {
private TextView tv;
//定義一個(gè)字符串變量,并將回傳數(shù)據(jù)賦值給它
private String content = "我是回傳數(shù)據(jù)";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.slayout);
tv = (TextView)findViewById(R.id.button);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//由于這里不用實(shí)現(xiàn)頁面跳轉(zhuǎn),所以不用context和class參數(shù)
Intent intent = new Intent();
//putExtra方法將數(shù)據(jù)以鍵值對的方式儲存起來匹中,第一個(gè)參數(shù)是“健”夏漱,第二個(gè)就是“值”。
//這里將回傳數(shù)據(jù)作為值傳進(jìn)去顶捷。
intent.putExtra("key",content);
//在這里將resultCode定義為2挂绰,并將intent作為內(nèi)容傳進(jìn)去
setResult(2,intent);
//最后調(diào)用`finish()`方法關(guān)閉當(dāng)前activity,直接返回FActivity
finish();
}
});
}
}
- 最后還需要在manifest文件中將兩個(gè)Activity激活服赎。這里就不說了葵蒂。
下面看一下Demo的效果:
Demo中可以看到,使用第一種啟動(dòng)方式時(shí)重虑,點(diǎn)擊SActivity中的“發(fā)送回傳數(shù)據(jù)”按鈕也不能將數(shù)據(jù)傳遞到FActivity中践付,因?yàn)榈谝恢袉?dòng)方式只是簡單的無回傳數(shù)據(jù)的頁面跳轉(zhuǎn)。而使用第二種方式啟動(dòng)時(shí)缺厉,點(diǎn)擊“發(fā)送回傳數(shù)據(jù)”便可以將數(shù)據(jù)傳遞到FActivity中永高。
完。