Android应用的发布需要面对各种各样的市场,我们称之为渠道。有的时候,我们需要知道应用是从哪个渠道下载的。比如,我们可能需要统计哪些市场带来的用户量比较大。再比如,我们可能有一些盈利需要和具体的渠道进行分成。这些都是统计渠道的信息。
一般如何在应用中加入渠道信息?
为了统计渠道信息,就不得不在程序的某个地方加入渠道的信息,然后针对不同的渠道打不同的包。一般可以在Manifest文件中加入渠道编号,而不直接写在代码中。这样做的好处是,可以针对不同渠道,自动化去修改Manifest文件中的渠道编号,然后自动为该渠道打包。
Manifest文件支持Meta Data标签,建议使用这种自定义标签。例如下面的文件片段。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="X" android:versionName="X.X.X" package="com.XXX"> …… <application android:icon="@drawable/icon" android:label="@string/app_name"> …… <meta-data android:name="CHANNEL" android:value="C_001" /> </application> </manifest> |
在这段代码示例中,我们在Application节点下增加了一个meta-data标签,名称是CHANNEL,值是C_001,是我们规定的一个渠道的编号。
为不同的渠道打包,就要手工或者自动化修改C_001成为C_002、C_003等等其它我们定义的渠道编号,然后再打不同的包。
程序如何读取打包的渠道编号?
在程序代码中,可以读取Manifest文件中定义的meta-data。以下为代码实例。
public static String getChannelCode(Context context) { String code = getMetaData(context, "CHANNEL"); if (code != null) { return code; } return "C_000"; }
private static String getMetaData(Context context, String key) { try { ApplicationInfo ai = context.getPackageManager().getApplicationInfo( context.getPackageName(), PackageManager.GET_META_DATA); Object value = ai.metaData.get(key); if (value != null) { return value.toString(); } } catch (Exception e) { // } return null; } |