在维护一个 android 组件的 activity 组件的时候遇到一个小需求,不同 APP 引用这个组件需要不同的部分显示,如 TextView ,ImageView,还有改变 text 的颜色,于是牵扯到怎么将参数传递到 AndroidManifest.xml 的 Activity 中…

这里 meta-data 有两种放置方法:

由于 Activity 是 application 的子节点于是可以将 meta-data 放至 application 下面,与 Activity 同级也可以放至 需要用的 Activity 节点下面,放到 application 下的话就全部 Activity 都能拿到这个数据,负责就只有父 Activity 可以拿到

      <!-- 放置 application 下,activity1 和 activity2 都可以获取到数据 -->

    <application >
      <activity android:name="com.zmide.activity1"
          android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
      </activity>
      <activity android:name="com.zmide.activity2"
          android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
      </activity>

      <meta-data android:name="data1" android:value="Test" />
      <meta-data android:name="data2" android:value="#1bbb63" />

    </application>

      <!-- 放置 activity 下,只有 activity2 都可以获取到数据 -->

    <application >
      <activity android:name="com.zmide.activity1"
          android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
      </activity>
      <activity android:name="com.zmide.activity2"
          android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
          <meta-data android:name="data1" android:value="Test" />
          <meta-data android:name="data2" android:value="#1bbb63" />
      </activity>

    </application>

放置不同位置我们获取数据的对象也有点不太相同,application 下使用 ApplicationInfo

try {
            ApplicationInfo appInfo = getPackageManager().getApplicationInfo(this.getPackageName(),  PackageManager.GET_META_DATA);
            Bundle bundle = appInfo.metaData;

            String data1 = bundle.getString("data1");
            String data2 = bundle.getString("data2");

            if(data1 != null){
                Log.d("测试",data1);
            }
            if(data2 != 0){
                Log.d("测试",data2);
            }

        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }

如果放置在 activity 节点下的话需要使用 ActivityInfo

try {
		ActivityInfo appInfo = getPackageManager().getActivityInfo(this.getComponentName(),
					PackageManager.GET_META_DATA);
		Bundle bundle = appInfo.metaData;

		String data1 = bundle.getString("data1");
                int data2 = bundle.getInt("data2");

                if(data1 != null){
                    Log.d("测试",data1);
                }
                if(data2 != 0){
                    Log.d("测试",data2);
                }

	} catch (PackageManager.NameNotFoundException e) {
		e.printStackTrace();
	}

从 Bundle 取数据的话有 getString(),getInt(),getBoolean(),getFloat()

这里值得注意的是传颜色值 #669966 使用的也是 getInt(),取到的颜色数值就可以直接使用了

findViewById(R.id.text).setTextColor(Bundle.getInt("data2"));

也可以直接传入资源 ID

<meta-data android:name="app_name"
          android:resource="@string/appname" />

当然取到的资源 ID 是不能直接使用的,需要 getResource.get... 去获取一下

 try {
            ActivityInfo activityInfo = getPackageManager().getActivityInfo(getComponentName(),
                    PackageManager.GET_META_DATA);
            // 获取到的是 @string/appname 对应的资源id值
            int value = activityInfo.metaData.getInt("app_name");
            Log.d("Activity Tag", "resource_id : " + value);  

            String[] aString = getResources().getStringArray(value);
            for (int i = 0; i < aString.length; i++) {
                Log.i(TAG, "onCreate: " + aString[i]);
           }
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }

好像没啥可以写的了,好叭……今天的坑就踩到这 ( ^_^ )/~~