Application多次初始化

Android  小知识  2023年8月20日 am8:08发布1年前 (2023)更新 城堡大人
96 0 0

前言

如果一个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多次初始化问题

 历史上的今天

  1. 2020: Android动画之帧动画(Frame动画)(0条评论)
  2. 2019: 周国平:对自己的人生负责(0条评论)
版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

个人常用的GridView方法简介

前言Android中GridView还是比较常用的,GridView有些方法或者配置属性都是比较常用也比较容易忘记的。因此,今天抽空整(抄)理(袭)一下,以便查阅。PS: 现在RecyclerView比较多了正文GridView跟ListView有很多一样的属性或者方法。因此这里就更简...

[代码片段]Android像素转换工具类

前言移动项目需要根据设备进行适配,这个还是很有用的,摘抄于此,方便自己查阅。正文public class DensityUtil { public static int dip2px(float dpValue) { return (int) (dpValue * R...

Seekbar的一些总结

前言seekbar是很常见的,也用的比较多,今天就整理一些seekbar相关的知识。老生常谈,会的就跳过吧,这里只是简单的记录而已。正文如果不改变seekbar的progressDrawable和thumb,也就是用APP的主题样式,一般情况比较丑或者跟设计不符合,基本上都需要改动。我们...

Android之获取图片高宽方法的简单记录

前言本文非原创,大佬的基础上进行修改和调试,下面三种方式我都测试过。感谢大佬们分享。好记性不如烂笔头总结如果只获取高宽,推荐使用BitmapFactory.Options如果要加载图片和获取高宽,推荐使用Glide如果只是加载jpg图片,可以考虑ExifInterface,否则不推荐...

Android在线源码查看

前言记录一下在线看源码的几个地方,方便自己查阅。本文摘抄的。正文aospxref网址:http://aospxref.com/优点:更新速度快缺点:历史版本较少androidxref网址:http://androidxref.com/优点:历史版本较多缺...

Android View Binding的使用简介

前言简单记录一下,方便自己查阅。好记性不如烂笔头正文PS: 本文内容大都摘抄,感谢什么是View BindingView Binding是Android Studio 3.6推出的新特性,目的是为了替代findViewById(内部实现还是使用findViewById)。在启动视图绑...