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

news2024/11/26 13:30:46

一、概念

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt-QTransform介绍与使用

QTransform是一个用于二维坐标系转换的类。我们知道Qt的坐标系是左上角为原点&#xff0c;x轴向右&#xff0c;y轴向下&#xff0c;屏幕上每个像素代表一个单位&#xff0c;那么&#xff0c;如果我们想要在屏幕上建立自己的坐标系用于绘制&#xff0c;就需要借助QTransform。 …

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

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

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…

详细教程 - 从零开发 Vue 鸿蒙harmonyOS应用 第六节(js版) ——模块化设计实现复杂页面

随着HarmonyOS生态的日渐完善,越来越多的厂商加入鸿蒙系统应用开发的行列。然而从其他系统转到鸿蒙开发,很多开发者还是需要一个适应的过程,特别是面对比较复杂的页面,应该如何合理进行模块化拆分是一个难点。 本文将通过一个实例,来分析如果采用模块化的方式实现一个包含丰富内…

redis各种数据类型的应用场景

String应用场景 单值缓存 SET key value GET key 对象缓存 SET user:1 value(json格式数据)MSET user:1:name zhuge user:1:balance 1888 MGET user:1:name user:1:balance 分布式锁 SETNX product:10001 true //返回1代表获取锁成功 …

7天速成Python——第三天

[7天速成Python——第三天] 3 数据类型 布尔值&#xff08;bool&#xff09;&#xff1a;True False整型&#xff08;int&#xff09; &#xff1a;1 19 22 300字符串&#xff08;str&#xff09; &#xff1a;"中国联通" upper/lower/isdecimal/strip/lstrip/r…

Postman使用总结--关联

当接口和接口之间&#xff0c;有依赖关系时&#xff0c;需要借助 postman 关联技术来实现

【算法与数据结构】LeetCode55、45、跳跃游戏 I 、II

文章目录 一、跳跃游戏I二、跳跃游戏II三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、跳跃游戏I 思路分析&#xff1a;本题目标是根据跳跃数组的元素&#xff0c;判断最终能够到达数组末端。我们引入了一个跳跃范围…

后端低代码平台探索总结

业务需求快速变化的背景 我们在对业务需求进行梳理后&#xff0c;在进行程序设计时&#xff0c;对于将来可能发生变化的常量、变量、阀值、开关、条件、公式等等&#xff0c;可能会配置在环境变量或数字字典来支持可配置。但是需求变化往往会更加复杂、更加不可预测&#xff0…

Java中Exception的使用方法

Exception介绍异常处理机制的优缺点常见的Exception异常处理的常见错误优雅的处理异常异常处理中存在的性能问题Java自定义异常示例 Exception介绍 在Java中&#xff0c;异常&#xff08;Exception&#xff09;是一种特殊类型的对象&#xff0c;表示程序运行过程中发生的意外或…

智慧养老:创新科技让老年生活更美好

智慧养老&#xff1a;创新科技让老年生活更美好 随着人口老龄化的加剧&#xff0c;智慧养老成为了关注焦点。智慧养老以创新科技为核心&#xff0c;旨在改善老年人的生活品质、促进健康、增强安全感和社会融入感。本文将详细介绍智慧养老的关键技术和应用场景&#xff0c;带您了…

iPhone16:首款AI iPhone?

随着科技水平的不断发展&#xff0c;智能手机逐渐成为人们最依赖的电子产品之一。为能够满足用户需求&#xff0c;手机的硬件、外观设计与性能飞速提升&#xff0c;这也导致智能手机市场快速进入到瓶颈期。 为了能够带来更优秀的表现&#xff0c;苹果可能会为iPhone 16系列带来…

黑马React:基础拓展

黑马React: D10-基础拓展 Date: December 18, 2023 useReducer 基础使用 作用: 让 React 管理多个相对关联的状态数据 补充&#xff1a;和useState的作用类似&#xff0c;用来管理相对复杂的状态数据 **特点&#xff1a;**useReducer返回值为一个数组, 可以解构处数值stat…

【具身智能评估9】Open X-Embodiment: Robotic Learning Datasets and RT-X Models

论文标题&#xff1a;Open X-Embodiment: Robotic Learning Datasets and RT-X Models 论文作者&#xff1a;– 论文原文&#xff1a;https://arxiv.org/abs/2310.08864 论文出处&#xff1a;– 论文被引&#xff1a;–&#xff08;12/18/2023&#xff09; 论文代码&#xff1a…

力扣日记12.18-【二叉树篇】合并二叉树

力扣日记&#xff1a;【二叉树篇】合并二叉树 日期&#xff1a;2023.12.18 参考&#xff1a;代码随想录、力扣 617. 合并二叉树 题目描述 难度&#xff1a;简单 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xf…

公共字段自动填充——后端

场景&#xff1a;当处理一些请求时&#xff0c;会重复的对数据库的某些字段进行赋值&#xff08;如&#xff1a;在插入和更新某个物品时&#xff0c;需要更新该物品的更新时间和更新者的信息&#xff09;&#xff0c;这样会导致代码冗余。 如&#xff1a; 思路&#xff1a; 自…

Arma3/武装突袭3东风战役最后一关游戏无法保存的解决办法

Arma3这个游戏玩进去还是非常有可玩性的&#xff0c;可是在玩过了它本体自带的东风系列战役后&#xff0c;在最精髓的最后一关——game over这个关卡&#xff0c;却有个非常头疼的问题。 逃跑其实是非常简单的&#xff0c;但是想要无伤环游全岛确十分困难&#xff0c;因为这关卡…

探索人工智能中的语言模型:原理、应用与未来发展

导言 语言模型在人工智能领域中扮演着重要的角色&#xff0c;它不仅是自然语言处理的基础&#xff0c;也是许多智能系统的核心。本文将深入研究语言模型的原理、广泛应用以及未来发展趋势。 1. 语言模型的原理 统计语言模型&#xff1a; 基于概率统计的传统语言模型&…

云原生之深入解析如何在K8S环境中使用Prometheus来监控CoreDNS指标

一、什么是 Kubernetes CoreDNS&#xff1f; CoreDNS 是 Kubernetes 环境的DNS add-on 组件&#xff0c;它是在控制平面节点中运行的组件之一&#xff0c;使其正常运行和响应是 Kubernetes 集群正常运行的关键。DNS 是每个体系结构中最敏感和最重要的服务之一。应用程序、微服…

redis:六、数据过期删除策略(惰性删除、定期删除)和基于redisson实现的分布式锁(看门狗机制、主从一致性)和面试模板

数据过期删除策略 Redis的过期删除策略&#xff1a;惰性删除 定期删除两种策略进行配合使用 惰性删除 惰性删除&#xff1a;设置该key过期时间后&#xff0c;我们不去管它&#xff0c;当需要该key时&#xff0c;我们在检查其是否过期&#xff0c;如果过期&#xff0c;我们就…