Android菜鳥起飛|使用Intent實(shí)現(xiàn)Activity跳轉(zhuǎn)的兩種方式(無回傳數(shù)據(jù)和有回傳數(shù)據(jù))

使用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):

使用方法:

  1. 為實(shí)現(xiàn)跳轉(zhuǎn)動(dòng)作的控件綁定監(jiān)聽器,在點(diǎn)擊事件中實(shí)現(xiàn)StartActivityForResult(intent, requestCode)方法婆瓜。
  2. 在目標(biāo)Activity為實(shí)現(xiàn)數(shù)據(jù)回傳的控件綁定監(jiān)聽器,并實(shí)現(xiàn)setResult(resultCode,data)方法。
  3. 在原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ì)說明這兩種方法的具體用法:
  1. 首先我們需要兩個(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ù)。

  1. 然后我們開始編寫對應(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();
            }
        });
    }
}
  1. 最后還需要在manifest文件中將兩個(gè)Activity激活服赎。這里就不說了葵蒂。

下面看一下Demo的效果:


intenttest.gif

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中永高。


完。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末提针,一起剝皮案震驚了整個(gè)濱河市命爬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辐脖,老刑警劉巖饲宛,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異揖曾,居然都是意外死亡落萎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門炭剪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人翔脱,你說我怎么就攤上這事奴拦。” “怎么了届吁?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵错妖,是天一觀的道長。 經(jīng)常有香客問我疚沐,道長暂氯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任亮蛔,我火速辦了婚禮痴施,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己辣吃,他們只是感情好动遭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著神得,像睡著了一般厘惦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哩簿,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天宵蕉,我揣著相機(jī)與錄音,去河邊找鬼节榜。 笑死羡玛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的全跨。 我是一名探鬼主播缝左,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼浓若!你這毒婦竟也來了渺杉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤挪钓,失蹤者是張志新(化名)和其女友劉穎是越,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碌上,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡倚评,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了馏予。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片天梧。...
    茶點(diǎn)故事閱讀 39,773評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖霞丧,靈堂內(nèi)的尸體忽然破棺而出呢岗,到底是詐尸還是另有隱情,我是刑警寧澤蛹尝,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布后豫,位于F島的核電站,受9級特大地震影響突那,放射性物質(zhì)發(fā)生泄漏挫酿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一愕难、第九天 我趴在偏房一處隱蔽的房頂上張望早龟。 院中可真熱鬧惫霸,春花似錦、人聲如沸拄衰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翘悉。三九已至茫打,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間妖混,已是汗流浹背老赤。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留制市,地道東北人抬旺。 一個(gè)月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像祥楣,于是被迫代替她去往敵國和親开财。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容