检测应用程序是否从应用程序“外部”启动/恢复

2023-12-02

我目前正在为应用程序构思一项功能,我希望有一种通用方法/方法来检测应用程序本身是否已从 ' 启动或恢复outside' 该应用程序。

'Outside',在这种情况下,意味着:

  • 应用程序由启动器图标启动/恢复
  • 通过按导航栏/按键上的“应用程序按钮”来启动/恢复应用程序(就像在 Nexus 7 上一样)
  • 应用程序是从通知启动/恢复的
  • 应用程序是从“其他地方”启动/恢复的

此功能的用例如下:

  • 该应用程序具有“多用户功能”,允许用户为其数据创建一个或多个配置文件
  • A single profile may be pin/password protected to 'hide' the data from other user(s) of the app, or 'hide' data from other user(s) of the device where the app is installed
    • If a profile has a password set, the app will show some kind of a lock screen to the current user when the app is started/resumed
      • 如果输入正确,应用程序将正常启动,显示最后选择的配置文件的数据
      • 如果输入错误,应用程序将以“中性”配置文件或根本没有配置文件启动

我在网上搜索了想法,只在 stackoverflow 上找到了相关帖子:

  • 有什么方法可以区分 Android Activity onResume 和主屏幕吗?
  • Android - 检测从家庭或历史记录启动的应用程序
  • 确定应用程序是否从主屏幕启动?

从我迄今为止阅读和了解到的情况来看,解决方案似乎比我想象的更复杂,并且没有现成的解决方案。

我目前正在考虑一个基于时间标志的实现该功能的方法:

  • 将时间标志设置为受影响活动的成员变量
  • onCreate(Bundle savedInstanceState) --> flag is set to 'null' before checking the savedInstanceState Budle for data
    • 这检测到活动开始 --> 如果设置了密码 --> 显示锁定屏幕
  • onSaveInstanceState(Bundle)--> 将时间标志设置为“当前时间”
  • if onCreate(Bundle savedInstanceState) is resumed, savedInstanceState will contain a time flag
    • 计算当前时间与应用上次暂停时间之间的差异
    • 如果此差异高于某个阈值,例如30 分钟 --> 如果设置了密码 --> 显示锁定屏幕

也许你们中的一些人已经实现了类似的东西,或者确实对这个问题/方法有一些投入。 我很高兴听到你的想法。

Cheers


这是一个较旧的问题,但仍然相关。有一个使用 ActivityLifeCycleCallbacks 的简单解决方案。这个答案来源于此blogpost作者:迈克尔·布拉德肖。他解释了这个概念

关键在于理解活动如何相互协调。当在 Activity A 和 B 之间切换时,它们的方法按以下顺序调用:

A.onPause();

B.onCreate();

B.onStart();

B.onResume();(活动 B 现在具有用户焦点)

A.onStop();(如果 Activity A 在屏幕上不再可见)

解决方案:您创建一个实现 Application.ActivityLifecycleCallbacks 接口的类并记录恢复和停止的活动的计数。

public class AppLifecycleHelper implements Application.ActivityLifecycleCallbacks {

// I use two separate variables here. You can, of course, just use one and
// increment/decrement it instead of using two and incrementing both.
private static int resumed;
private static int stopped;

    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
    }

    public void onActivityDestroyed(Activity activity) {
    }

    public void onActivityResumed(Activity activity) {
        ++resumed;
    }

    public void onActivityPaused(Activity activity) {
    }

    public void onActivitySaveInstanceState(Activity activity, Bundle     outState) {
    }

    public void onActivityStarted(Activity activity) {
        if (!isApplicationInForeground()){
            // resumed and stopped both are 0,
            // that means it is the first activity to come on display
            // i.e. App is launched from outside the app
        }
    }

    public void onActivityStopped(Activity activity) {
        ++stopped;
        if (!isApplicationInForeground()){
            // resumed and stopped both are 0
            // That means there is NO Activity in resumed state when this activity stopped
            // i.e. User came out of the App, perform all Application wide persistence tasks over here
        }
    }

    /**
     * Checks whether App is visible to the user or not
     * @return true if visible and false otherwise
     */
    public static boolean isApplicationInForeground() {
        return resumed > stopped;
    }

}

然后在应用程序的 onCreate() 中为 Activity 回调注册此类,如下所示

registerActivityLifecycleCallbacks(new AppLifecycleHelper());

就是这样!无需为每个活动添加任何代码。一切都包含在 AppLifecycleHelper 中,只需几行代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检测应用程序是否从应用程序“外部”启动/恢复 的相关文章

