Intent
startActivity方法將呼叫請求發送給了ActivityManager,ActivityManager負責創建SecondActivity
顯式Intent
Intent建構式的引數為當前背景關系和目標活動
在FirstActivity里點擊button1就可以進入SecondActivity
button1.setOnClickListener((View v)-> {
Intent intent=new Intent(this,SecondActivity.class);
startActivity(intent);
});
隱式Intent
Intent建構式的引數為action
只有同時匹配某個Activity的某個intent-filter的action,category,data才能啟動該Activity
1個Activity可以有多個intent-filter
為SecondActivity注冊可以回應的action和category資訊
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.activityTest.ACTION_START"/><!--可以回應這樣的action-->
<category android:name="android.intent.category.DEFAULT"/><!--必須先設定一個DEFAULT-->
<category android:name="com.example.activityTest.MY_CATEGORY"/><!--可以回應這樣的category-->
</intent-filter>
</activity>
在FirstActivity里點擊button
button.setOnClickListener((View v)-> {
Intent intent=new Intent("com.example.activityTest.ACTION_START");
intent.addCategory("com.example.activityTest.MY_CATEGORY");
//若有很多個可以回應指定action和category的活動,可以給彈出的選擇器加標題
intent = Intent.createChooser(intent,"選擇界面");
startActivity(intent);//啟動能夠回應指定action和category的活動
});
檢測哪個活動可以回應該隱式intent
PackageManager packageManager = getPackageManager();
//flag引數是限定只搜索category含DEFAULT的活動
Log.d(TAG,packageManager.resolveActivity(intent,PackageManager.MATCH_DEFAULT_ONLY).toString());
其他用法
可以啟動其他程式的活動,發送廣播等
點擊button可以啟動撥號面板
button1.setOnClickListener((View v)-> {
Intent intent=new Intent(Intent.ACTION_DIAL);//Intent內置常量action內容為"android.intent.action.DIAL"
intent.setData(Uri.parse("tel:13803216377"));
startActivity(intent);
});
如果你給自己的APP的一個活動注冊了<action android:name="android.intent.action.DIAL"/>,那么其他APP發出隱式Intent時也會進入那個活動
向下一個活動傳遞資料
FirstActivity發送資料
button1.setOnClickListener((View v)-> {
Intent intent=new Intent(this,SecondActivity.class);//顯式Intent
intent.putExtra("com.example.test.data_send","這是要傳遞的資料");//相當于鍵值對,鍵使用包名修飾避免沖突
startActivity(intent);
});
SecondActivity接收資料
Intent intent=getIntent();
String s=intent.getStringExtra("com.example.test.data_send");
向上一個活動回傳資料
FirstActivity發送資料,并要求有結果回傳
startActivityForResult(哪一輛貨拉拉,請求碼)
button1.setOnClickListener((View v) -> {
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("com.example.test.data_send", "這是要傳遞的資料");
startActivityForResult(intent, 1);
});
SecondActivity接收資料
Intent intent1 = getIntent();
String s = intent1.getStringExtra("com.example.test.data_send");
SecondActivity回傳資料
button2.setOnClickListener((View v) -> {
Intent intent2 = new Intent();
intent2.putExtra("com.example.test.data_return", "這是回傳給你的資料請收好!");
setResult(RESULT_OK, intent2);
finish();//銷毀當前活動,自動跳轉回上一活動
});
FirstActivity接收資料
因為可接收的資料來源有很多,所以先進行請求碼requestCode的分流,隨后判斷這次回傳的結果碼是否為成功RESULT_OK
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1:
if (resultCode == RESULT_OK) {
String returnData = data.getStringExtra("com.example.test.data_return");
}
break;
default:
break;
}
}
傳遞物件
Serializable方式
讓要被傳遞的類實作Serializable介面
正常方式傳遞
intent.putExtra("Object",testObject);
接收
TestObject item=(TestObject) getIntent.getSerializableExtra("Object");
Parcelable方式
原理是將一個完整的物件進行分解,分解后的每一部分都是Intent所支持的資料型別,麻煩但效率高
但是在Kotlin中,給要被傳遞的類添加@parcelize注解即可實作
查詢可以回應Intent的應用
查詢最佳匹配
ResolveInfo resolveInfo = getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
![]()
查詢全部
List<ResolveInfo> resolveInfoList = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);

Bundle
在Bundle中存盤的資料只能是基本型別和序列化物件(不建議)
Bundle物件被放入activity記錄(暫存區),程式被銷毀后,activity記錄會被系統保存起來(當用戶在程式內按下后退鍵/重啟時activity記錄清除)
為了防止存有臨時資料的活動被回收時丟失資料,可以在該活動中將資料存入Bundle來保存實體狀態
protected void onSaveInstanceState(@NonNull Bundle outState) { //在onStop()之前呼叫
super.onSaveInstanceState(outState);
outState.putString("data_temp","這是要保存的臨時資料");
}
在被回收后重新啟動,執行onCreate方法時,會自動試圖讀取Bundle引數里的資料,如果Bundle不為空,那么可以恢復臨時資料
if(savedInstanceState!=null){//如果有臨時資料,先讀取
String tempData=savedInstanceState.getString("data_temp");
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/401682.html
標籤:其他
上一篇:【Groovy】Groovy 方法呼叫 ( 使用 物件名.@成員名 訪問 Groovy 物件成員 )
下一篇:Android【平移影片】
