Android-----AndroidManifests.xml 之meta-data

一、概念

meta-data:元数据、文件元数据。主要用来定义一些组件相关的配置值。

metadata是一组供父组件使用的名值对(name-value pair),一个组件元素可以包含任意数量的meta-data子元素。这些子元素的值存放在一个 Bundle 对象中,组件可以通过 PackageItemInfo.metaData 字段访问这些数据。AndroidManifests.xml下的meta-data则是对外界开放的,是向系统注册的信息,系统及外界是可以通过PackageInfo相关API获取到meta-data的信息。
在这里插入图片描述

1.1 语法

<meta-data android:name="string"
               android:resource="resource specification"
               android:value="string" />

标签<meta-data>是提供组件额外的数据用的,它本身就是一个键值对,可以自定义名称和值。
它可以包含在以下组件当中:
 	<activity>
    <activity-alias>
    <application>
    <provider>
    <receiver>
    <service> 

1.2 属性

  • android:name 数据项名称
    为了确保名称的唯一性,可使用 Java 风格的命名规则 — 如:“com.example.project.activity.fred”。
  • android:resource 资源 ID
    对某个资源的引用。赋值为资源 ID 。 通过 Bundle.getInt() 方法可以从 meta-data Bundle 中读取该资源 ID。
  • android:value 数据项值
    赋给数据项的值。 下表列出了可赋予的数据类型、组件用 Bundle 对象获取该类值的方法:
Bundle 方法类型
getString()字符串值:(/)作为转义字符—比如“\n”、“\uxxxxx”表示 Unicode 字符
getInt()资源ID
整数值:比如“100”
颜色值:格式为“#rgb”、“#argb”、“#rrggbb”或“#aarrggbb”
getBoolean()布尔型值:“true”或“false”
getFloat()浮点型值:比如“1.23”

二、 使用说明

普通类型的值:通过 value 属性来给定。
资源 ID 的值:必须用 resource 属性来指定。

定义资源

<string name="x_key">resource key</string>
//R
public static final int ic_launcher=0x7f020000;

定义metadata

<meta-data
    android:name="com.xesam.key_1"
    android:value="x_key" />
<meta-data
    android:name="com.xesam.key_2"
    android:value="@string/x_key" />
<meta-data
    android:name="com.xesam.img"
    android:resource="@drawable/ic_launcher" />
    <!--保存的是对应的Id,而不是保存的Id对应的资源-->

那么有:

metadata.getString("com.xesam.key_1") ==> "x_key"
metadata.getString("com.xesam.key_2") ==> "resource key"
metadata.getInt("com.xesam.img")      ==> 0x7f020000

强烈建议不要使用多个独立的 部分定义数据。 如果有比较复杂的数据需要和某个组件关联,请把它们作为资源存储,并用 resource 属性将资源 ID 告知组件。

2.1 使用问题

<meta-data
    android:name="com.xesam.key_1"
    android:value="000" />

类似这样的值如果使用bundle.getString()的话是不起作用的,因为Bundle中使用的是形如:

return (String) o;在这里插入代码片

代码获取一个StringValue值的,但是在将metadata包装成bundle的时候,"000"被解析成整数0,
因此bundle.getString(“com.xesam.key_1”)返回的是(String)0,显然,java是不允许这样的,因此最后得到的是null。 话说android为什么不是用String.valueOf()或者obj.toString()呢?

为了避免这种情况:

  1. 可以在形如000的字符串前面放个\0空字符,强迫android按照字符串解析000。
  2. 在资源文件中指定需要的值,然后在metadata的value中引用此值。

三、 具体应用场景解析

展示了meta-data元素在activity、application 、service和receiver元素中的读取方法

之前提到Meta-data中的内容会被收集到一个Bundle对象中,并且提供给组件的PackageItemInfo.metaData属性字段。可以通过调用PackageItemInfo 对象的metaData属性获得。而中ActivityInfo、ServiceInfo、 ApplicationInfo都是直接或间接继承自PackageItemInfo。

获取相应的PackageItemInfo值的时候要注意:
1 AppliacationInfo需要传递包名,
2 其他的传递ComponentName,所以需要构造一个 ComponentName对象,而不是使用getComponentName()方法。
getComponentName()方法返回的是当前组件。可能获取Meta-data值得地方不在对应的组件中。

AndroidMainfest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApplication"
        tools:targetApi="31">
        <!--Application的MetaData的配置-->
        <meta-data android:name="applicationMetadataKey" android:value="applicationMetadataValue"/>
        <activity android:name=".MainActivity" android:exported="true">
        	<!--注意:targetSdkVersion大于等于SDK 31(也就是Android 12)时,如果Activity配置了Intent-filter,必须也同时配置exported属性,否则编译失败。-->
            <!--Activity的MetaData的配置-->
            <meta-data android:name="activityMetadataKey" android:value="activityMetadataValue"/>
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name=".MainReceiver">
            <!--Receiver的MetaData的配置-->
            <meta-data android:name="receiverMetadataKey" android:value="receiverMetadataValue"/>
        </receiver>
        <service android:name=".MainService">
            <!--Service的MetaData的配置-->
            <meta-data android:name="serviceMetadataKey" android:value="serviceMetadataValue"/>
        </service>
    </application>

