问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Intent(使用intent传递数据)

创作时间:
作者:
@小白创作中心

Intent(使用intent传递数据)

引用
CSDN
1.
https://blog.csdn.net/u012554661/article/details/140195884

安卓(Android)中的
Intent
是系统内用于不同组件之间通信的一种重要机制。它是轻量级的消息传递对象,允许一个组件(如
Activity

Service

BroadcastReceiver
)请求另一个组件执行特定的操作或传递数据。以下是
Intent
在Android开发中的关键特性、作用和使用场景:


{{{width="auto" height="auto"}}}

关键特性:

  1. 动作(Action)
    Intent
    通过定义动作来表达想要执行的操作。这些动作通常以字符串形式表示,如
    ACTION_VIEW
    (查看)、
    ACTION_SEND
    (发送)、
    ACTION_INSTALL_PACKAGE
    (安装包)等。动作是
    Intent
    的核心组成部分,用于描述意图的基本行为。

  2. 数据(Data)
    Intent
    可以携带数据,这可能包括要操作的具体内容(如一个网页URL、联系人信息、多媒体文件等)。数据可以通过
    setData()
    方法设置URI(统一资源标识符),也可以通过
    putExtra()
    方法添加键值对形式的额外信息。

  3. 类别(Category):类别用于进一步细化
    Intent
    的语义,如
    CATEGORY_DEFAULT

    CATEGORY_BROWSABLE
    等。它们与动作一起使用,可以帮助系统更准确地匹配和解析
    Intent

  4. 组件指定(Component):虽然通常情况下
    Intent
    依赖系统来选择合适的组件处理请求,但也可以直接指定目标组件的类名,确保请求被确切的组件接收。

作用与使用场景:

  1. 启动组件
    Intent
    最常见的是用于启动新的
    Activity

    Service
    或触发
    BroadcastReceiver
    。例如,打开一个新的界面、启动后台任务或响应系统广播事件。

  2. 数据传递
    Intent
    可以携带数据从一个组件传递到另一个组件。这些数据可以是简单类型(如字符串、整数、布尔值),也可以是复杂类型(如序列化对象、parcelable对象),甚至是文件URI。通过在
    Intent
    中放入
    Bundle
    对象或直接使用
    putExtra()
    方法添加键值对来实现。

  3. 跨应用交互:除了在单个应用内部通信外,
    Intent
    还支持跨应用操作。开发者可以定义公开的
    Intent
    过滤器,使得其他应用能够通过标准的
    Intent
    动作和数据类型与其进行交互,例如分享内容、打开特定类型文件等。

  4. 系统操作
    Intent
    可用于执行一些系统级别的操作,如安装、卸载应用(如上述代码片段所示)、打开应用详情页、启动主屏幕、注册监听开屏锁屏广播等。

包括:

  • 打开软件安装页面:创建一个
    Intent
    ,设置
    ACTION_VIEW
    动作,指定
    application/vnd.android.package-archive
    数据类型和待安装APK文件的URI,启动安装过程。

  • 分享软件信息:创建一个
    ACTION_SEND
    类型的
    Intent
    ,指定数据类型为
    text/plain
    ,并添加要分享的文本信息,启动分享操作。

  • 卸载软件:创建一个
    ACTION_DELETE
    类型的
    Intent
    ,指定要卸载应用的包名URI,启动卸载流程。

  • 打开软件详情页:创建一个
    ACTION_APPLICATION_DETAILS_SETTINGS
    类型的
    Intent
    ,指定目标应用包名URI,打开系统应用详情设置界面。

  • 打开其他软件:通过
    PackageManager
    获取指定包名应用的启动
    Intent
    ,并启动该应用。

  • 跳转到主界面:创建一个具有
    ACTION_MAIN
    动作和
    CATEGORY_HOME
    类别的
    Intent
    ,启动设备主屏幕。

  • 注册开屏锁屏的广播接收者:在
    IntentFilter
    中添加
    ACTION_SCREEN_OFF

    ACTION_SCREEN_ON
    动作,以监听系统屏幕状态变化。

  • 获取应用信息:使用
    PackageManager
    获取已安装应用的包名、版本名、图标、名称、是否为用户应用、是否安装在SD卡等信息,封装为
    AppInfo
    对象列表。

  • 获取系统中所有进程信息:通过
    ActivityManager
    获取运行中的进程列表,包括进程名、内存占用、图标、名称、是否为用户应用等,封装为
    TaskInfo
    对象列表。

  • 清理所有非自身进程:使用
    ActivityManager
    获取所有运行中的进程,判断并杀死非自身应用的后台进程。

  • 动态检查服务是否运行:利用
    ActivityManager
    查询正在运行的服务列表,对比服务类名以确定目标服务是否正在运行。

  • 获取内存卡和SD卡可用空间:使用
    StatFs
    类查询指定路径(通常是SD卡路径)的磁盘分区信息,计算可用空间。

