Android中使用intent跳轉Activity和傳遞數值


intent,顧名思義,是一種目的,不僅可以指明當前組件的目的,也可以傳遞數據。intent的使用非常廣泛,本文只在啓動活動方面做一些介紹,如有不對或者補充的地方,歡迎指出。

顯式intent跳轉Activity

顯式intent,即是一種非常明顯的目的。由當前Activity跳到指定的Activity。使用的方式爲,先構造一個intent,傳入當前的Activity與需要跳轉到的Activity。然後再啓用Intent。

 Intent intent =new Intent(MainActivity.this,SecondActivity.class);
                startActivity(intent);

當配合Button組件使用時,即按下按鈕跳轉到另一個Activity

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button1=(Button)findViewById(R.id.bu01);
        //buo1爲xml界面定義的buttonID
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent =new Intent(MainActivity.this,SecondActivity.class);//SecondActivity爲目的Activity
                startActivity(intent);
            }
        });
    }

隱式intent跳轉Activity

隱式intent就比較含蓄,它的原理有點類似於相親,你並不知道你要轉到哪個Activity,但是你對心儀的對象有一些小要求,而恰好你相親的對象能滿足你的條件,那麼恭喜你,相親成功(當前Activity也就轉到了你相親對象的Activity)。而我們需要做的,就是給(目標對象)Activity添加響應信息,給(你)原Activity添加響應要求。
怎麼做呢,
第一步:咱們先給目標對象添加響應信息吧,具體的是在XML的目標對象下配置一個信息,舉例

<activity android:name=".SecondActivity">
        <intent-filter>
            <action android:name="com.example.intent.ACTION_START"/>
            <category android:name="android.intent,category,DEFAULT"/>
        </intent-filter>
        </activity>

我們在SecondActivity內添加了兩個信息,一個是action,一個是category,可以簡單理解爲外貌三觀(此處斜眼笑),具體的信息在引號內,隨你寫。
第二步:咱們給原Activity添加要求

        button1.setOnClickListener(new View.OnClickListener() {/隱式intent
            @Override
            public void onClick(View v) {
               // Intent intent =new Intent(MainActivity.this,SecondActivity.class);
                Intent intent=new Intent("com.example.intent.ACTION_START");//你的具體要求
                startActivity(intent);
            }
        });

然後,你驚奇地發現你的action(外貌)要求與我們最開始寫的信息居然完美符合,那恭喜你們配對成功。那可能有人覺得很奇怪,明明只有外貌符合要求,三觀(Category)要求都沒寫,這也能配對?然後細心的你會發現,我們給女方(目標Activity)添加信息時,Category一欄寫的是DEFAULT,這個單詞是默認的意思,說白點,就是說如果你對她沒有特殊的三觀要求,她就沒有意見,這是嫁雞隨雞嫁狗隨狗的女方,你還要求啥三觀呢?
當然如果你對三觀有着執着的要求,你大可以在你的要求欄下再添加一行代碼比如

intent.addCategory(com,exampel.activity.MY_CATEGORY);

這樣的結果就是你可能找不到對象,除非你在女方下也添加相應的信息。

隱式intent打開網頁

本來講完了上述內容我的文章已經寫完了,但是,多寫點也無妨,因爲隱式intent的用法更加廣泛,他能與其他程序互通,也能打開網頁。

button1.setOnClickListener(new View.OnClickListener() {//顯示intent
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(Intent.ACTION_VIEW);
                intent.setData(Uri.parse("http:www.baidu.com"));//上述兩行爲你相親的要求
                startActivity(intent);
            }
        });

效果圖如下

爲了更好掌握這點代碼的原理,你可以將網頁也理解成一個Activity,不同的是,網頁的intent-fliter中的action信息爲“Intent.ACTION_VIEW”常量,而且在intent-fliter裏還配置了另一個信息data,data信息中又包含了sheme(數據協議),host(主機名)等信息。而上述代碼

intent.setData(Uri.parse("http:www.baidu.com"));

就是對響應信息的要求。

利用intent傳遞數據

傳遞數據分爲兩種,向下一個Activity傳遞數據,和將數據返回給上一個Activity.

向下一個Activity傳遞數據

我們以傳遞一個字符串爲例,咱們要幹什麼事呢
第一步,將字符串存到一個字符串字符串對象中
第二步:利用顯示intent跳轉到目的Activity
第三步:給字符串對象找一個鍵值並傳入intent中,
第四步:在目的Activity中獲取intent
第五步:獲取intent中的鍵值
第六步:取出鍵值對應的字符串並打印出來
具體的代碼實現
具體實現如下
在當前Acivity中

 button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String data="hi";//第一步
               Intent intent =new Intent(MainActivity.this,SecondActivity.class);//第二步
               intent.putExtra("E",data);//第三步
               startActivity(intent);
            }
        });

在目標Activity中

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);
        Intent intent=getIntent();//第五步
        String data=intent.getStringExtra("E");
            Log.d("SecondActivity",data);//第六步
    }

這樣是不是很好理解?而其中接觸的新函數putExtra()與intent.getStringExtra()的用法也顯而易見了。至於爲什麼要通過鍵值來傳遞數據,我怎麼知道,它的參數就是這麼給的(來自菜鳥的吐槽)
打印出來的日誌如下
在這裏插入圖片描述

將數據返回給上一個活動

intent是啓動Activity時傳遞數據的,那麼如果銷燬一個Activity時,如何向上一個Activity傳遞數據呢。
答案是使用Activity裏兩個自帶的函數startActivityForResult()與onActivityResult(),第一個函數是啓動另一個Activty的函數並要求一個返回值,而這個返回值就是通過onActivityResult()返回的。
實現效果:A啓動B,B銷燬並返回一個字符串
具體的實現步驟如下
第一步:利用startActivityForResult()A啓動B
第二步:在B裏,將字符串賦予鍵值,並放進intent
第三步:調用SetResult()返回intent
第四步:銷燬B
第五步:在A裏重寫onActivityResult(),因爲我們需要把傳過來的字符打印出來,讓你看到你傳遞成功了
具體代碼如下
A中

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button1=(Button)findViewById(R.id.bu01);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) { 
                Intent intent =new Intent(MainActivity.this,SecondActivity.class);
                startActivityForResult(intent,1);//第一步,第二個參數是請求碼
            }
        });
    }

A中第五步

 @Override
    protected void onActivityResult(int requestCode,int resultCode,Intent data)//第一個參數式啓動活動時傳入的請求碼,只有請求碼配對,才能往下執行。第二個參數是返回數據時的處理結果,第三個參數是data
switch (requestCode){
    case 1:
        if(resultCode==RESULT_OK){
            String returnedData =data.getStringExtra("data_return");
            Log.d("MainActivity",returnedData);
        }
        break;
    default:
}
    }

B中

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);
        Button button2 = (Button) findViewById(R.id.bu1);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("data_return", "hello");//第二步
                setResult(RESULT_OK, intent);//第三步。第一個參數是返回結果
                finish();第四步
            }
        });
    }

值得注意的是,我在實現的過程中發現當按下B中的按鈕,finish()執行了但並不會直接銷燬B,還需要再按一下按鈕才能銷燬並返回intent。(具體的解決方法我也不是很清楚。)
運行之後我們可以在日誌中看到
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章