专栏名称: Carson_Ho
走在产品路上的Android研究生
目录
相关文章推荐
开发者全社区  ·  某大佬与梁文锋第一次的接触 ·  昨天  
开发者全社区  ·  和导师外出,他牵我手了... ·  昨天  
开发者全社区  ·  辅导员投稿:和我的学生越界了 ·  2 天前  
开发者全社区  ·  大专生的PDF ·  3 天前  
鸿洋  ·  再学安卓 - ... ·  3 天前  
51好读  ›  专栏  ›  Carson_Ho

Android:关于 Intent的那些小事(介绍、使用方法等)

Carson_Ho  · 掘金  · android  · 2019-09-28 23:29

正文

登录 注册 写文章

Android:关于 Intent的那些小事(介绍、使用方法等)

Carson_Ho

Android:关于 Intent的那些小事(介绍、使用方法等)

字数 892阅读 6

前言

  • Intent Android 开发的应用非常常见
  • 今天我就带给大家简单讲一下 Intent 的相关知识 & 其用法

目录

示意图

1. 定义

意图,描述的是应用的动作 & 其对应的数据


2. 作用

  1. 指定当前组件要完成的动作
  2. Android 不同组件间 传递数据

Activity Service BroadcastReceiver 之间的通信载体 = Intent

下面,将根据 Intent 的作用,详细讲解其使用方法


3. 使用1:指定当前组件要完成的动作

该使用 分为显式 & 隐式意图:

3.1 显式意图

  • 特点
    明确指定需启动的组件名

即 显式 Intent 不需 解析 Intent 则可直接启动目标组件

  • 具体使用
    明确指定组件名的方式:调用 Intent 的构造方法、 Intent.setComponent() Intent.setClass()

  • 实例说明

// 使FirstActivity启动SecondActivity(通过按钮)
mybutton.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
    // 1. 实例化显式Intent & 通过构造函数接收2个参数
    // 参数1 = Context:启动活动的上下文,一般为当前Activity
    // 参数2 = Class:是指定要启动的目标活动
      Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
    
    // 2. 通过Activity类的startActivity()执行该意图操作(接收一个Intent对象)
    // 将构建好的Intent对象传入该方法就可启动目标Activity
      startActivity (intent);
    }
});

3.2 隐式意图

  • 特点
    无明确指定需启动的组件名,但 指定了需启动组件需满足的条件

即 隐式 Intent 需 解析 Intent ,才可启动目标组件

  • 具体使用
    通过 AndroidManifest.xml 文件下的 <Activity> 标签下的 <intent -filter> 声明 需 匹配的条件

一个 <Activity> 标签下可以有多组<intent -filter>,只需匹配其中1组即可

  • 详细说明
    声明条件含:动作( Action )、类型( Category )、数据( Data
示意图
  • 实例说明
// 使FirstActivity启动SecondActivity(通过按钮)
      mybutton.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        // 1. 实例化1个隐式Intent对象,并指定action参数
    Intent intent = new Intent("android.intent.action.ALL_APPS");
       // 2. 调用Intent中的addCategory()来添加一个category
      // 注:每个Intent中只能指定1个action,但却能指定多个category
  intent.addCategory("com.example.intent_test.MY_CATEGORY");
                startActivity (intent);
    }
});

// 为使SecondActivity能继续响应该Intent
// 我们需在AndroidManifest.xml文件下的<Activity>标签下配置<intent -filter>的内容

<intent-filter >
      <action android:name="android.intent.action.ALL_APPS"/>
          <category android:name="android.intent.category.DEFAULT">        
          </category>
                <category android:name="com.example.intent_test.MY_CATEGORY"/>
            </intent-filter>

4. 使用2:不同组件间 传递数据

4.1 使用方法

putExtra() Bundle 方式

4.2 可传递的数据类型

a. 8种基本数据类型( boolean byte char short int long float double )、 String
b. Intent Bundle
c. Serializable 对象、 Parcelable 及其对应数组、 CharSequence 类型
d. ArrayList ,泛型参数类型为: <Integer> <? Extends Parcelable> <Charsequence> <String>

4.3 具体使用

在当前 Activity 把要传递的数据暂存在 Intent 中、在新启动的 Activity 中取出Intent中的数据

  • 方法1:putExtra()
