如何确保 MainActivity 只创建一次
Posted
技术标签:
【中文标题】如何确保 MainActivity 只创建一次【英文标题】:How to make sure the MainActivity will be created only once 【发布时间】:2020-12-04 07:56:11 【问题描述】:我有一个反应原生项目。并且有一个服务在后台运行。 当应用程序没有运行时,服务还活着,它可能想在一段时间内启动 MainActivity。我正在使用以下代码启动 MainActivity(我尝试了 noFlag/addFlag/setFlag):
Intent Intent = new Intent(context, MainActivity.class);
// intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
// intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(key, value);
context.startActivity(intent);
androidManifest.xml
声明如下:
<activity
android:name=".MainActivity"
android:launchMode="singleTask”>
</activity>
每次 MainActivity 都会被创建两次。第一次我们可以得到额外的值,但第二次它会是空的。
?
谢谢。
【问题讨论】:
第一次启动应用是怎样的?如果您是第一次从安装程序或 IDE(如 Android Studio)启动应用程序,您可能会看到这个长期存在的令人讨厌的 Android 错误:***.com/questions/16283079/… 如果应用已经在运行,您希望发生什么? 就我而言,每次推送都会创建两次活动。由于它是一个 singleTask 活动,我希望它应该只调用onNewIntent
而不是创建新活动
请终止应用程序(使用设置->应用程序->您的应用程序->强制停止)。然后从主屏幕启动应用程序。然后看看你是否仍然看到这种行为。
@DavidWasser 完成。谢谢提醒。
【参考方案1】:
刚刚发现问题。我在startActivity
上的方法断点起作用了。
第三方sdk找不到属性接收者,所以它发送一个startActivity
调用意图标志FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK,它在AndroidManefest.xml
中覆盖了我的singleTask
。
【讨论】:
【参考方案2】:您很可能已经知道,问题在于您两次调用 startActivity。我认为如果你能展示调用 startActivity 的代码会很可爱。
我刚刚测试过,只要你有 singleTask 或 singleTop 作为你的启动模式,OnCreate 就不会被调用两次。你可以从这里读到:https://developer.android.com/guide/components/activities/tasks-and-back-stack
将调用的函数是onNewintent,如果putExtra为空,它确实可以创建一个NPE
希望对你有帮助,祝你好运
【讨论】:
感谢您的回复。该服务是第三方供应商提供的推送服务。我还没有找到他们在哪里调用startAcitivity
...但是由于我在清单文件中声明了singleTask,我希望它不会被创建两次。
根据我上面贴的文章,不会这样。应该是在 Create 上只调用一次,其余的只会在 OnNewIntent 上调用。请问,您的 onCreate 是否被调用了两次?如果是这样,屏幕是否似乎再次被创建?感谢回复。希望有帮助
是的,我添加了登录onCreate和onNewIntent,我可以看到onNewIntent被调用之后,onCreate又被调用了......同时我在react-native端的组件跑过了componentWillUnmount方法。以上是关于如何确保 MainActivity 只创建一次的主要内容,如果未能解决你的问题,请参考以下文章
在 Cloud Firestore 中如何制作一个,只创建一次安全规则