</manifest>

MainActivity.java

package com.example.myapplication;

import android.content.ComponentName;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView result;
    private Context mContext;
    private ComponentName componentName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = this;
        componentName = this.getComponentName();
        result = (TextView) findViewById(R.id.result);
        findViewById(R.id.app).setOnClickListener(this);
        findViewById(R.id.act).setOnClickListener(this);
        findViewById(R.id.rec).setOnClickListener(this);
        findViewById(R.id.ser).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if(v.getId() == R.id.app){
            try {
                ApplicationInfo appInfo = mContext.getPackageManager().getApplicationInfo(mContext.getPackageName(), PackageManager.GET_META_DATA);
                String appMV = appInfo.metaData.getString("applicationMetadataKey");
                result.setText(appMV);
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
        }
        else if(v.getId() == R.id.act){
            try {
                ActivityInfo actInfo = mContext.getPackageManager().getActivityInfo(componentName, PackageManager.GET_META_DATA);
                String actMV = actInfo.metaData.getString("activityMetadataKey");
                result.setText(actMV);
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
        }
        else if(v.getId() ==  R.id.rec){
            ComponentName recCn = new ComponentName(mContext, MainReceiver.class);
             try {
                 ActivityInfo recInfo = mContext.getPackageManager().getReceiverInfo(recCn, PackageManager.GET_META_DATA);
                 String recMV = recInfo.metaData.getString("receiverMetadataKey");result.setText(recMV);
             } catch (PackageManager.NameNotFoundException e) {
                 e.printStackTrace();
             }
        } else if (v.getId() ==  R.id.ser) {
            ComponentName serCn = new ComponentName(mContext, MainService.class);
            try {
                ServiceInfo serInfo = mContext.getPackageManager().getServiceInfo(serCn, PackageManager.GET_META_DATA);
                String serMV = serInfo.metaData.getString("serviceMetadataKey");
                result.setText(serMV);
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
}

转载链接

https://blog.csdn.net/xuangelouzhu/article/details/113661113

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/255842.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

汽车UDS诊断——SecureDataTransmission 加密数据传输(0x84)

诊断协议那些事儿 诊断协议那些事儿专栏系列文章,本文介绍诊断和通讯管理功能单元下的84服务SecureDataTransmission,在常规诊断通信中,数据极易被第三方获取,所以在一些特殊的数据传输时,标准定义了加密数据传输的服务。 简而言之,就是在发送诊断数据时,发送方先把数…

svn 安装

安装系统 ubuntu 22 安装命令&#xff1a; sudo apt-get install subversion 创建第一个工程&#xff1a; 创建版本库、项目 1、先创建svn根目录文件夹 sudo mkdir /home/svn 2、创建项目的目录文件夹 sudo mkdir /home/svn/demo_0 svnadmin create /home/svn/demo_0 配置&a…

C#拼接JSON

一、业务背景 最近项目需要与U8c对接&#xff0c;实现增删改查&#xff0c;借此机会&#xff0c;梳理一下C#解析Json字符串的问题。 这篇文章&#xff0c;先以新增接口为例。 二、新增接口 查看需要传入的json格式。 拼接json&#xff0c;无非就是{}和[]的来回嵌套。 首先&am…

数据可视化(附带操作实例)

一、主要目的&#xff1a; 数据可视化是关于图形或表格的数据展示&#xff0c;旨在借助图形化手段&#xff0c;清晰有效的传达与沟通信息。通过直观地传达关键内容与特征&#xff0c;从而实现对相当稀疏而又复杂的数据集的深入洞察。熟悉在Python开发环境中支持数据可视化环节…

【基础篇】1.2 认识STM32(二)

3.3 VREF/VREF-引脚 VREF和VREF-是STM32中用于提供参考电压的引脚。如下图&#xff1a; VREF引脚可以连接一个单独的外部参考电压&#xff0c;范围在2.0V&#xff5e;VDDA&#xff0c;但不能超过VDDA&#xff0c;否则就超过了模拟器件的最大供电电压。在100引脚的封装中&#…

微服务实战系列之ZooKeeper(实践篇)

前言 关于ZooKeeper&#xff0c;博主已完整的通过庖丁解牛式的“解法”&#xff0c;完成了概述。我想掌握了这些基础原理和概念后&#xff0c;工作的问题自然迎刃而解&#xff0c;甚至offer也可能手到擒来&#xff0c;真实一举两得&#xff0c;美极了。 为了更有直观的体验&a…

分布式链路追踪 —— 基于Dubbo的traceId追踪传递

文章目录 原文链接RpcContext 上下文对象Dubbo 过滤器&#xff08;Filter&#xff09;对象基于Dubbo的traceId追踪传递实现 原文链接 RpcContext 上下文对象 在实现 Dubbo 调用之间的链路跟踪之前&#xff0c;先简单了解 RpcContext 上下文对象和 Filter 过滤器对象&#xff…

vue使用xlsx和xlsx-style导出xlsx文件并修改样式

1.下载依赖 npm install xlsx --save npm install file-saver --save npm install xlsx-style --save2.先修改xlsx-style的源码&#xff0c;一旦引入xlsx-style则会报错 在\node_modules\xlsx-style\dist\cpexcel.js 807行 的 var cpt require(’./cpt’ ‘able’); 改成 v…

接口测试的工具(3)----postman+node.js+newman

1.安装newman&#xff1a;输入命令之后 一定注意 什么都不要操作 静静的等待结束就行了。 2.安装失败的对此尝试不行 在用下面的方法 解压一下就行了 3.验证是否成功 多次尝试是可以在线安装成功的

开发企业展示小程序的关键步骤和技巧

随着移动互联网的快速发展&#xff0c;小程序已经成为企业展示形象、推广产品和服务的重要工具。拥有一个优秀的小程序可以帮助企业提高品牌知名度&#xff0c;吸引更多潜在客户&#xff0c;提升用户体验。以下是拥有一个展示小程序的步骤&#xff1a; 确定需求和目标 首先&am…

21、同济、微软亚研院、西安电子科技大提出HPT:层次化提示调优,独属于提示学习的[安妮海瑟薇]

前言&#xff1a; 本论文由同济大学、微软亚洲研究院、西安电子科技大学&#xff0c;于2023年12月11日中了AAAI2024 论文&#xff1a; 《Learning Hierarchical Prompt with Structured Linguistic Knowledge for Vision-Language Models》 地址&#xff1a; [2312.06323]…

操作系统习题

操作系统习题 一&#xff0e;选择题二&#xff0e;判断题三&#xff0e;PV操作题 学习完操作系统以后也要做题巩固一下&#xff0c;下面是我收集到的一些题目&#xff0c;如有问题欢迎大家一起讨论&#xff01; 题目较多&#xff0c;可以选择自己需要的来做&#xff0c;答案仅供…

干货教学!!!RHEL8中ansible中常用模块的使用

内容很长各位大老爷耐心观看 本章主要介绍ansible中最常见模块的使用 文件管理模块软件包管理模块服务管理模块磁盘管理模块用户管理模块防火墙管理模块 ansible的基本用法如下 ansible 机器名 -m 模块x -a “模块的参数” 对被管理机器执行不同的操作&#xff0c;只需要调…

WinSCP显示服务器隐藏的文件

正常情况下&#xff0c;如果我们有使用WinSCP作为SFTP、FTP管理主机空间的时候&#xff0c;如果有类似.htaccess或者其他.开头或者其他特殊文件名扩展会直接看不到而是隐藏着的。这样就显得比较麻烦&#xff0c;自己都不知道有还是没有&#xff0c;比如我们要修改.htaccess伪静…

【1.8计算机组成与体系结构】磁盘管理

目录 1.磁盘基本结构与存取过程1.1 磁盘基本结构1.2 磁盘的存取过程 2.磁盘优化分布存储3.磁盘单缓冲区与双缓冲区4.磁盘移臂调度算法 1.磁盘基本结构与存取过程 1.1 磁盘基本结构 磁盘&#xff1a;柱面&#xff0c;磁道&#xff0c;扇区。 1.2 磁盘的存取过程 存取时间寻…

预测性维护在汽车制造行业中的应用

汽车制造行业是一个高度复杂和精细化的领域&#xff0c;依赖于各种设备来完成生产流程。这些设备包括机械装配线、焊接机器人、喷涂设备、传送带等。然而&#xff0c;这些设备在长时间运行中不可避免地会遇到各种故障&#xff0c;给生产进程带来延误和成本增加。为了应对这一挑…

22--Map集合

1、Map集合 现实生活与开发中&#xff0c;我们常会看到这样的一类集合&#xff1a;用户ID与账户信息、学生姓名与考试成绩、IP地址与主机名等&#xff0c;这种一一对应的关系&#xff0c;就称作映射。Java提供了专门的集合框架用来存储这种映射关系的对象&#xff0c;即java.…

安卓小练习-校园闲置交易APP(SQLite+SimpleCursorAdapter适配器)

环境&#xff1a; SDK&#xff1a;34 JDK&#xff1a;20.0.2 编写工具&#xff1a;Android Studio 2022.3.1 整体效果&#xff08;视频演示&#xff09;&#xff1a; 小练习-闲置社区APP演示视频-CSDN直播 部分效果截图&#xff1a; 整体工作流程&#xff1a; 1.用户登录&…

C语言输出菱形(详解版)

菱形&#xff0c;就是如下所示的图形&#xff0c;总行数与总列数相等&#xff1a; 写一个程序&#xff0c;根据用户输入的总行数&#xff0c;打印出菱形。 这个题目主要是找出规律&#xff0c;考察读者的逻辑思维。 你可以从第一行开始&#xff0c;遍历所有的列&#xff0c;也…

数据可视化---双Y轴折线图比较

内容导航 类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统…