使用Intent在Activity之间跳转
一个完善的应用除了一开始默认启动的Main Activity之外,还有其他不同用途的Activity。比如说登录注册页面和主页面。那么怎么从一个Activity跳转到另一个Activity呢?我们可以使用Intent(意图)。

1.显式跳转
——明确指出目标Activity
//使用startActivity()方法启动Activity,用Intent声明目标Activity
Intent intent = new Intent();
intent.setClass(this,OptionsMenuActivity.class);
startActivity(intent);
or
//最常用的方式
startActivity(new Intent(this,OptionsMenuActivity.class));
2.隐式跳转
——隐藏目标Activity,指定一系列抽象的action和category等信息,让系统去分析然后帮我门找出合适的Activity去启动
打开清单文件(AndroidManifest.xml),在Activity标签下配置的内容,指定当前活动能够响应的action和category;
<activity android:name=".Menu.ContextMenuActivity">
<intent-filter>
<action android:name="qiyuan.lin.helloandroid.START_CMA"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
Activity中的启动代码
//新建Intent
Intent intent = new Intent();
//设置action
intent.setAction("qiyuan.lin.helloandroid.START_CMA");
//设置category
intent.addCategory("android.intent.category.DEFAULT");
//启动
startActivity(intent);
如果category为android.intent.category.DEFAULT(默认),那么Intent可以不指定category,代码可以简化为:
startActivity(new Intent("qiyuan.lin.helloandroid.START_CMA"));
3.更多的隐式意图用法
Intent不仅可以启动自己程序内的活动,还可以启动其他程序的活动,使得不同程序之间实现功能共享。
// 进入系统设置界面
Intent intent = new Intent(android.provider.Settings.ACTION_SETTINGS);
startActivity(intent);
//打开相册
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, 2);
// 打开网页
Uri uri = Uri.parse("https://www.taobao.com");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
// 调用拨号界面,给10086拨打电话
Intent intent6 = new Intent(Intent.ACTION_DIAL);
intent6.setData(Uri.parse("tel:10086"));
startActivity(intent6);
//安装软件
String fileName = Environment.getExternalStorageDirectory() + "/AppName.apk";
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(fileName)),"application/vnd.android.package-archive");
startActivity(intent);
//卸载软件
Uri uri = Uri.parse("package:" + packageName);
Intent intent = new Intent(Intent.ACTION_DELETE, uri);
startActivity(intent);
AND SO ON…
4. 显示意图和隐式意图的选择
相比之下显示意图效率更高,系统直接精确定位要启用的组件,但耦合度也高,如果通过这种方式调用一些系统组件的话,容易因为版本更新,类名、包名、包结构变化等原因导致程序崩溃。隐式意图能够降低程序的耦合度,但由于每次意图执行的时候,系统都会搜索所有可用的intentfilter,来查看是否有匹配的内容,所以效率更低。一般来说,同一应用内使用显式意图,不同应用之间使用隐式意图。
5. Intent传值
目前为止我们只是简单的用Intent来启动一个活动,但其实Intent还可以在启动活动的时候传递数据,让我们一起来来看看吧。
5.1 效果图

5.2 实现代码
第一个Activity中
//获取输入框的内容
String msg = edittext.getText().toString().trim();
//创建意图
Intent intent2 = new Intent(this, SecondIntentActivity.class);
//添加携带的信息
intent2.putExtra("data", msg);
//启动
startActivity(intent2);
第二个Activity中
//拿到意图
Intent intent = getIntent();
//拿到意图携带的信息
String msg = intent.getStringExtra("data");
//textview展示出来
textview.setText("第一个Activity传来的值:"+msg);
6.值的回传
6.1 效果图

6.2 实现代码
1. 第一个Activity中
//获取输入框的内容
String msg2 = edittext.getText().toString().trim();
//创建意图
Intent intent3 =new Intent(this, SecondIntentActivity.class);
//添加携带的信息
intent3.putExtra("data", msg2);
/**
* 使用startActivityForResult()方法启动
* 第一个参数是意图
* 第二个参数是请求码 在回调方法中会用到
* */
startActivityForResult(intent3,412);
2. 第二个Activity中
//获取输入框的值
String string = edittext.getText().toString().trim();
//创建意图
Intent intent = new Intent();
//附加信息
intent.putExtra("return", string);
/*
* 调用setResult()方法 用于向上一个Activity传递数据
* 第一个参数是返回码,第二个参数是Intent
* 一般返回码使用RESULT_OK或者RESULT_CANCELED(相当于-1和0)
* */
setResult(RESULT_OK, intent);
//关闭当前Activity
finish();
3. 回到第一个Activity中重写onActivityResult()方法
/***
* 请求码
* @param requestCode
* 返回的结果码
* @param resultCode
* Intent对象
* @param data
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//用switch判断请求码
switch (requestCode) {
case 412:
//当返回的结果码为RESULT_OK时
if (resultCode == RESULT_OK){
//假设data不为空
assert data != null;
//获取data携带的返回数据
String string = data.getStringExtra("return");
//用textview显示出来
textview.setText("回传的值为:"+string);
}
break;
}
}
7. Intent能传的数据类型
文章的最后,附上Intent能传递的数据类型
- 基本数据类型(byte/boolean/char/short/int/float/long/double)
- String/StringBuffer/StringBuilder类型
- Serializable,将对象序列化成二进制数据传递
- charsequence: 主要用来传递String,char等
- parcelable: 这个android提供的一种新的类型,用来封装数据的容器,和Serializable相似,但是序列化的方式不同
- Bundle: Bundle是将数据传递到另一个上下文中或保存,或者回复自己状态的数据存储方式,数据不是持久化状态。
Tips:parcelable和Serializable的区别:
Serializable的作用是保存对象的属性到本地文件,数据库,网络流等方便数据传输,也可程序之间传递。
parcelable的设计的目的是为了解决Serializable效率不高的问题,内存开销小,所以在内存间传递数据的方式用parcelable,缺点是不能持久化。
kee
本文详细介绍了在Android开发中如何使用Intent进行Activity之间的跳转,包括显式和隐式跳转的方法,以及如何利用Intent在Activity间传递数据。同时,文章还探讨了Intent在不同应用程序间共享功能的应用。
615

被折叠的 条评论
为什么被折叠?



