Android Application中的OnCreate方法执行两次

2024-04-23 18:18

本文主要是介绍Android Application中的OnCreate方法执行两次,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在Application中开启了一个子线程,但是每次子线程都会执行两次,非常郁闷。

这时候看它执行两次的时候就去验证他的大方法是否执行了两次,然后发现线程创建了两次;

再看他的大方法执行了几次,它的大方法就是OnCreate方法,虽然我觉得它不会执行两次,但是我们一定要进行排除,否则任何一种情况都会出现。

所以打了个Log发现OnCreate方法也执行了两次。

这就找到根由了,所以在网上找了Application的OnCreate方法为什么会执行两次,就解决了。

因为这次卡壳了一天,所以就写下来记录一下,这里有两点需要注意,

第一就是找错的方法,一定要逐个排查,把它们的值打出来,在你找到错误地方之前任何一个地方都是有可能出错的,不要觉得某个地方一定不会出错;

第二个就是这个知识点,下边记录一下。



以下为转载内容,附上原地址:http://blog.csdn.net/chy555chy/article/details/51374603



在做"个推"时发现官方文档中有这么一个注释:

该方法必须在Activity或Service类内调用,一般情况下,可以在Activity的onCreate()方法中调用。由于应用每启动一个新的进程,就会调用一次Application的onCreate()方法,而个推SDK是一个独立的进程,因此如果在Application的onCreate()中调用intialize接口,会导致SDK初始化在一个应用中多次调用,所以不建议在Application继承类中调用个推SDK初始化接口。

        解释一下,每个Android应用都要运行在一个虚拟机上,”个推“采用Service和后台服务器通信进行通信,于是和原本的Activity就形成了多进程。一个前台的应用进程,一个service后台进程,每个进程对应一个application对象,所以当应用配置了多个进程的时候,application对象的onCreate方法就会执行多次,所以为了保证只初始化一次,就必须做出区分的处理的(“个推”中提到的在Activity或Service中初始,这种做法个人认为也是存在多次初始化的风险的)

        进程名是通过Manifest.xml中的"android:process"属性设置的,因此可以在application的onCreate方法中通过pid获取processName,再做进一步的判断(跟android:process的值进行判断)使得相关初始化代码仅执行一次。

在application中添加如下代码:

	@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();String processName = getProcessName(this, android.os.Process.myPid());if(processName != null){boolean defaultProcess = processName.equals("com.qebang.ui");if(defaultProcess){//当前应用的初始化				initApp();}}}

  public static String getProcessName(Context cxt, int pid) {
       ActivityManager am = (ActivityManager) cxt.getSystemService(Context.ACTIVITY_SERVICE);
       List<RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
       if (runningApps == null) {
           return null;
       }
       for (RunningAppProcessInfo procInfo : runningApps) {
           if (procInfo.pid == pid) {
               return procInfo.processName;
           }
       }
       return null;
   }
 

 




这篇关于Android Application中的OnCreate方法执行两次的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/929537

相关文章

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

如何将Python彻底卸载的三种方法

《如何将Python彻底卸载的三种方法》通常我们在一些软件的使用上有碰壁,第一反应就是卸载重装,所以有小伙伴就问我Python怎么卸载才能彻底卸载干净,今天这篇文章,小编就来教大家如何彻底卸载Pyth... 目录软件卸载①方法:②方法:③方法:清理相关文件夹软件卸载①方法:首先,在安装python时,下

电脑死机无反应怎么强制重启? 一文读懂方法及注意事项

《电脑死机无反应怎么强制重启?一文读懂方法及注意事项》在日常使用电脑的过程中,我们难免会遇到电脑无法正常启动的情况,本文将详细介绍几种常见的电脑强制开机方法,并探讨在强制开机后应注意的事项,以及如何... 在日常生活和工作中,我们经常会遇到电脑突然无反应的情况,这时候强制重启就成了解决问题的“救命稻草”。那

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

Python中的魔术方法__new__详解

《Python中的魔术方法__new__详解》:本文主要介绍Python中的魔术方法__new__的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、核心意义与机制1.1 构造过程原理1.2 与 __init__ 对比二、核心功能解析2.1 核心能力2.2

Python Transformer 库安装配置及使用方法

《PythonTransformer库安装配置及使用方法》HuggingFaceTransformers是自然语言处理(NLP)领域最流行的开源库之一,支持基于Transformer架构的预训练模... 目录python 中的 Transformer 库及使用方法一、库的概述二、安装与配置三、基础使用:Pi

关于pandas的read_csv方法使用解读

《关于pandas的read_csv方法使用解读》:本文主要介绍关于pandas的read_csv方法使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录pandas的read_csv方法解读read_csv中的参数基本参数通用解析参数空值处理相关参数时间处理相关

前端下载文件时如何后端返回的文件流一些常见方法

《前端下载文件时如何后端返回的文件流一些常见方法》:本文主要介绍前端下载文件时如何后端返回的文件流一些常见方法,包括使用Blob和URL.createObjectURL创建下载链接,以及处理带有C... 目录1. 使用 Blob 和 URL.createObjectURL 创建下载链接例子:使用 Blob

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.