我正在尝试使用相同的活动(在所有人共享的图书馆计划中)限制一系列应用程序,以便一次只运行一个此类应用程序。
在我第一轮尝试学习如何解决这个问题时,我了解到:
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(),不让第二项活动开始?如果是这样,我该怎么做?
答案 0 :(得分:1)
我有点困惑。你说一系列的应用程序,但这些包装是如何打包的?在Android上,APK包含单个应用程序。该应用程序具有唯一的包名称和唯一的用户ID,并在其自己的进程中运行。这意味着如果你在2个独立的包中有2个应用程序,它们将在2个独立的进程中运行,因此从getApplication()返回静态实例对你没有任何好处。
这是一个可能适合您的想法:
使用此共享库的每个应用程序都可以广播一个粘性Intent,其中包含作为 Extra 运行的应用程序的包名称。
每个使用共享库的应用程序都可以为这个粘性Intent注册一个侦听器,如果它得到一个,它可以查看该应用程序( Extra 中的那个)当前是否正在运行。如果该应用程序正在运行,它可能只是拒绝运行(或警告用户并询问他是否应该运行,或者其他)。
这只是一个想法,我并没有真正尝试过,但我认为这可以做到你想要的。