1. 程式人生 > >Intent(意圖)的用法整理

Intent(意圖)的用法整理

1.顯式Intent

首先new一個Intent,構造方法中傳入兩個引數,附上原始碼

    public Intent(Context packageContext, Class<?> cls) {
        mComponent = new ComponentName(packageContext, cls);
    }

我們可以發現要傳入一個上下文context,和一個class引數(即跳轉的另一個Activity活動)

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

然後Activity類提供了一個startActivity()方法,用於啟動活動

這裡傳入你定義的intent

startActivity(intent);      

一般置於按鈕的點選事件當中便可實現顯式意圖的活動跳轉,執行這個intent

2.隱式Intent

相比與顯式的意圖,他沒有明確的告訴你要啟動什麼,啟動哪個活動。所以你便要採取其他放在,很幸運,隱式意圖提供了抽象的action和category等資訊來實現intent的配對,這些都由系統去完成,我們都無需操心。

原始碼如下

public Intent(String action) {
        setAction(action);
    }

通過在 activity 的 intent-filter 中可以配置,配置大概如下

 <activity android:name=".MainActivity">
            <intent-filter>
       <action android:name="android.intent.action.MAIN" />
       <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity
>

這便表示一個主活動,我們可以添加里面的action和category等資訊

<action android:name="com.example.cativitytest.ACTION_START"/>

當前活動只有action和category的內容同時能夠匹配上Intent中指定的action和category時,這個活動才能響應該Intent

Intent intent = new Intent("com.example.cativitytest.ACTION_START");

隱式的Intent還可以用於開啟一個網頁,開啟電話撥號視窗。可以利用new Intent()裡寫入 Intent.ACTION_VIEW 這樣的系統內建動作,去實現這些功能。

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://baidu.com"));
startActivity(intent);

這裡我只舉一個例子,因為系統還內建了很多這樣的動作,包括電池資訊,媒體庫的呼叫,還有相機都可以通過這樣跳轉。

3.向下一個活動傳遞資料

其實實現這個非常簡單,因為Intent提供了這樣的功能,putExtra()方法,並且還有一系列的方法過載。
putExtra()方法接收兩個引數,一個是鍵值,一個是真正要傳遞的資料

攜帶資料傳入程式碼如下

String data = "hello";
Intent intent = new Intent(MainActivity.this,AnotherActivity.class);
intent.putExtra("send_data",data);
startActivity(intent);

接收資料程式碼如下

Intent intent = getIntent();
String data = intent.getStringExtra("send_data");
//你可以列印日誌來驗證
Log.d("AnotherActivity",data);

執行程式我們就可以看到日誌打印出了傳遞過來的”hello”。

4.返回資料給上一個活動

既然有了傳給下一個活動的功能,那麼聰明的開發者怎麼可能不會想到給一個回傳資料的方法呢?
所以Activity裡還有一個startActivityForResult()的方法用於啟動活動,但是這個方法可以返回一個結果,這是我們需要的。

startActivityForResult(intent,1);

startActivityForResult()的方法接收兩個引數,第一個是intent,這個不用多講,第二個是一個請求碼,用於在之後回撥中判斷資料的發出源頭。

點選回撥返回資料如下程式碼所示

Intent intent = new Intent();
intent.putExtra("data_return","back");
setResult(RESULT_OK,intent);
finish();

注意到這裡有一個setResult()方法了嗎?這個方法便是用來返回資料的。
方法接收兩個引數,第一個是用於向上一個活動返回處理結果,一般我們只使用 RESULT_OK 或者 RESULT_CANCELED 這兩個值,第二個引數則是把帶有資料的Intent傳遞回去。然後呼叫finish()方法實現銷燬當前活動。

在當前活動杯銷燬時會回撥上一個活動的onActivityResult()方法,所以我們要在上一個活動中重寫(mac系統的Android studio裡面快捷鍵是control+o)這個方法來得到返回的資料。

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch(requestCode){
       case 1:
        if(resultCode == RESULT_OK){
        String returnData = data.getStringExtra("data_return");
        }
        break;
       default:
       }
    }

很明顯,onActivityResult()方法第一個引數便是請求碼 1 ,第二個便是返回時處理的結果,第三個便是我們攜帶的資料data。

當然,如果使用者是按下手機虛擬鍵的back鍵,我們照樣可以這樣幹。
重寫onBackPressed()方法,程式碼如下

    @Override
    public void onBackPressed() {
        Intent intent = new Intent();
        intent.putExtra("data_return","bcak");
        setResult(RESULT_OK,intent);
        finish();
    }

這樣,我們便實現了返回資料的需求了。