安卓app,一般會有多個頁面,即多個活動,在各個活動之間穿梭,怎麼實現呢?這裏就用到了Intent
1.顯示的使用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。2.隱式Intent
<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中的什麼地方。 Intent intent2 = new Intent(abc);
intent2.addCategory("def");
startActivity(intent2);
這個是隱式的使用intent,在構造方法傳入的參數就是上面的action中內容。然後下面addCategory可以添加參數,這裏添加了def,就會被前面的<category android:name="def">進行攔截。然後調用startActivity(intent2)執行intent2。
3 向下一個活動傳值
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.返回數據給上一個活動
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銷燬了當前的活動。 @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來判斷數據來源。確定來源之後,判斷結果是否成功,最後再取值打印。