// 目的:将FristActivity中的一个字符串传递到SecondActivity中,并在SecondActivity中将Intent对象中的数据(FristActivity传递过来的数据)取出

    // 1. 数据传递
      // a. 创建Intent对象(显示Intent)
      Intent intent = new Intent(FirstActivity.this,SecondActivity.class);     
     
      // b. 通过putExtra()方法传递一个字符串到SecondActivity;
      // putExtra()方法接收两个参数:第一个是键,第二个是值(代表真正要传递的数据)
      intent.putExtra("data","I come from FirstActivity");
      
      // c. 启动Activity
      startActivity(intent);
     
    // 2. 数据取出(在被启动的Activity中)
      // a. 获取用于启动SecondActivit的Intent
      Intent intent = getIntent();
      // b. 调用getStringExtra(),传入相应的键名,就可得到传来的数据
      // 注意数据类型 与 传入时保持一致
      String data = intent.getStringExtra("data");
 

  • 方法2:Bundle
    // 1. 数据传递
      // a. 创建Intent对象(显示Intent)
      Intent intent = new Intent(FirstActivity.this,SecondActivity.class);     
     
      // b. 创建bundle对象
      Bundle bundle = new Bundle();

      // c. 放入数据到Bundle
      bundle.putString("name", "carson");
      bundle.putInt("age", 28);
      
      // d. 将Bundle放入到Intent中
      intent.putExtras(bundle);

      // e. 启动Activity
      startActivity(intent);

    // 2. 数据取出(在被启动的Activity中)
      // a. 获取用于启动SecondActivit的Intent
      Intent intent = getIntent();

      // b. 通过Intent获取bundle
      Bundle bundle = intent.getExtras();

      // c. 通过bundle获取数据传入相应的键名,就可得到传来的数据
      // 注意数据类型 与 传入时保持一致
      String nameString = bundle.getString("name");
      int age = bundle.getInt("age");

4.4 两种方式的区别

Bundle 意为 捆绑 的意思,更多适用于:

  • 连续传递数据
    若需实现连续传递:Activity A -> B -> C;若使用 putExtra() ,则需写两次intent = A->B先写一遍 + 在B中取出来 & 再把值重新写到Intent中再跳到C;若使用 Bundle ,则只需取出 & 传入 Bundle 对象即可

  • 可传递的值:对象
    putExtra() 无法传递对象,而 Bundle 则可通过 putSerializable 传递对象

但传递的对象要实现Serializable接口

// 如传递User类的对象

public class User implements Serializable {
    ...
}

// 传递时
User user = new User();
Intent intent = new Intent(MyActivity.this,OthereActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("user", user);
intent.putExtras(bundle);

putExtra() 更多使用于单次传递、传递简单数据类型的应用场景


5. 总结

  • 本文对 Android 中的Intent组件进行了全面的介绍
  • 接下来我将继续介绍 Android 开发中的相关知识,感兴趣的同学可以继续关注本人博客 Carson_Ho的开发笔记

请点赞!因为你的鼓励是我写作的最大动力!

相关文章阅读
Android开发:最全面、最易懂的Android屏幕适配解决方案
Android事件分发机制详解:史上最全面、最易懂
Android开发:史上最全的Android消息推送解决方案
Android开发:最全面、最易懂的Webview详解
Android开发:JSON简介及最全面解析方法!
Android四大组件:Service服务史上最全面解析
Android四大组件:BroadcastReceiver史上最全面解析


欢迎关注 Carson_Ho 的简书!

不定期分享关于 安卓开发 的干货,追求 短、平、快 ,但 却不缺深度

上一篇 查看连载目录 已是最后 0人点赞   Carson_Ho 拥有4726钻 (约668.02元) "关注微信公众号:【carson带你解析Android】,带你高效、系统地学习Android知识"   Android常用 47486字 644629阅读 973人关注






请到「今天看啥」查看全文


推荐文章
开发者全社区  ·  某大佬与梁文锋第一次的接触
昨天
开发者全社区  ·  和导师外出,他牵我手了...
昨天
开发者全社区  ·  辅导员投稿:和我的学生越界了
2 天前
开发者全社区  ·  大专生的PDF
3 天前
蒲公英Ouryao  ·  与你重逢之时,岭南轮到三明
7 年前