2012-07-31 58 views
3

我试图限制一个应用程序家族,使用相同的活动(在所有共享库项目中),这样只有一个这样的应用程序可以在一次运行。从overriden getApplication()返回一个共享静态是否安全?

在我的第一轮努力学习如何去说,我才知道:

  1. 机器人:launchMode =“singleTask”不会做的伎俩。
  2. setVisible(true/false) inResume()/ 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()不要让第二个活动不能启动?如果是这样,我在哪里做?

  1. Right in Activity.onCreate()
  2. Activity.onResume()
  3. MyApplication()? (构造函数)
  4. 更好的地方吗?
+1

我有点困惑。你说_a系列的应用程序_但是它们是如何打包的?在Android上,APK包含单个应用程序。该应用程序具有唯一的软件包名称和唯一的用户标识,并在其自己的进程中运行。这意味着如果你在2个独立的包中有2个应用程序,它们将在2个独立的进程中运行,因此从'getApplication()'返回静态实例不会对你有任何好处。请详细说明并解释这些应用程序如何相互关联。 – 2012-08-01 16:47:49

+0

@DavidWasser你是绝对正确的。它们在两个独立的进程中运行,因此从getApplication()返回静态实例对我没有任何好处。对于应用程序包名称不同,您也是对的,但这与此处不相关,因为共享库项目的包名称是相同的。任何想法如何在**实时**(即不是通过缓慢的共享偏好,而是通过更快的RAM)在不同的过程中追踪它?如果您发表评论作为答案,我会接受它。 – ateiob 2012-08-01 20:55:44

回答

1

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

下面是可能会为你工作的想法:

使用该共享库可以广播包含运行为额外应用程序的包名粘性意向的每个应用程序。

使用共享库可以注册一个监听这个粘意图,如果它得到一个它可以看看,看看是否应用程序(一个在额外)当前正在运行的每个应用程序。如果该应用程序正在运行,它可能会拒绝运行(或者警告用户并询问它是否应该运行,或者其他)。

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

+0

奇妙的想法。谢谢!基准测试比共享偏好实施要快多少会很有趣。 – ateiob 2012-08-02 00:42:48

+0

了解了这一点之后,即使是一个粘性广播也不是那么好:http://stackoverflow.com/a/5457559/869501。回到原点。也许[getRunningAppProcesses()](http://developer.android.com/reference/android/app/ActivityManager.html#getRunningAppProcesses%28%29)是首选的折衷办法,虽然“*此方法仅用于调试或构建面向用户的流程管理用户界面。“由于这些都是我自己的应用程序,我们假装我正在构建”面向用户的流程管理用户界面“。 ;) – ateiob 2012-08-07 22:01:05

相关问题