前言

如果一个apk中在设置多进程,也就是在AndroidManifest.xml中,通过android:process属性配置。

<activity
    android:name=".OneActivity"
    android:exported="true"
    android:launchMode="singleInstance">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity
    android:name=".Twoctivity"
    android:exported="true"
    android:launchMode="singleInstance"
    android:process=":another_process">
        <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

配置下面属性,表示OneActivity和Twoctivity在不同的进程中。

android:process=":another_process"

配置后,重写Application就会执行两次onCreate()并重新初始化了,但我不需要初始化两次。

正文

解决方法,就是对进程包名判断,下面是我测试通过的一种。

代码片段

在Application中

@Override
public void onCreate() {
    super.onCreate();
    if (TextUtils.equals(getCurrentProcessName(this), getPackageName())) {
        //做初始化操作
    }
}
private String getCurrentProcessName(Context context) {
    int myPid = android.os.Process.myPid();
    ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    for (ActivityManager.RunningAppProcessInfo runningAppProcessInfo : mActivityManager.getRunningAppProcesses()) {
        if (runningAppProcessInfo.pid == myPid) {
            return runningAppProcessInfo.processName;
        }
    }
    return null;
}

日志打印

调试中特意打印了包名

#第一次
getPackageName()        : com.biumall.media
getCurrentProcessName() : com.biumall.media
#第二次
getPackageName()        : com.biumall.media
getCurrentProcessName() : com.biumall.media:another_process

我们的初始化是getPackageName()和getCurrentProcessName()获取的是一样时

参考文章

  1. Application多次初始化问题

相关文章

暂无评论

none
暂无评论...