(4.6.12.6)Android中<meta-data>的使用

本文详细介绍了Android中meta-data元素的用途与实现方式,包括如何在不同组件中使用meta-data来传递配置信息,并展示了如何通过Java代码访问这些元数据。

概念

meta-data就像其名一样,主要用来定义一些组件相关的配置值。

按照官方定义,metadata是一组供父组件使用的名值对(name-value pair),因此相应的meta-data元素应该定义在相应的组件中。即如果想在activity中使用metadata,那么meta-data必须定义在AndroidManifest.xml的activity声明中。

格式定义

这是该元素的基本结构.可以包含在
< activity> < activity-alias> < service> < receiver>四个元素中。

<meta-data Android:name="string" 
android:resource="resource specification" 
android:value="string" /> 
  • android:name
    元数据项的名字,为了保证这个名字是唯一的,采用Java风格的命名规范。例如: com.example.project.activity.fred

  • android:resource
    资源的一个引用,指定给这个项的值是该资源的id。该id可以通过方法Bundle.getInt()来从meta-data中找到。

  • android:value
    指定给这一项的值。可以作为值来指定的数据类型并且组件用来找回那些值的Bundle方法列在了下面的表中。

java中获取值

TypeBundle method
String value, using double backslashes (//) to getString() escape characters — such as”//n” and “//uxxxxx” for a Unicode character.getString()
Integer value, such as “100”getInt()
Boolean value, either “true” or “false”getBoolean()
Color value, in the form “#rgb”, “#argb”, “#rrggbb”, or “#aarrggbb”getString()
Float value, such as “1.23”getFloat()
<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" />
metadata.getString("com.xesam.key_1") ==> "x_key"
metadata.getString("com.xesam.key_2") ==> "resource key"
metadata.getInt("com.xesam.img")      ==> 0x7f020000

由于resource指向资源ID,因此用metadata可以定义一些稍微复杂的值。
比如要定义一副图片,则可以用这个,然后在代码中用getInt()取出图片的ID:

int imageId = meta.getInt("com.xesam.img");
((ImageView) findViewById(R.id.img)).setImageResource(imageId);

应用

1 :在Activity的应用

<activity...>
       <meta-data android:name="myMsg" android:value="hello my activity"></meta-data>
    </activity>
ActivityInfo info=this.getPackageManager().getActivityInfo(getComponentName(),PackageManager.GET_META_DATA);
String msg=info.metaData.getString("myMsg");
System.out.println("myMsg:"+msg);

2:在application的应用。

<application...>
       <meta-data android:value="hello my application" android:name="myMsg"></meta-data>
   </application>
ApplicationInfo appInfo = this.getPackageManager().getApplicationInfo(getPackageName(),PackageManager.GET_META_DATA);
String msg=appInfo.metaData.getString("myMsg");
System.out.println("myMsg:"+msg);

3:在service的应用。

<service android:name="MetaDataService">
      <meta-data android:value="hello my service" android:name="myMsg"></meta-data>
   </service>
 ComponentName cn=new ComponentName(this,MetaDataService.class);
ServiceInfo info=this.getPackageManager().getServiceInfo(cn, PackageManager.GET_META_DATA);
String msg=info.metaData.getString("myMsg");
System.out.println("myMsg:"+msg);

4: 在receiver的应用。

  <receiver android:name="MetaDataReceiver">
            <meta-data android:value="hello my receiver" android:name="myMsg"></meta-data>
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE"></action>
            </intent-filter>
    </receiver>
 ComponentName cn=new ComponentName(context, MetaDataReceiver.class);
ActivityInfo info=context.getPackageManager().getReceiverInfo(cn, PackageManager.GET_META_DATA);
String msg=info.metaData.getString("myMsg");
System.out.println("myMsg:"+msg);

注意问题

形如:

<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中引用此值。
<think>我们有一个Maven项目,其中pom.xml配置了maven-shade-plugin来打包,并且有两个system作用域的依赖(md5.jar和icu4j-4.6.jar)。用户想知道如何正确引用这些外部包(即system作用域的依赖)。 根据之前的讨论,我们知道system作用域的依赖需要正确配置路径,并且在使用shade插件时,可能需要设置<includeSystemScope>true</includeSystemScope>来包含这些依赖(但在用户当前的配置中,这个标签被删除了?)。 用户当前的pom片段中,在shade插件配置里没有包含<includeSystemScope>true</includeSystemScope>,那么默认情况下,shade插件不会包含system作用域的依赖。 因此,我们需要在shade插件的配置中添加<includeSystemScope>true</includeSystemScope>,以确保这些外部JAR被打包进最终的JAR中。 另外,需要确认这两个依赖的路径是否正确(即${project.basedir}/lib/下的jar文件确实存在)。 步骤: 1. 在maven-shade-plugin的配置中添加<includeSystemScope>true</includeSystemScope>。 2. 确保依赖的路径正确,且文件存在。 修改后的shade插件配置如下: ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <!-- 添加以下以包含system作用域的依赖 --> <includeSystemScope>true</includeSystemScope> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.hw.dataasset.wfsystem.publicAtuoFrom.PublicYjAutoFrom</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> ``` 同时,依赖部分已经正确声明(如用户所给)。 注意:如果不想构建到本地仓库,仍然可以使用`mvn clean package`命令,这样只会在target目录生成包含所有依赖(包括system作用域)的fat jar。 如果构建仍然失败,请检查: - lib目录下的jar文件是否存在,且路径正确。 - 如果使用IDE,可能需要重新导入Maven项目。 此外,建议考虑将这两个jar安装到本地Maven仓库(使用mvn install:install-file命令)或者使用私服,以避免system作用域带来的可移植性问题。但用户明确表示不想构建到本地Maven仓库,所以这里就不展开了。 因此,回答重点:在shade插件配置中加入<includeSystemScope>true</includeSystemScope>。 根据规则,最后需要提出3-5个相关问题。 </think>### 如何正确引用外部包(System作用域依赖) 在您的Maven配置中,您已经正确地声明了system作用域的依赖(如md5.jar和icu4j-4.6.jar)。要使这些外部包在打包时被正确包含,需要以下关键配置: 1. **添加包含system作用域指令** 在maven-shade-plugin中添加`<includeSystemScope>true</includeSystemScope>`: ```xml <plugin> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <configuration> <includeSystemScope>true</includeSystemScope> <!-- 添加此 --> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.hw...PublicYjAutoFrom</mainClass> </transformer> </transformers> </configuration> </plugin> ``` 2. **验证文件路径存在** 确保`${project.basedir}/lib/`目录下存在对应的JAR文件: ``` your-project/ ├── lib/ │ ├── md5.jar ← 必须存在 │ └── icu4j-4.6.jar ← 必须存在 ├── src/ └── pom.xml ``` 3. **完整依赖声明示例** ```xml <dependencies> <dependency> <groupId>com.hw</groupId> <artifactId>md5</artifactId> <version>1.0</version> <scope>system</scope> <systemPath>${project.basedir}/lib/md5.jar</systemPath> </dependency> <dependency> <groupId>com.ibm</groupId> <artifactId>icu4j</artifactId> <version>1.0</version> <scope>system</scope> <systemPath>${project.basedir}/lib/icu4j-4.6.jar</systemPath> </dependency> </dependencies> ``` ### 注意事项 -`mvn clean package`后检查`target/*.jar`文件大小,确认外部包已包含 - 若路径错误会导致报错:`systemPath points to non-existing file` - 建议升级maven-shade-plugin到3.5.1以获得更好的兼容性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值