Launcher Activity在开机时重启两次解决办法

本文探讨了LauncherActivity在特定情况下重启的原因,并通过配置android:configChanges属性来避免因MCC和MNC变化导致的重启,同时提供了详细的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在看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就不会在开机时候启动两次了。

<think>好的,用户之前问过如何在现有的Android Studio项目中添加一个前置登录界面,现在他们的问题是关于新建界面时是否需要勾选Launcher Activity。我需要仔细分析这个问题,确保回答准确且符合他们的需求。 首先,回顾用户之前的提问,他们已经了解了如何将LoginActivity设置为启动页,并修改了AndroidManifest.xml。现在的问题更具体,涉及新建Activity时的选项选择。用户可能正在实际操作中,遇到了Android Studio新建Activity时的勾选选项,不确定是否应该勾选Launcher Activity,特别是对于登录界面和主界面。 接下来,我需要明确Launcher Activity的作用。当用户创建新Activity时,Android Studio通常会提供一个选项,让用户决定是否将该Activity设置为Launcher Activity。勾选这个选项会在AndroidManifest.xml中自动添加MAIN动作和LAUNCHER类别,这样应用启动时就会首先进入这个Activity。 用户的情况是,他们已经有了一个现有的MainActivity,现在需要添加一个LoginActivity作为前置界面。因此,正确的做法应该是将LoginActivity设置为新的Launcher Activity,而MainActivity则不再具有这个属性。如果在创建LoginActivity时勾选Launcher Activity,Android Studio会自动配置清单文件,这可以避免手动修改可能带来的错误。而对于MainActivity,新建时不应勾选,或者如果已经存在,则需要手动移除其LAUNCHER属性。 此外,用户可能需要了解如何正确配置多个Activity启动顺序,以及如何处理返回栈的问题。例如,登录成功后跳转到MainActivity时,是否需要关闭LoginActivity,或者是否需要防止用户返回到登录界面。这些可能都是用户潜在的问题,但当前的问题比较直接,主要是勾选选项的选择。 还需要考虑用户可能存在的误区,比如是否每个应用可以有多个Launcher Activity。实际上,虽然可以有多个Activity声明LAUNCHER类别,但通常每个应用只有一个作为入口点。但如果有多个,系统会弹出选择器让用户选择启动哪个。但在用户的情况下,显然不希望出现这种情况,所以必须确保只有LoginActivityLAUNCHER属性。 另外,可能需要提醒用户,如果在现有项目中添加新的LoginActivity,可能需要检查原有的MainActivity是否已经被正确移除LAUNCHER属性,否则应用可能有两个入口,导致不可预期的行为。 总结,回答应该分步骤说明不同情况下的勾选建议,强调LoginActivity需要勾选,而MainActivity不应勾选,并解释原因。同时,提供配置后的清单文件示例,帮助用户验证是否正确设置。最后,补充常见问题,如误勾选后的处理方法,以及多个Launcher的影响,确保用户全面理解。</think>在Android Studio中新建Activity时,是否勾选"Launcher Activity"需要根据具体需求决定: **1. 勾选场景(需作为应用入口时)** - 适用于`LoginActivity`(新添加的登录界面) - 勾选后会自动在AndroidManifest.xml添加: ```xml <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> ``` **2. 不勾选场景** - 适用于`MainActivity`(原有主界面)或其他普通Activity - 保持原有manifest配置不变 **配置建议对比表**: | Activity类型 | 勾选Launcher | 是否应用入口 | 典型应用场景 | |---------------|-------------|------------|---------------------| | LoginActivity | ✓ | ✓ | 登录/引导页 | | MainActivity | ✗ | ✗ | 主界面(需登录后访问) | | Settings | ✗ | ✗ | 设置页 | **验证配置正确性**: ```xml <!-- 正确配置示例 --> <activity android:name=".LoginActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".MainActivity" android:exported="false"/> <!-- 建议添加exported属性 --> ``` **常见问题处理**: 1. **误勾选后的修正**: 删除多余Activity的`<intent-filter>`,确保只有一个LAUNCHER Activity 2. **多Launcher的影响**: - 应用图标会出现在启动器多 - 系统会弹出Activity选择对话框 - 不符合Google Play审核要求 3. **动态启动控制**: ```java // 在LoginActivity登录成功后添加 startActivity(new Intent(LoginActivity.this, MainActivity.class)); finish(); // 关键:关闭登录界面避免回退 ``` **最佳实践建议**: 1. 使用`adb`命令验证启动顺序: ```bash adb shell am start -n com.example.app/.LoginActivity ``` 2. 在`MainActivity`中添加防护逻辑: ```java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (!isUserLoggedIn()) { startActivity(new Intent(this, LoginActivity.class)); finish(); } // ...其他初始化代码 } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值