【发布时间】:2012-07-31 11:54:48
【问题描述】:
我试图限制一系列应用程序,使用相同的活动(在所有人共享的库项目中),以便一次只有一个这样的应用程序可以运行。
在我第一轮尝试学习如何去做时,我了解到:
- android:launchMode="singleTask" 不会成功。
-
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() 不让第二个活动甚至不开始吗?如果是这样,我在哪里可以做到这一点?
- 就在Activity.onCreate()?
- Activity.onResume()?
- MyApplication()? (构造函数)
- 更好的地方?
【问题讨论】:
-
我有点困惑。您说一系列应用程序,但这些是如何打包的?在 Android 上,一个 APK 包含一个应用程序。该应用程序具有唯一的包名称和唯一的用户 ID,并在其自己的进程中运行。这意味着如果您在 2 个单独的包中有 2 个应用程序,它们将在 2 个单独的进程中运行,因此从
getApplication()返回静态实例对您没有任何好处。请详细说明和解释这些应用程序如何相互关联。 -
@DavidWasser 你是绝对正确的。它们在 2 个单独的进程中运行,因此从 getApplication() 返回静态实例对我没有任何好处。您对应用程序包名称不同的看法也是正确的,但这在这里无关紧要,因为共享库项目的包名称是相同的。知道如何在不同的进程中实时(即不是通过缓慢的共享首选项,而是在更快的 RAM 中)跟踪它吗?如果您发表评论作为答案,我会接受。
标签: android singleton android-activity activity-lifecycle