gpt4 book ai didi

android - 从覆盖的 getApplication() 返回共享静态是否安全?

转载 作者:太空狗 更新时间:2023-10-29 14:26:44 25 4
gpt4 key购买 nike

我正在尝试限制一系列应用程序,使用相同的 Activity (在所有人共享的图书馆项目中),以便一次只有一个这样的应用程序可以运行。

在我尝试学习如何去做的第一轮尝试中,我了解到:

  1. android:launchMode="singleTask"不会成功。
  2. setVisible(true/false) 在onResume()/onPause() 分别是best way判断我的应用程序是否正在运行。但是,一旦第二个实例知道第一个实例正在运行,我该怎么办呢???

所以,我正在考虑通过覆盖 Activity.getApplication() 总是返回相同的实例来欺骗系统。并返回共享静态:

public class MyApplication extends Application 
{
private static MyApplication s_instance;

public MyApplication()
{
s_instance = this;
}

public static MyApplication getApplication()
{
return s_instance;
}
}

(创意归功于 @inazaruk )

但是,就像前面提到的可见性解决方案一样,我现在该怎么办?

系统本身是否使用getApplication()确定是启动一个新实例还是只是将它带到堆栈的前面?这样安全吗?

如果答案是“否”,我可以直接调用 Activity.finish() 吗?不让第二个 Activity 甚至没有开始?如果是这样,我在哪里做这个?

  1. 就在Activity.onCreate()
  2. Activity.onResume()
  3. MyApplication() ? (构造函数)
  4. 更好的地方?

最佳答案

我有点困惑。您说的是一系列应用程序,但这些应用程序是如何打包的?在 Android 上,一个 APK 包含一个应用程序。该应用程序具有唯一的程序包名称和唯一的用户 ID,并在其自己的进程中运行。这意味着如果您在 2 个单独的包中有 2 个应用程序,它们将在 2 个单独的进程中运行,因此从 getApplication() 返回静态实例对您没有任何好处。

这里有一个可能对您有用的想法:

使用此共享库的每个应用程序都可以广播一个粘性 Intent,其中包含作为 Extra 运行的应用程序的包名称。

每个使用共享库的应用程序都可以为这个粘性 Intent 注册一个监听器,如果它获得一个它可以查看该应用程序(Extra 中的那个)当前是否正在运行。如果该应用程序正在运行,它可以拒绝运行(或警告用户并询问他是否应该运行,或其他)。

这只是一个想法,我还没有实际尝试过,但我认为这可以做你想做的事。

关于android - 从覆盖的 getApplication() 返回共享静态是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11739536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com