Android系统开发 - 扩展Androidmanifest.xml文件中<application>标签的属性
来源:互联网 发布:皮蓬季后赛数据 编辑:程序博客网 时间:2024/05/16 08:41
如下Android的流行,Android平台的开放性有其必然的优势,使得更多的厂商投入到基于Android平台开发当中,但是过多没有公共规范的定制化使得各个厂商也不会走的太远,而对开发者而言,开发一款杀手级的且能在大多android设备中运行的应用也愈来愈难。
有点离题了,现在言归正传,开发过程中可能基于某种原因需要扩展manifest文件中的application标签或其他标签的属性,此处以扩展application标签属性为例说明其需要的步骤。Android系统版本为ICS
1. 扩展属性,那么首先需要在系统的manifest属性文件中声明需要添加的属性,文件位置:/源码/framework/base/core/res/res/values/attr_manifest.xml
// 声明属性<attr name="myTestProp" format="string" />//在需要添加该属性的标签的样式声明文件中中添加属性<declar-styleable name="AndroidManifestApplication" parent="AndroidManifest">......<attr name="myTestProp" />......</declare-styleable>
2. 添加该属性的资源号,每个属性都有对应的资源号,这样才能被系统找到。就想R文件中的各个资源的资源号一样。文件位置:/源码/framework/base/core/res/res/values/public.xml
//在文件的最下方添加<public type="attr" name="myTestProp" id="0x010103aa" />其中type取决于你所添加属性的类型,我们这所添加的就是属性‘Attr', 如添加的是颜色相关的属性,那么type=’Color‘;还有比较重要的一点就是id的指定是public文件中最下面那一项的id+1,id号是顺序递增的,千万别和已有的重复,不然系统找不到你所定义的属性了
3. 系统属性声明完了,而我们是扩展的Application标签的属性,所以也要在Framework层对应的ApplicationInfo.java中添加对应的属性
文件位置:/源码/framework/base/core/java/android/content/pm/ApplicationInfo.java
// 进程间通过Parcelable传递信息public class ApplicationInfo extends PackageItemInfo implements Parcelable {...public String myTestProp;...public ApplicationInfo(ApplicationInfo orig) {...myTestProp = orig.myTestProp;...}public void writeToParcel(Parcel dest, int parcelableFlags) { ...dest.writeString(myTestProp); }private ApplicationInfo(Parcel source) {...// 我们定义的myTestProp的类型是String的,所这里用的是readStringmyTestProp = source.readString();}}
好了,经过上述几步以后,系统可以正确的识别你新添加的属性了,于是你觉得系统修改完成了,所以开始编译img
make update-api -j4 //这个很重要的哦,你添加了系统属性,所以需要更新系统api接口的make -j4
是不很简单?那么我们会很高兴的在编写app的时候自由的使用我们刚刚添加的属性了,当然如果你是需要在eclipse里编译你的app,那么需要根据你所更改的系统重新编译sdk文件导入到eclipse中,这样你app的Androidmanifest文件里的android:myTestProp才能被识别。
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" android:myTestProp="test"> <activity android:name=".MainActivity" android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
当你高高兴兴的发现编译过的app在系统中运行的时候,发现没有读到你在manifest文件中android:myTestProp的值,是不是感到很疑惑?其实不用疑惑。仔细想想变可知道原因。Android系统在安装应用的时候,首先都是通过PackageManagerService(其实是PackageParser)解析Androidmanifest.xml文件来获取所需要的信息的,以后根据获取的信息再通过ActivityManagerService等来管理和运行。所以我们在上面缺失了一个重要的步骤:就是解析、读取新添加属性的值
4. 系统解析manifest文件的对应的代码在:/源码/framework/base/core/java/android/content/pm/PackageParser.java
private boolean parseApplication(Package owner, Resources res, XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) throws XmlPullParserException, IOException { final ApplicationInfo ai = owner.applicationInfo; final String pkgName = owner.applicationInfo.packageName;...// 此处就是将manifest文件中的属性值给解析出来,便于后边系统使用// com.android.internal.R.styleable.AndroidManifestApplication_myTestProp 这个代表myTestProp所对应的资源idai.myTestProp = sa.getString(com.android.internal.R.styleable.AndroidManifestApplication_myTestProp);}
好了,再次make -j4后就可以正常使用了。
- Android系统开发 - 扩展Androidmanifest.xml文件中<application>标签的属性
- Android中AndroidManifest.xml中<application>标签的常用元素
- AndroidManifest.xml中的<application标签中的android:name属性介绍
- AndroidManifest.xml文件详解(application标签)
- AndroidManifest.xml文件详解(application标签)
- AndroidManifest文件中属性<application android:allowBackup="false">
- AndroidManifest.xml标签属性
- Android AndroidManifest.xml文件的android:supportsRtl属性详解
- Android AndroidManifest.xml文件的android:supportsRtl属性详解
- Android AndroidManifest.xml文件的android:supportsRtl属性详解
- Android AndroidManifest.xml文件的android:supportsRtl属性详解
- Android AndroidManifest.xml文件的android:supportsRtl属性详解
- Android AndroidManifest.xml文件的android:supportsRtl属性详解
- Android AndroidManifest.xml文件的android:supportsRtl属性详解
- Android AndroidManifest.xml文件的android:supportsRtl属性详解
- Android AndroidManifest.xml文件的android:supportsRtl属性详解
- AndroidManifest文件中android属性
- AndroidManifest文件中android属性
- SQL的执行顺序
- obj-c 读取文件 。
- VC 调用 cmd
- 关于DEVICE_ATTR使用方法的总结
- 简介 AlloyImage - 基于HTML5技术的专业图像处理库
- Android系统开发 - 扩展Androidmanifest.xml文件中<application>标签的属性
- VS2012网布网站与IIS配置
- 建立arm-linux-gcc交叉编译环境
- obj-c 定义一个类
- 【MVC系列解决方案】MVC中如何自定义二级域名
- 七大感触——You Only Live Once
- VMware Linux下挂接U盘
- java操作符说明
- stl container 比较。太大了。分开列了。