Intent 分為兩種:顯式和隱式
一、顯示Intent (意圖明顯,通過直接呼叫Activity類,來實作不同類之間的互動)
1、構造方法春如Component
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
2、setComponent方法
ComponentName componentName = new ComponentName(MainActivity.this, SecondActivity.class);
//ComponentName componentName = new ComponentName(MainActivity.this, "com.example.myworldwindow.ShowVideoActivity");
Intent intent = new Intent();
intent.setComponent(componentName);
startActivity(intent);
3、setClass/setClassName方法
Intent intent = new Intent();
//intent.setClass(MainActivity.this, ShowImageActivity.class);
intent.setClassName(MainActivity.this, "com.example.myworldwindow.ShowImageActivity");
startActivity(intent);
二、隱式Intent (意圖含蓄,不明確指明啟動哪個活動,通過設定引數“Action”、“Data”、“Category”,讓系統篩選出Activity)
1、AndroidManifest.xml檔案中,首先被呼叫的Activity要有一個帶有<intent-filter>并且包含<action>的Activity,設定它能處理的Intent,并且category設為"android.intent.category.DEFAULT",action的name是一個字串,可以自定義, 要求action和category內容同時匹配,該活動才能相應Intent,
例如:(category選擇為默認,startActivity() 方法時會自動將category添加到Intent中)
<activity
android:name="com.example.myworldwindow.SecondActivity">
<intent-filter>
<action android:name="aaabbb"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
Intent intent = new Intent();
intent.setAction("aaabbb");
// Intent intent = new Intent("aaabbb");
startActivity(intent);
2、使用隱式Intent,我們不僅可以啟動自己程式內的活動,還可以啟動其他程式的活動,這使得Android多個應用間的功能共享成為可能,
例如: (設定Android系統內置動作,呼叫系統瀏覽器,打開網頁)
// 顯示網頁
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
// 撥打電話
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
Android Intent Action 大全:https://www.jianshu.com/p/b35d27ca8174
3、找不到 Activity
Intent intent = new Intent("asasasas");
try
{
startActivity(intent);
}
catch(ActivityNotFoundException e)
{
Toast.makeText(this, "找不到對應的Activity", Toast.LENGTH_SHORT).show();
}
也可以用Intent 的 resolveActivity方法,判斷Intent是否能夠找到合適的Activity,如果沒有則不再startActivity
Intent intent = new Intent(Intent.ACTION_DIAL);
ComponentName componentName = intent.resolveActivity(getPackageManager());
if(componentName == null)
{
// 設定控制元件不可用
} else {
String className = componentName.getClassName();
Toast.makeText(this, className, Toast.LENGTH_SHORT).show();
}
三、回傳資料給上一個活動
1、Activity有一個startActivityForResult() 方法用于啟動活動,但也可以在活動銷毀時,將結果回傳給上一個活動
startActivityForResult() 方法接收兩個引數,第一個引數是Intent, 第二個引數是請求碼,用于在之后的回呼中判斷資料的來源,如下通過該方法啟動ShowImageActivity,請求碼只要是唯一值即可,
worldWindowSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, ShowImageActivity.class);
startActivityForResult(intent, 1);
}
}
});
2、在ShowImageActivity中給按鈕注冊點擊事件
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.return_button:
Intent intent = new Intent();
intent.putExtra("image", "closeImage");
setResult(RESULT_OK, intent);
finish();
break;
default:
break;
}
}
3、由于使用startActivityForResult() 方法啟動另一個Activity, 在ShowImageActivity銷毀后,會回呼上一個活動的onActivityResult() 方法,因此需在MainActivity 中重寫該方法獲取回傳的資料,
@Override
protected void onActivityResult(int requestCode, int resultCode , Intent data) {
switch (requestCode){
case 1:
if(resultCode == RESULT_OK) {
String returnData = data.getStringExtra("image");
if(returnData.equals("closeImage")) {
worldWindowSwitch.setChecked(false);
}
}
break;
default:
break;
}
}
4、按Back后回傳到MainActivity,資料將無法回傳,若需獲取該資料,需在ShowImageActivity中重寫onBackPressed() 方法來解決,
@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra("image", "closeImage");
setResult(RESULT_OK, intent);
finish();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/235519.html
標籤:其他
