【安卓學習】2.Intent的學習

安卓app,一般會有多個頁面,即多個活動,在各個活動之間穿梭,怎麼實現呢?這裏就用到了Intent

1.顯示的使用intent

首先我們創建一個項目,然後添加一個簡單的activity,裏面添加一個Button,並設置靜聽事件。這個比較簡單,如果不會做,可以參考我安卓學習的第一篇博客。
在監聽事件中添加如下代碼使用Intent:
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(FirstActivity.this, "click button 1", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
                startActivity(intent);
            }
        });
我首先構造出一個Intent,調用了Intent的構造方法,傳入了兩個參數:當前上下文,與目標活動。這裏需要注意一點,當前上下文需要指定爲FirstActivity.this,我之前覺得,這個方法是寫在FirstActivity.java中,直接使用this不就可以了嘛,但是後來發現出bug了,問了麻老師,瞭解到,當前代碼是寫在內名內部類View.OnClickListener(){}中,因此必須寫FirstActivity.this。  然後嗲用startActivity(intent)方法。根據字面意思就可以知道,這個方法的作用是開始一個活動,執行intent。
這就是現實使用intent,當然也可以傳參,後面再說。

2.隱式Intent

隱式Intent比較含蓄,不明確指出要啓動哪個活動,而是通過兩個參數:action與category,由系統分析intent,找到合適的intent去啓動。具體怎麼做呢?
首先打開AndroidManifest.xml,添加如下代碼:
        <activity android:name=".SecondActivity">
            <intent-filter>
                <action android:name="abc"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="def"/>
            </intent-filter>
        </activity>
首先賦值給action,或許專業的開發人員,不會這麼寫,但是我這是爲了測試各個參數的作用,因此可能不太規整,取名“abc”,當然也爲了更好的明白這個地方對應actiivity中的什麼地方。
接下來設置category,android.intent.category.DEFAULT的作用貌似是匹配那些沒有賦值category的intent。而def則是對應activity中的category參數,下面是activity中的代碼,對比看可能更明白。
                Intent intent2 = new Intent(abc);
                intent2.addCategory("def");
                startActivity(intent2);

這個是隱式的使用intent,在構造方法傳入的參數就是上面的action中內容。然後下面addCategory可以添加參數,這裏添加了def,就會被前面的<category android:name="def">進行攔截。然後調用startActivity(intent2)執行intent2。

3 向下一個活動傳值

intent還可以在傳參數給下一個活動,具體操作如下:
                Intent intent = new Intent(this, SecondActivity.class);
                String data = "test my data!!!!";
                intent.putExtra("extra_data", data);
                startActivity(intent);
intent中提供了putExtra()方法,可以讓我們把想傳的參數放入intent,啓用了下一個活動時,可以從intent中取得這些數據。代碼比較簡單,就不講咯。
接下來查看接收方:
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);
        Intent intent = getIntent();
        String data = intent.getStringExtra("extra_data");
        Log.d("SecondActivity", data);
    }
首先通過getIntent()獲取到intent對象,然後通過getStringExtra獲取到存儲的String對象,然後Log打印。當然如果時int型數據可以使用getIntExtra()方法,布爾型可以getBooleanExtra()獲取。

4.返回數據給上一個活動

在開發項目的時候,經常有返回數據給上一個項目,這個怎麼做呢?activity中有一個方法startActivityForResult()專門用於在活動銷燬時,返回參數給上一個活動。
直接上代碼:
首先在第一個activity(FirstActivity)中,我們通過一個startActivityForResult()方法啓動新的活動:
	button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(FirstActivity.this, "click button 1", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
                startActivityForResult(intent, 1);
            }
        });
需要兩個參數:第一個參數就是Intent,類似前面講的,這裏不贅述了;第二個參數是請求碼,唯一就可以,具體作用後面的看到代碼就知道了。
下面我們看一下跳轉之後的活動怎麼在關閉時返回參數給前一個活動:
	button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("data", "hahahaha");
                setResult(RESULT_OK, intent);
                finish();
            }
        });
可以看到,我們依舊構建了一個intent,只不過這個intent只用於傳參數,沒有實現跳轉活動。首先我們傳入參數,然後調用了setResult()方法,這個方法比較重要,專門用於返回數據給上個活動。需要兩個參數,第一個參數用於向上一個活動返回處理結果,一般只使用RESULT_OK或RESULT_CANCELED兩個值;第二個參數把帶有參數的intent傳回去。然後調用finish銷燬了當前的活動。
然後就需要在第一個活動中接收處理這些返回的數據,需要重寫防範onActivityResult();

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case 1:
                if (resultCode == RESULT_OK) {
                    String resultData = data.getStringExtra("data");
                    Toast.makeText(FirstActivity.this, resultData, Toast.LENGTH_SHORT).show();
                    Log.d("FirstActivity", resultData);
                }
                break;
            default:
        }
    }

方法需要三個參數,第一個參數是我們在啓動活動時傳入的請求碼,即 1;第二個參數時返回的處理結果,即RESULT_OK,第三個參數時帶有返回數據的intent。因爲一個活動中,可能有多個startActivityForResult()方法,因此需要根據requestCode來判斷數據來源。確定來源之後,判斷結果是否成功,最後再取值打印。
太晚了,先這樣吧。good night!


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