安卓app/framework开发中meta-data数据剖析作用及实战

26 阅读2分钟

背景:

在做安卓app开发时候,特别是经常接入人家某些公司sdk时候经常会要求在AndroidManifest.xml中使用到一个标签meta-data, 相信大家如果不是之前没有深入接触过meta-data相关知识时候可能还是会比较陌生。 那么本文就来带大家学习一下meta-data真实作用和相关实战。

官方解释:

参考链接: developer.android.com/guide/topic…

developer.android.google.cn/guide/topic… 在这里插入图片描述 辅助解释

meta-data一般在AndroidManifest使用语法:

<meta-data android:name="string"
           android:resource="resource specification"
           android:value="string" />

这个meta-data标签可以包含在下面几个标签

<activity>
<activity-alias>
<application>
<provider>
<receiver>
<service> 

meta-data的作用说明: meta-data(元数据),主要用来定义一些组件相关的额外附加配置键值。AndroidManifests.xml下的meta-data是对外界开放的,是向系统注册的信息,系统及外界是可以通过相关API获取到meta-data的信息。因为AndroidManifest.xml组件相关的标签都是固定,不允许额外添加针对这个组件相关的标签和数据,所以这个时候如果有想要针对某一组件设置额外的数据,那么就需要使用到meta-data标签数据。

相关案例: 屏幕适配

< meta-data
      android:name="android.max_aspect"
      android:value="2.1" />

设置桌面快捷方式:

< meta-data
       android:name="android.app.shortcuts"
       android:resource="@xml/shortcuts" />

还有接入一些地图sdk情况

< meta-data
      android:name="com.amap.api.v2.apikey"
      android:value="oooooooooooooxxxxxxxxxxxx" />

那么接下来实战展示一下使用meta-data

实战开发使用meta-data

第1步: AndroidManifest中定义相关meta-data

在这里插入图片描述

第2步: 程序中读取Manifest中配置meta-data


    String getActivityMetaData() {
        String value ="";
        try {
            ActivityInfo info = getPackageManager().getActivityInfo(this.getComponentName(),PackageManager.GET_META_DATA);
            value = info.metaData.getString("com.test.anrdemo");
        }catch (Exception e) {
            e.printStackTrace();
        }
        return value;
    }

    String getApplicationMetaData() {
        String value ="";
        try {
            ApplicationInfo info = getPackageManager().getApplicationInfo(getPackageName(),PackageManager.GET_META_DATA);
            value = info.metaData.getString("com.test.anrdemo");
        }catch (Exception e) {
            e.printStackTrace();
        }
        return value;
    }

然后通过TextView进行展示

otherDisplayWindow.setText(" activity meta value = " +getActivityMetaData() + 
" \n application meta value = "+getApplicationMetaData());

运行结果: 在这里插入图片描述

这里只展示出来了自己应用获取自己配置的meta-data,其实还有更多场景是system_server也可以使用和读取 系统端获取meta-data情况: 获取meta-data代码修改: frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java 中的startActivityUnchecked加入如下代码

        ActivityInfo activityInfo = mService.getPackageManagerInternalLocked().getActivityInfo(r.mActivityComponent,PackageManager.GET_META_DATA,0,0);
        android.util.Log.i("lsm88888888","getActivityInfo "+activityInfo + " meta-data "+activityInfo.metaData);

结果打印如下: 在这里插入图片描述

总结:

meta-data其实无论在普通app开发还是系统开发过程中都是非常重要的,可以在app的AndroidManifest中配置相关的自定义数据,然后在代码中可以获取到AndroidManifest配置的meta-data数据,不仅仅app进程自己可以获取到这个数据,其他进程也可以获取到这个meta-data数据,这样对于系统识别一些Activity特性时候就提供了重要的依据。

文章参考来源:mp.weixin.qq.com/s/Qv8zjgQ0C…

更多framework相关技术干货,请关注下面“千里马学框架”