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

时间:2012-07-31 11:54:49

标签: android singleton android-activity activity-lifecycle

我正在尝试使用相同的活动(在所有人共享的图书馆计划中)限制一系列应用程序,以便一次只运行一个此类应用程序。

在我第一轮尝试学习如何解决这个问题时,我了解到:

  1. android:launchMode =“singleTask”将无法解决问题。
  2. onResume()/ onPause()中的
  3. setVisible(true/false)分别是best way,用于判断我的应用程序是否正在运行。但是,一旦第二个实例知道第一个实例正在运行???
  4. ,我该怎么办呢

    所以,我想通过覆盖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. 一个更好的地方?

1 个答案:

答案 0 :(得分:1)

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

这是一个可能适合您的想法:

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

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

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