Android冒险之旅-4-Activity的跳转(显式隐式、传值回传)

本文详细介绍了在Android开发中如何使用Intent进行Activity之间的跳转,包括显式和隐式跳转的方法,以及如何利用Intent在Activity间传递数据。同时,文章还探讨了Intent在不同应用程序间共享功能的应用。

使用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标签下配置的内容,指定当前活动能够响应的actioncategory

<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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值