Intent
定义方式
- 显示Intent
Intent intent = new Intent(this,OtherActivity.class);
startActivity(intent);
- 隐式Intent
不明确指出要启动哪一个活动,而是指定了一系列更为抽象的action和category,有系统去分析这个intent,并帮我们找合适的活动去启动
通过配置<activity>的<intent-filter>内容,指定action和category
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="com.example.toasttest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
//<category android:name="com.example.toasttest.MY_GATEGORY" />
</intent-filter>
</activity>
action:表明当前活动可以响应com.example.toasttest.ACTION_START这个action
category:包含了一些附加信息,更精确地指出了当前活动能够响应的intent可能带有category
Intent intent = new Intent("com.example.toasttest.ACTION_START");
//intent.addCategory("com.example.toasttest.MY_GATEGORY");
startActivity(intent);
若该intent的category在上方manifest中未被定义,则程序会崩溃
常用属性说明
- Action
Action | 说明 |
ACTION_MAIN: | Android Application的入口,每个Android应用必须且只能包含一个此类型的Action声明 |
ACTION_VIEW: | 系统根据不同的Data类型,通过已注册的对应Application显示数据 |
ACTION_EDIT: | 系统根据不同的Data类型,通过已注册的对应Application编辑示数据 |
ACTION_DIAL: | 打开系统默认的拨号程序,如果Data中设置了电话号码,则自动在拨号程序中输入此号码 |
ACTION_CALL: | 直接呼叫Data中所带的号码 |
ACTION_SEND: | 由用户指定发送方式进行数据发送操作 |
- Category
Category | 说明 |
CATEGORY_DEFAULT: | Android系统中默认的执行方式,按照普通Activity的执行方式执行 |
CATEGORY_HOME: | 设置该组件为Home Activity |
CATEGORY_PREFERENCE: | 设置该组件为Preference |
CATEGORY_LAUNCHER: | 设置该组件为在当前应用程序启动器中优先级最高的Activity,通常为入口ACTION_MAIN配合使用 |
CATEGORY_BROWSABLE: | 设置该组件可以使用浏览器启动 |
CATEGORY_GADGET: | 设置该组件可以内嵌到另外的Activity中 |
- Extras
Extras | 说明 |
EXTRA_BCC: | 存放邮件密送人地址的字符串数组 |
EXTRA_CC: | 存放邮件抄送人地址的字符串数组 |
EXTRA_EMAIL: | 存放邮件地址的字符串数组 |
EXTRA_SUBJECT: | 存放邮件主题字符串 |
EXTRA_TEXT: | 存放邮件内容 |
- Data
Data | 说明 |
tel: | 号码数据格式,后跟电话号码 |
mailto: | 邮件数据格式,后跟邮件收件人地址 |
smsto: | 短息数据格式,后跟短信接收号码 |
content: | 内容数据格式,后跟需要读取的内容 |
file: | 文件数据格式,后跟文件路径 |
实例
- 启动一个网页
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
<activity android:name="com.example.intenttest.SecondActivity">
<intent-filter tools:ignore="AppLinkUrlError">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http"/>
</intent-filter>
</activity>
源码地址
DoSomeAndroidTest/MyIntentTest at main · qricis/DoSomeAndroidTest · GitHub
- 实现接口回调
MainActivity
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 1:
if (resultCode == RESULT_OK) {
String returnedDate = data.getStringExtra("data_return");
Log.d("MainActicity", returnedDate);
Toast.makeText(this,returnedDate,Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
public void toGetData(View view) {
Intent intent = new Intent(this,SecondActivity.class);
startActivityForResult(intent,1);
}
SecondActivity
public void toReturnData(View view) {
Intent intent = new Intent();
intent.putExtra("data_return","this is data that return to you");
setResult(RESULT_OK,intent);
finish();
}
引申
当SecondActivity并没有点击按钮,而是直接返回,我们可以通过重写onBackPressed()方法来传递数据
/**
* 按返回键回调数据
*/
@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra("data_return","This is data that you want");
setResult(RESULT_OK,intent);
finish();
}
源码地址
https://github.com/qricis/DoSomeAndroidTest/tree/main/MyIntentCallbackTest
Activity间数据传递
- 利用Intent对象携带简单数据/使用Intent定义的bundle对象来传递
利用Intent的Extra部分来存储我们想要传递的数据,可以传送String , int, long, char等一些基础类型,对复杂的对象就无能为力了。
也可以用到bundle来传输,它保存的数据,是以key-value(键值对)的形式存在的。
当Bundle传递的是对象或对象数组时,必须实现Serializable或Parcelable接口
public void sendInfo(View view){
Intent intent = new Intent(this,Main2Activity.class);
Bundle data = new Bundle();
String info = editText.getText().toString();
data.putString("myinfo",info);
intent.putExtra("data",data);
startActivity(intent);
}
Intent intent = getIntent();
Bundle data = intent.getBundleExtra("data");
String info = data.getString("myinfo");
textView.setText(info);
- 使用序列化来传递对象
在使用内存的时候,Parcelable类比Serializable性能高,所以推荐使用Parcelable类
Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC
Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下
public void sendObj1(View view){
Test test = new Test();
test.id = 1;
test.name = "测试1";
test.number = 123;
test.type = "类型1";
Intent intent = new Intent(this,Main2Activity.class);
intent.putExtra("Test",test);
startActivity(intent);
}
Test test = (Test)intent.getSerializableExtra("Test");
textView.setText(info+"/"+test.toString());
- 使用Activity自身处理返回结果
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String item = items[position];
Intent intent = new Intent();
intent.putExtra("item",item);
// 设置返回结果
setResult(RESULT_OK,intent);
// 结束当前Activty
finish();
}
});
源码地址
https://github.com/qricis/DoSomeAndroidTest/tree/main/Transfer