如何确保 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 中如何制作一个,只创建一次安全规则

如何在 C++ 中并行化一个 for 循环,只创建一次线程池

Sprite Kit:为所有场景只创建一次节点

同步对象只创建一次对象

如何使用 SQLAlchemy 只创建一张表?

使用 Flask + SqlAlchemy 只创建一张表