Android应用设置为Launcher时onCreate启动俩次的问题

这几天有个需求就是把自己的应用程序要设置为Launcher的形式,设置后onCreate就会启动俩次,在网上找了资料后说是横竖屏设置造成的先说结果:在MainAcitivity里设置android:configChanges="mcc|mnc"就能解决问题的。

今天在看log的时候发现,Launcher activity会被onDestroy掉一次,然后再重启。

可能原因猜测:

1.横竖屏切换

2.MCC MNC等Configuration改变引起的 MCC(移动国家码)和 MNC(移动网络码)

由于当时的Launcher设置为强制横屏了,应该是不会引起重启的。

对于Configuration改变系统会发一个android.intent.action.CONFIGURATION_CHANGED的广播

于是就做了一个广播接收器去检测是不是由于Configuration改变引起的(后来发现Launcher本身有监听这个广播)

果然发现MCC值由0(未定义)变为460(中国)

原因已经初步确定了,怎么才能让activity不重启呢?

既然是activity重启,那就先去看一下activity有什么属性可以防止重启....

运气实在是好,刚好有这么个属性:

android:configChanges=["mcc", "mnc", "locale", "touchscreen", "keyboard", "keyboardHidden", "navigation", "screenLayout", "fontScale", "uiMode", "orientation", "screenSize", "smallestScreenSize"]

官方的解释是这样的:

Lists configuration changes that the activity will handle itself. When a configuration change occurs at runtime, the activity is shut down and restarted by default, but declaring a configuration with this attribute will prevent the activity from being restarted.
Instead, the activity remains running and itsonConfigurationChanged() method is called.

大致意思也就是说:

那些被列举的属性configuration改变时activity是否保存自己的状态。当应用发生了configuration改变,默认情况下activity将关闭并重启自身,但是如果定义了这个属性,activity将不必重启,它将保持运行状态同时调用onConfigurationChanged()方法。也就是说当不配置android:configChanges="mcc|mnc"时,当mcc或mnc的值发生改变的时候,会重启activity,并且onConfigurationChanged()不会被调用

果然配置了这个属性后Launcher Activity就不会在开机时候启动两次了。

以上方法我测试过是可行的。

资料来源于:http://www.th7.cn/Program/Android/201408/263797.shtml

时间: 2024-10-03 10:44:18

Android应用设置为Launcher时onCreate启动俩次的问题的相关文章

Android设计画面中有EditText时取消启动时自动获得焦点调用系统输入法的方法

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" an

Android设置默认Launcher

当系统存在多个launcher时,若没有设置默认launcher,开机启动后会弹出提示框,罗列所有launcher,用户选择并设置了默认launcher后,按home键以及以后重启都会进入默认的launcher. 现在,我希望系统能直接就进入我设定的launcher而不是弹出框后选择然后设置 网上大部分的做法就是修改 packages/apps/Provision/src/com/android/DefaultActivity.java 和 framework/base/java/com/and

android 系统存在多个Launcher时,设置开机自动进入默认的Launcher

开机完成并解锁后,如果android系统存在多个Launcher,系统会弹出一个选择框让用户选择进入某个Launcher.如果用户不想选择,而是想直接进入某一个默认的Launcher,要怎么修改? 注意:此修改方法对Google Now Launcher(GoogleHome.apk)无效,因为此APP启动Activity的<intent-filter>中无<category android:name="android.intent.category.HOME" /&

Android 当系统存在多个Launcher时,如何设置开机自动进入默认的Launcher?

以设置Google Launcher2作为默认启动的Launcher为例, 其package name 为 com.android.launcher launcher activity name 为 com.android.launcher2.Launcher 1.请在PackageManagerService.java中的systemReady函数的最后中增加以下代码. if(isFirstBoot()) { //MTK ADD BEGIN String examplePackageName

Android应用设置多个启动图标,动态列换应用图标

Android开发三年了,今天才知道,可以给一个应用设置多个应用图标(启动图标),可以在程序中动态更换应用图标,作为一枚有三年工作经验的程序猿,今天才知道这事,被严重鄙视了. 下面就来说说如何给一个应用设置多个应用图标? 1. 如何给一个应用设置多个入口,在launcher桌面上存在多个启动图标? 我们知道,设置一个应用的入口Activity,只需要在AndroidMainfest.xml文件中,在注册activity的节点下添加intent-filter,并设置action属性为acion.M

android实现应用程序只有在第一次启动时显示引导界面

概述 SharedPreferences的使用非常简单,能够轻松的存放数据和读取数据.SharedPreferences只能保存简单类型的数据,例如,String.int等.一般会将复杂类型的数据转换成Base64编码,然后将转换后的数据以字符串的形式保存在 XML文件中,再用SharedPreferences保存. 使用SharedPreferences保存key-value对的步骤如下: (1)使用Activity类的getSharedPreferences方法获得SharedPrefere

隐藏APK在Launcher中的启动图标 android开发教程

隐藏APK在Launcher中的启动图标: APK的AndroidManifest.xml文件的主Activity中删除 intent-filter 中的 <category android:name="android.intent.category.LAUNCHER" />即可. 查看该APK是否安装成功: 查看Settings -> Apps -> All的应用程序列表 启动该APK方法: Intent intent = new Intent(Intent.

【翻译自mos文章】/dev/shm应该设置多大Oracle 实例启动时才能不报ORA-00845

/dev/shm应该设置多大Oracle 实例启动时才能不报ORA-00845 来源于:ORA-00845 - Which value for /dev/shm is needed to startup database without ORA-00845 (文档 ID 1399209.1) 适用于: Oracle Database - Standard Edition - Version 11.1.0.6 and later Information in this document appli

通过nfs网络文件系统启动tiny6410开发板时uboot启动参数的设置 &nbsp;

通过nfs网络文件系统启动tiny6410开发时uboot启动参数应该设置为: console=ttySAC0 lcd=S70 root=/dev/nfs nfsroot=192.168.1.30:/opt/tiny6410/fs/rootfs_mini6410 ip=192.168.1.40:192.168.1.30:192.168.1.30:255.255.255.0:tiny6410:eth0:off 注意:这里一定要指明你的lcd的类型,不然通过nfs成功启动tiny6410时,你的lc