首页 > 系统相关 >Android多进程时Application初始化问题

Android多进程时Application初始化问题

时间:2023-04-26 15:02:38浏览次数:49  
标签:初始化 return Application static Android onCreate public

原文地址 blog.csdn.net

之前在做项目时,遇到一个大坑,就是我的APP 的Application 的onCreate方法,竟然执行了好几次,这就导致我在onCreate里面做了一些初始化的操作被重复执行了,导致奇怪的bug产生。后来冷静下来分析一下,才发现有一些第三方组件,比如百度推送之类的,它们是单独开了一个进程,那么每个进程会自己初始化自己的Application,那自然onCreate方法会多次执行。准确的说就是你的APP里有多少个进程,就会初始化多少次Application 。

但是有的东西就是只需要在Application 的onCreate 里只初始化一次。那怎么解决呢?看代码:



1.  public class MyApplication extends Application {
2.      private final static String PROCESS_NAME = "com.test";
3.      private static MyApplication myApplication = null;

5.      public static MyApplication getApplication() {
6.          return myApplication;
7.      }

9.      /**
10.       * 判断是不是UI主进程,因为有些东西只能在UI主进程初始化
11.       */
12.      public static boolean isAppMainProcess() {
13.          try {
14.              int pid = android.os.Process.myPid();
15.              String process = getAppNameByPID(MyApplication.getApplication(), pid);
16.              if (TextUtils.isEmpty(process)) {
17.                  return true;
18.              } else if (PROCESS_NAME.equalsIgnoreCase(process)) {
19.                  return true;
20.              } else {
21.                  return false;
22.              }
23.          } catch (Exception e) {
24.              e.printStackTrace();
25.              return true;
26.          }
27.      }

29.      /**
30.       * 根据Pid得到进程名
31.       */
32.      public static String getAppNameByPID(Context context, int pid) {
33.          ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
34.          for (android.app.ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
35.              if (processInfo.pid == pid) {
36.                  return processInfo.processName;
37.              }
38.          }
39.          return "";
40.      }

42.      @Override
43.      public void onCreate() {
44.          super.onCreate();

46.          myApplication = this;

48.          if (isAppMainProcess()) {
49.              //do something for init
50.          }
51.      }
52.  }


标签:初始化,return,Application,static,Android,onCreate,public
From: https://www.cnblogs.com/cps666/p/17356073.html

相关文章

  • Android之Service设置android:process作用
    原文地址blog.csdn.net在AndroidManifest.xml中定义service时会看到这样的代码android:process=”:remote”,例如:1.<service2.android:3.android:enabled="true"4.android:exported="false"5.android:process=":remote"/&g......
  • Android音频开发之音频基本概念
    原文地址www.jianshu.comAndroid音频开发之音频基本概念音频采集一般使用AudioRecod或者MediaRecord音频采集的来源是什么?MediaRecorder.AudioSource.MIC一般是麦克风采样率(单位:赫兹)每秒钟音频采样点个数(8000/44100Hz),模拟信号数字化的过程,用0101来表示的数......
  • Android音频开发之AudioTrack
    原文地址www.jianshu.com在前两节中分享了Android音频开发之音频基本概念和Android音频开发之音频采集,本文分享的是如何使用AudioTrack来播放使用AudioRecord采集后的PCM数据。构造AudioTrack实例publicAudioTrack(intstreamType,intsampleRateInHz,intcha......
  • Android音频开发之音频采集
    原文地址www.jianshu.comAndroid音频开发之音频采集在Android系统中,一般使用AudioRecord或者MediaRecord来采集音频。AudioRecord是一个比较偏底层的API,它可以获取到一帧帧PCM数据,之后可以对这些数据进行处理。而MediaRecorder是基于AudioRecorder的API(最......
  • Correct the classpath of your application so that it contains a single, compatib
    1.背景有时候引入包有冲突,比如在Maven项目中的不同模块多次重复引入等这里遇到的问题是重复映入了如下包:<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.0-RELEASE</vers......
  • 容器的初始化
    个人认为容器最规范的初始化有三种:1.花括号初始化:1vector<string>v1{"a","an"};适用于已知容器中元素的个数以及元素的值的情况2.圆括号1vector<string>v1(10);//不推荐2//或3vector<string>v1(10,"");适用于已知元素的个数但不知元素的值的情况,注意圆括号不能用......
  • Android 开发中打印日志
    在Android开发过程中,我们常常需要打印堆栈来定位问题或者调试问题,这里记录一下相关的方法。1.MTK平台1.1preloader 1.2LK 2.高通平台2.1sbl 2.2xbl 2.3abl  3.kernel  4.native层4.1打印堆栈 Android.bpcc_binary{name:"print_s......
  • 【动手学深度学习】第四章笔记:多层感知机、权重衰减、暂退法、数值稳定性和模型初始化
    为了更好的阅读体验,请点击这里4.1多层感知机4.1.1隐藏层由于仿射变换中的线性是一个很强的假设,因此导致了线性模型可能会不适用。线性意味着单调假设:任何特征的增大都会导致模型输出的增大或者模型输出的减小。但是违反单调性的例子比比皆是。除此之外,分类任务中,仅依托像素......
  • Xamarin.Android给 EditText 添加焦点的扩展方法
    ///<summary>///定义了一个扩展方法SetFocus,作用是设置EditText控件的焦点,并可以选择全部选中或者仅选中最后一个字符///给EditText添加焦点的扩展方法,可选择是否全部选中///</summary>///<paramname="ed"></param>......
  • Android开发之一:10.0 USB弹窗权限流程解析
    1.新建activity,获取UsbManagerusbManager=(UsbManager)getSystemService(Context.USB_SERVICE)2.获取所以的USB设备HashMap<String,UsbDevice>map=usbManager.getDeviceList()3.过滤别的USB设备,拿到自己USB的USBDevice类,然后请求USB权限,usbManager.requestPermission(us......