【问题标题】:Is it safe to return from overriden getApplication() a shared static?从覆盖的 getApplication() 返回共享静态是否安全?
【发布时间】:2012-07-31 11:54:48
【问题描述】:

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

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

  1. android:launchMode="singleTask" 不会成功。
  2. onResume()/onPause() 中的setVisible(true/false) 分别是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() 不让第二个活动甚至不开始吗?如果是这样,我在哪里可以做到这一点?

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

【问题讨论】:

  • 我有点困惑。您说一系列应用程序,但这些是如何打包的?在 Android 上,一个 APK 包含一个应用程序。该应用程序具有唯一的包名称和唯一的用户 ID,并在其自己的进程中运行。这意味着如果您在 2 个单独的包中有 2 个应用程序,它们将在 2 个单独的进程中运行,因此从 getApplication() 返回静态实例对您没有任何好处。请详细说明和解释这些应用程序如何相互关联。
  • @DavidWasser 你是绝对正确的。它们在 2 个单独的进程中运行,因此从 getApplication() 返回静态实例对我没有任何好处。您对应用程序包名称不同的看法也是正确的,但这在这里无关紧要,因为共享库项目的包名称是相同的。知道如何在不同的进程中实时(即不是通过缓慢的共享首选项,而是在更快的 RAM 中)跟踪它吗?如果您发表评论作为答案,我会接受。

标签: android singleton android-activity activity-lifecycle


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 好主意。谢谢!对它比共享偏好实现快多少进行基准测试会很有趣。
  • 在了解了这一点之后,即使是粘性广播也不是那么好:stackoverflow.com/a/5457559/869501。回到原点。也许getRunningAppProcesses() 是首选的折衷方案,尽管“此方法仅用于调试或构建面向用户的流程管理 UI。”由于这些都是我自己的应用程序,假设我正在构建“面向用户的流程管理 UI”。 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
  • 2011-11-29
  • 1970-01-01
  • 2023-02-14
相关资源
最近更新 更多