3

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

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

  1. android:launchMode="singleTask" 不会成功。
  2. setVisible(true/false)onResume()/onPause() 分别是判断我的应用程序是否正在运行的最佳方法。但是一旦第二个实例知道第一个实例正在运行,我该怎么办???

因此,我正在考虑通过覆盖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. 活动.onResume()
  3. 我的应用程序()?(构造函数)
  4. 更好的地方?
4

1 回答 1

1

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

这是一个可能对您有用的想法:

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

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

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

于 2012-08-01T22:38:00.313 回答