(4.6.12.6)Android中<meta-data>的使用
2016-05-25 17:49
555 查看
概念
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中获取值
Type | Bundle 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()呢?
为了避免这种情况:
可以在形如000的字符串前面放个\0空字符,强迫android按照字符串解析000。
在资源文件中指定需要的值,然后在metadata的value中引用此值。
相关文章推荐
- Android 上传图片到服务器
- 为Android Studio2.1.1增加注释函数
- 【android】:android的工程路径都是啥
- 王学岗自定义控件(一)
- Android GridLayout中元素平分且行充满屏幕(计算器的界面效果)
- OverFlowButton的替换方式
- 【Android】如何获取TextView的控件宽度以及字体宽度
- Android 使用addview生成列表,界面切换时将指定的行数滚动到列表的第一行
- android内存溢出问题
- [置顶] Android自定义ViewGroup(四、打造自己的布局容器)
- Android控件系列之RadioButton&RadioGroup
- Android自定义ViewGroup(四、打造自己的布局容器)
- android蓝牙开发---与蓝牙模块进行通信
- Android技巧之封装Log工具类
- Android 6.0 ConfirmCredential
- Android Studio 2.1.1 更换主题 代码样式
- android 蓝牙编程重点---如何发送和接收16进制数据
- android 基础 线程池 4种创建方式
- GitHub Top 100的Android开源库
- Android坐标系统常用方法属性总结