如何传递数据

示例代码:

在Android中,使用
Intent
传递数据主要有以下几种方法:

方法一:使用
putExtra()
方法添加键值对

这是最常见的数据传递方式,适用于基本数据类型、String、CharSequence、Parcelable 对象和 Serializable 对象等。以下是一些示例:


// 创建 Intent
Intent intent = new Intent(this, TargetActivity.class);
// 添加基本类型数据
intent.putExtra("key_integer", 123);
intent.putExtra("key_string", "Hello, Intent!");
// 添加复杂类型数据(如 Parcelable 对象)
MyParcelableObject myParcelable = new MyParcelableObject();
intent.putExtra("key_parcelable", myParcelable);
// 添加 Serializable 对象
MySerializableObject mySerializable = new MySerializableObject();
intent.putExtra("key_serializable", mySerializable);
// 启动目标 Activity,并传递数据
startActivity(intent);  

在目标 Activity 中,通过
getIntent()
方法获取到传递过来的
Intent
,然后使用对应的
getXXXExtra()
方法取出数据:


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_target);
    Intent intent = getIntent();
    // 获取基本类型数据
    int intValue = intent.getIntExtra("key_integer", defaultValue);
    String stringValue = intent.getStringExtra("key_string", defaultValue);
    // 获取 Parcelable 对象
    MyParcelableObject parcelableObject = intent.getParcelableExtra("key_parcelable");
    // 获取 Serializable 对象
    MySerializableObject serializableObject = (MySerializableObject) intent.getSerializableExtra("key_serializable");
}  

注意:对于默认值(
defaultValue
),请根据实际数据类型为其指定合适的值。

方法二:使用
setData()
设置 URI 数据

Intent
也可以通过
setData()
方法设置 URI(统一资源标识符),用于指向特定的数据资源(如文件、网页、联系人等)。例如:


// 创建 Intent
Intent intent = new Intent(Intent.ACTION_VIEW);
// 设置指向网页的 URI
Uri webpageUri = Uri.parse("https://www.example.com");
intent.setData(webpageUri);
// 启动目标 Activity,并传递数据
startActivity(intent);  

在目标 Activity 或者能够响应该
Intent
的组件中,可以通过
getData()
方法获取 URI 数据:


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_target);
    Intent intent = getIntent();
    // 获取 URI 数据
    Uri dataUri = intent.getData();
}  

方法三:使用
ClipData
传递多条数据

对于需要一次性传递多条数据(如多张图片、多个文件)的场景,可以使用
ClipData
类。例如:


// 创建 Intent
Intent intent = new Intent(this, TargetActivity.class);
// 创建 ClipData 对象
ClipData clipData = ClipData.newRawUri("clip_label", Uri.parse("content://some/content/uri"));
// 添加更多 URI 数据
clipData.addItem(new ClipData.Item(Uri.parse("another/content/uri")));
// 将 ClipData 设置到 Intent 中
intent.setClipData(clipData);
// 启动目标 Activity,并传递数据
startActivity(intent);  

在目标 Activity 中,通过
getClipData()
方法获取
ClipData
对象,然后遍历其中的
ClipData.Item
来访问各个 URI:


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_target);
    Intent intent = getIntent();
    // 获取 ClipData 对象
    ClipData clipData = intent.getClipData();
    if (clipData != null) {
        for (int i = 0; i < clipData.getItemCount(); i++) {
            ClipData.Item item = clipData.getItemAt(i);
            Uri uri = item.getUri();
            // 处理每个 URI 数据
        }
    }
}  
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号