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-dataandroid:name="com.xesam.key_1"android:value="x_key" />
<meta-dataandroid:name="com.xesam.key_2"android:value="@string/x_key" />
<meta-dataandroid: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-dataandroid: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"><applicationandroid: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;@Overrideprotected 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);}@Overridepublic 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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用vite搭建项目时,在启动vite后,浏览器显示页面:找不到localhost的网页

现象 在使用前端工具vite&#xff08;版本5&#xff09;&#xff0c;搭建vue3项目时&#xff0c;启动vite&#xff0c;浏览器显示页面&#xff1a;找不到localhost的网页, 起初怀疑是 未加参数 --host0.0.0.0,导致&#xff0c;后加上该参数后问题依旧 解决 将index.html页面…

2023年国赛高教杯数学建模D题圈养湖羊的空间利用率解题全过程文档及程序

2023年国赛高教杯数学建模 D题 圈养湖羊的空间利用率 原题再现 规模化的圈养养殖场通常根据牲畜的性别和生长阶段分群饲养&#xff0c;适应不同种类、不同阶段的牲畜对空间的不同要求&#xff0c;以保障牲畜安全和健康&#xff1b;与此同时&#xff0c;也要尽量减少空间闲置所…

万兆网络之线路测速

网络测速有很多种方式&#xff0c;建议使用开源的iperf搭建测试 官方&#xff1a;iperf3&#xff08;技术网站一般不被和谐&#xff0c;有部分可能被污染&#xff09; Windows下载后解压即可运行 小技巧&#xff1a;如果你用的笔记本只有一个C盘&#xff0c;最好将免安装的软…

如何使用mqttfx连接mqtt broker

TLS连接 mqtt broker 自签名连接mqtt 绿色为已连接 非TLS连接mqtt broker 同tls只是不用证书 绿色为已连接

作业--day32

机械臂 #include <myhead.h>#define PORT 8888 #define IP "192.168.125.59"int main(int argc, const char *argv[]) {int sfd socket(AF_INET, SOCK_STREAM, 0);if(sfd -1){perror("socket error");return -1;}int reuse -1;if(setsockopt(sfd…

SiLM5350MDBCA-DG车规级隔离驱动芯片,我们能为汽车智能提供什么?

SiLM5350MDBCA-DG是一款适用于IGBT、MOSFET的单通道 隔离门极驱动器&#xff0c;具有10A拉电流和10A灌电流驱动能 力。提供内部钳位功能&#xff0c;可单独控制 上升时间和下降时间。 在 SOP8 封 装 中 具 有 3000VRMS 隔 离 耐 压 &#xff08; 符 合 UL1577&#xff09;。 与…

Koa.js 入门手册:洋葱模型插件机制详解以及常用中间件

前言 Nodejs 提供了 http 能力&#xff0c;我们通过如下代码可以快速创建一个http server服务 const http require(http);http.createServer((req, res) > {res.write(hello\n);res.end();}).listen(3000);使用nodejs提供的原生能力启动一个http server并不麻烦&#xff…

P2P网络下分布式文件共享场景的测试

P2P网络介绍 P2P是Peer-to-Peer的缩写&#xff0c;“Peer”在英语里有“对等者、伙伴、对端”的意义。因此&#xff0c;从字面意思来看&#xff0c;P2P可以理解为对等网络。国内一些媒体将P2P翻译成“点对点”或者“端对端”&#xff0c;学术界则统一称为对等网络(Peer-to-Pee…

飞天使-jumpserver-docker跳板机安装

文章目录 jumpserverdocker 更新到最新下载安装包mysql启动mysql 命令 验证字符集,创建数据库使用jumpserver 进行连接测试 redis部署jumpserver 写入变量建jumpserver 容器正确输出登录验证 jumpserver 基础要求 硬件配置: 2 个 CPU 核心, 4G 内存, 50G 硬盘&#xff08;最低…

2018年第七届数学建模国际赛小美赛A题空中加油飞行计划解题全过程文档及程序

2018年第七届数学建模国际赛小美赛 A题 空中加油飞行计划 原题再现&#xff1a; 太平洋中部一个小岛上的居民被自然灾害困住。救援人员需要派遣一架轻型飞机运送少量急救药品到岛上&#xff0c;并运送一名重伤者到医疗基地求救。岛上有一个无人值守的简易机场&#xff0c;可以…

React基础巩固日志1

书写了一篇vue3的基础构建之后&#xff0c;不能带着各位一起学习vue3了&#xff0c;因为我要面试上海的前端岗位了&#xff0c;所以从现在开始&#xff0c;我要带着大家一起学习React了。 以下是我使用react书写的要掌握的react的知识点&#xff1a; ** ** 那么下面我们就一一通…

钡铼无线R10A工业级路由器在工业机器人领域的创新应用

随着工业机器人的普及&#xff0c;对于高可靠性和高稳定性的网络接入设备的需求也越来越大。传统的有线网络虽然稳定&#xff0c;但在现场布置和维护上面临很多困难&#xff0c;而无线网络虽然方便&#xff0c;但受到信号干扰和传输距离限制等问题的影响。如何解决这些问题&…