Android meta-data

Android meta-data數據的讀取

meta-data元數據,當我們在集成第三方sdk時會經常遇到,比如百度地圖sdk,talkingData統計等,所以做了一個小總結,以備使用。

在清單文件中,meta-data可以在Application,Activity,Service,Receiver中,在不同的位置,讀取數據的方式有稍微的差別,現寫了一個小demo。

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.dc.metadatasummary01">

    <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <!--位於activity中-->
        <meta-data
            android:name="in_main_activity"
            android:value="I am in activity"></meta-data>
    </activity>

    <service android:name=".DCTestMetaDataService">
        <!--位於服務中-->
        <meta-data
            android:name="in_service"
            android:value="I am in Service"></meta-data>

    </service>

    <receiver android:name=".DCTestMetaDataReceiver">
        <!--位於廣播接收者中-->
        <intent-filter>
            <action android:name="dc_test_meta_data_receiver"></action>
        </intent-filter>
        <meta-data
            android:name="in_receiver"
            android:value="I am in Receiver"></meta-data>
    </receiver>
        <!--位於application中-->
    <meta-data
        android:name="in_application"
        android:value="I am in application"></meta-data>
</application>
</manifest>

1.Activity中拿取數據

ActivityInfo info = this.getPackageManager().getActivityInfo(getComponentName(),PackageManager.GET_META_DATA);
String msg = info.metaData.getString("in_main_activity");

2.Application中拿取數據

ApplicationInfo appInfo = this.getPackageManager().getApplicationInfo(getPackageName(),PackageManager.GET_META_DATA);
String msg = appInfo.metaData.getString("in_application");

3.Service中拿取數據

ComponentName cn = new ComponentName(this, DCTestMetaDataService.class);
ServiceInfo info2 = this.getPackageManager().getServiceInfo(cn, PackageManager.GET_META_DATA);
String msg = info2.metaData.getString("in_service");

4.Receiver中拿取數據

ComponentName cn = new ComponentName(context, DCTestMetaDataReceiver.class);
ActivityInfo info = context.getPackageManager().getReceiverInfo(cn, PackageManager.GET_META_DATA);
String msg = info.metaData.getString("in_receiver");

MainActivity代碼

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //拿取activity中的元數據
        ActivityInfo info = null;
        try {
            info = this.getPackageManager()
                    .getActivityInfo(getComponentName(),
                            PackageManager.GET_META_DATA);
            String msg = info.metaData.getString("in_main_activity");
            Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG).show();
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }

        //拿取application中的元數據
        ApplicationInfo appInfo = null;
        try {
            appInfo = this.getPackageManager()
                    .getApplicationInfo(getPackageName(),
                            PackageManager.GET_META_DATA);
            String msg = appInfo.metaData.getString("in_application");
            Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG).show();
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }

        //開啓服務
        startService(new Intent(MainActivity.this, DCTestMetaDataService.class));

        //發送廣播
        Intent intent = new Intent();
        intent.setAction("dc_test_meta_data_receiver");
        sendBroadcast(intent);
    }

    @Override
    protected void onDestroy() {
        //關閉服務
        stopService(new Intent(MainActivity.this, DCTestMetaDataService.class));
        super.onDestroy();
    }

DCTestMetaDataReceiver代碼


/**
 * @author zyc
 *  created at 2016/4/22 18:01
 */
public class DCTestMetaDataReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        if (TextUtils.equals(intent.getAction(), "dc_test_meta_data_receiver")) {
            ComponentName cn = new ComponentName(context, DCTestMetaDataReceiver.class);
            ActivityInfo info = null;
            try {
                info = context.getPackageManager()
                        .getReceiverInfo(cn, PackageManager.GET_META_DATA);
                String msg = info.metaData.getString("in_receiver");
                Toast.makeText(context, msg, Toast.LENGTH_LONG).show();
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
}

DCTestMetaDataService代碼

/**
 * @author zyc
 * created at 2016/4/22 11:42
 */
public class DCTestMetaDataService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //拿到meta-data元數據
        ComponentName cn = new ComponentName(this, DCTestMetaDataService.class);
        ServiceInfo info2 = null;
        try {
            info2 = this.getPackageManager().getServiceInfo(cn, PackageManager.GET_META_DATA);
            String msg = info2.metaData.getString("in_service");
            Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

ok,so easy……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章