随机推荐

  • Headless LibreOffice 在 Windows 上导出为 PDF 非常慢(比 Linux 慢 6 倍)

    我经常需要使用 LibreOffice 将许多 gt 1000 docx 文档导出为 PDF 这是一个示例文档 测试 docx 以下代码可以工作 但在 Windows 上速度相当慢 每个 PDF 文档平均 3 3 秒 import subp
  • Management Studio 和 TableAdapter 之间存储过程的执行时间差异很大

    对于相同的输入 存储过程如何通过 Management Studio 在 10 秒内运行 但通过 TableAdapter 需要 15 分钟 它是可重复的 这意味着我在每个环境中至少运行了 3 次 并且 Management Studio
  • Java Netty负载测试问题

    我使用文本协议编写了 接受连接和轰炸消息 100 字节 的服务器 并且我的实现能够使用第 3 方客户端发送大约 400K 秒的环回消息 我为这项任务选择了 Netty SUSE 11 RealTime JRockit RTS 但是当我开始基
  • 计算数组中的个数

    我试图在 Verilog 中计算 4 位二进制数中 1 的数量 但我的输出是意外的 我尝试了几种方法 这是我认为应该有效的方法 但事实并非如此 module ones one in input 3 0 in output 1 0 one a
  • 如何在数据库优先方法中进行迁移

    我正在使用实体框架数据库优先方法 并想知道如何管理数据库优先方法中的迁移 我们正在手动更改数据库架构 实体框架有什么方法可以将更改相应地应用到项目中 我想我首先对代码感到困惑existing database and database fi
  • 相当于 Android Studio 中的 Clean & build?

    今天 当从 Android Studio 运行应用程序时 它不是根据我的最新代码构建的 我找了一个清洁和构建选项 但我找不到 所以我的问题是 Android Studio 相当于什么清洁和构建 Android studio是基于Intell
  • 使用远程 FTP 原子包和私钥发出与服务器的连接

    我正在尝试使用原子包 Remote FTP 并使用私钥连接到我的服务器 我在服务器上设置了 SSH 密钥 并且可以使用 putty 成功连接 私钥保存在我的项目文件夹中 并且我有一个现有的 ftpconfig 文件 没有私钥 当我替换文件内
  • 在两个 ggplot 直方图上显示平均值和中位数

    我是新的 stackoverflow 用户 目前无法对原始帖子发表评论来提问 我发现了以前的 stackoverflow 答案 https stackoverflow com a 34045068 11799491 我想知道如何在此图表中添
  • 的巨大高度值不会阻止截断

    我正在尝试申请
  • 检测拨出电话,使用真实设备发出问题

    我有一个奇怪的问题 为了检测拨出电话 我注册了一个广播接收器android intent action PHONE STATE 当状态变为摘机时 则开始通话 它似乎在模拟器上工作 调试器实际上达到了一些代码 但它在真实设备 Acer Liq
  • 程序集 8086 光标放置

    我想将光标放在 论文 之后 等待输入 ENTER 然后将其放在 作者 之后 这两个句子都是打印的已定义变量 insert db Insert new paper 0 0Ah 0Ah 0Ah 0Dh inserttitle db Title
  • AWS代码管道错误致命错误:接近堆限制的无效标记压缩分配失败-JavaScript堆内存不足

    我有在 aws 代码管道上运行的角度应用程序 突然它开始抛出此错误 我做了很多这样的事情 包括 node max old space size 8192 等 但没有任何方法可以解决此错误 有人可以帮我解决这个问题吗 To disable t
  • Selenium Python 在 HTTPS 网站上验证浏览器登录 pupup 对话框

    Folks 我正在开发一个每天运行一次的抓取脚本 我需要重新验证我的帐户 首先我必须登录 然后只有我才能看到该页面 就像正常的页面登录和废弃一样 这不起作用 阅读文章并按照大多数博客和论坛的建议使用下面的代码 这仍然不起作用 It s an
  • 缺少 OpenMP 功能:线程优先级

    任何人都想想吧 OpenMP 具有调整 CPU 能力来处理哑铃的功能 在我对 openmp 的研究中 我们无法设置线程优先级来以强大的力量执行块代码 5 只有一种方法 beginthreadex 或带参数的 CreateThread 函数
  • 如何在javascript中将嵌套集合转换为嵌套数组?

    有以下数据 no 1 name ELECTRONICS depth 0 no 2 name TELEVISIONS depth 1 no 3 name TUBE depth 2 no 4 name LCD depth 2 no 5 name
  • 尝试获取 singleValueExtendedProperties 时收到 400 和 500

    尝试向日历对象添加扩展属性 我可以使用以下有效负载创建日历 Ruby 语法 有效负载以 JSON 形式发送 name build calendar name singleValueExtendedProperties id String S
  • 如何使用 viewmodel 单例进行活动?

    MyApp需要在整个上下文中保存一个User对象 A B C活动的xml使用这个User对象 当A编辑User时 我想要B和C通知Change 如何使用数据绑定 livedata和viewModel处理这个问题 以前我让User class
  • Python Selenium 更改文本大小(缩放?设置?...)

    我有一个网页 我需要先截屏 然后使用 OCR 解析出里面的文本 如果放大 Mac command OCR 的性能会显着提高 所以我想知道如何在Python中使用selenium来放大 缩小 有一个类似的post但他们只有Java和C 的实现
  • 在 colorbox 中的图像下方添加 div

    使用 PHP 和 jQuery 目前使用 Colorbox 显示图像幻灯片 我想在每个图像下方包含一个 DIV 当每个图像显示新内容时会更新 可用于展示相关内容 评论功能等 四处研究但尚未找到任何答案 有人以前这样做过或有任何线索吗 我想我
  • 检测应用程序是否从应用程序“外部”启动/恢复

    我目前正在为应用程序构思一项功能 我希望有一种通用方法 方法来检测应用程序本身是否已从 启动或恢复outside 该应用程序 Outside 在这种情况下 意味着 应用程序由启动器图标启动 恢复 通过按导航栏 按键上的 应用程序按钮 来启动