【问题标题】:Single Instance for Shared Library Project Activity?共享库项目活动的单一实例?
【发布时间】:2012-07-02 15:22:32
【问题描述】:

This answer 建议使用 AndroidManifest 的 android:launchMode="singleTask" 将活动限制为单个实例。

这对于所有活动都是项目一部分的应用程序非常有用,但是当我有多个应用程序使用 Library Project 并在其中定义了应用程序的主要活动时,库项目的 AndroidManifest 将被忽略所以我真的不能在那里使用android:launchMode="singleTask" 属性。

如果我在应用程序的 AndroidManifest.xml 中使用 android:launchMode="singleTask",那么每个活动都有不同的名称,并且此属性将仅限于单个实例相同的应用程序,而不是使用此的不同应用程序共享活动(用作图书馆项目)。

我真正想要的是,在任何特定时刻,只有一个应用程序(在使用该共享库项目活动的不同应用程序中)可以运行。

使用android:launchMode="singleTask" 属性是否可行?

如果这不可行,还有什么其他方法推荐?

【问题讨论】:

    标签: android singleton android-manifest android-activity


    【解决方案1】:

    尝试使用Intent.FLAG_ACTIVITY_REORDER_TO_FRONT。每当您启动一个 Activity 时,如果该 Activity 的一个实例存在,它就会被带到堆栈的前面,并且不会第二次创建。这可确保在任何给定时刻只有一个 Activity 保留在堆栈中。

    另一种方法是使用a static variable。但不确定这有多可靠。

    【讨论】:

    • Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 对我没有帮助,因为我没有以编程方式启动应用程序的活动。这一切都是通过清单文件完成的。静态变量方法更合适,但@AlexLockwood 的回答通过链接提供了更多信息。谢谢。
    【解决方案2】:

    图书馆项目只是您用来重用代码的东西。编译应用程序时,生成的.apk 文件不知道帮助创建它的库项目。也就是说,不应该通过操纵图书馆项目的AndroidManifest.xml 文件来强制执行单例属性(跨越不同的.apk)。

    您可以通过继承Application 来强制执行此行为。你可以阅读更多关于这个here的信息。

    【讨论】:

    • 感谢您的链接。确实很有趣的答案。不过,不确定“visible”是否与“running”相同。
    • 我很好奇...阻止多个应用程序运行的原因是什么? (并不是说它一定是错的......我只是好奇)。
    • 它们都播放 MP3 文件,当 2 个或更多此类应用程序同时运行时,会产生杂音。我可能可以管理对共享扬声器/耳机或媒体播放器的访问,但此时我更愿意向用户显示一条友好的消息,说明另一个此类应用程序正在运行。
    • 在 onResume/onPause 中设置静态布尔值很简单,但为什么我需要子类化 Application?我可以在基本活动中保留该静态布尔值。另外,一旦我可以确定一个实例已经在运行,我应该在哪里停止第二个实例的启动? killProcess?结束?其他?
    • 老实说,我不能就如何关闭第二个应用程序给你一个 100% 自信的答案......这看起来真的很奇怪,而且 Android 的设计绝对没有明确的关闭想法考虑到其他第三方应用程序。你最好的选择可能是ActivityManager#killBackgroundProcesses(String packageName),不过……至少这是我的第一个猜测。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多