如何在自己的进程中使用库将分析添加到Android应用程序

时间:2016-02-24 17:12:44

标签: android google-analytics multiprocessing

我有一个使用Google Analytics的Android应用程序。作为recommended by Google,它会覆盖android.app.Application并在其AndroidManifest.xml中提供类名:

<application
    android:name=".MyApplication">

我的应用依赖于一个包含必须在自己的进程中运行的服务的库。因此,其AndroidManifest.xml具有:

<application>
    <service
        android:name="org.myservice"
        android:enabled="true"
        android:exported="false"
        android:process=":myservice">

运行时,我发现在库的进程中启动了第二个独立的MyApplication实例。这会尝试设置分析等。但是库从不要求这个类,也不想要它。

我试图在库的AndroidManifest.xml中声明一个不同的应用程序类,但这会导致“清单合并失败”构建错误。

如何使图书馆流程不依赖MyApplication

1 个答案:

答案 0 :(得分:2)

因为清单合并在一起,所以只能由android:name指定一个类(在一个库或主应用程序中)。其中一个对象将按进程实例化。

我的解决方案是让Main应用程序类检测进程名称是否与APPLICATION_ID匹配。这只适用于主流程,而不适用于任何其他流程。

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        // The print library has its own process but will use this class.
        // Only set up analytics if we are in the main process.
        if (isMainProcess()) {
            // Once-per-app code here
        }
    }

    public boolean isMainProcess() {
        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        for (RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
            if (processInfo.pid == android.os.Process.myPid()) {
                return TextUtils.equals(BuildConfig.APPLICATION_ID,
                        processInfo.processName);
            }
        }
        return false;
    }
}