使用持久通知允许用户返回到正在运行的 Android 应用程序

2023-11-21

我正在开发一个包含大量活动的应用程序。我想创建一个持久通知(或多或少)说“AppName - 返回AppName”,每当我的后台服务运行时都会出现该通知。创建和处理通知没有问题。

现在,用户可以在多个屏幕/活动中的任何一个上,离开应用程序,然后希望通过通知重新进入应用程序。问题是,通知必须有一个意图,该意图启动预定活动。我希望通知重新进入应用程序无论 Activity 位于历史堆栈的顶部.

我第一次尝试一个丑陋的解决方法是创建一个活动(让我们称之为“returnFromNotify”),其唯一的工作是在“onCreate”中“完成”自身。该通知将在应用程序历史记录的范围内打开“returnFromNotify”,然后该通知将立即删除自身,将用户发送回应用程序堆栈中的先前历史记录状态。这似乎有效......除非用户使用“后退”完全退出应用程序。然后,当他们点击通知时,“returnFromNotify”加载,然后完成,将它们发送回主屏幕(因为应用程序的历史堆栈中没有活动)。

我考虑尝试在“returnFromNotify”之前检测历史堆栈中是否有任何内容,如果没有,则启动我的主活动。我似乎也找不到办法做到这一点。

对于 Java/Android 新手有什么意见或建议吗?仅供参考,我的主要历史是基于脚本的语言。


我喜欢你创建“returnFromNotify”活动的最初想法,而不是你提出的解决方法,因为它is可以检测 ResumeActivity 是否位于堆栈底部(因此是堆栈中的唯一活动)。

您可以这样做:

将您的 ResumeActivity 添加到清单中并指定没有历史属性:

<activity android:name=".ResumeActivity" android:noHistory="true" />

指定 noHistory 将确保此 Activity 在完成后不会立即保留在堆栈中。这样您就知道只有当前正在运行的 ResumeActivity 实例才会显示在堆栈中。

为了检查应用程序堆栈,您还必须请求 GET_TASKS 权限:

<uses-permission android:name="android.permission.GET_TASKS" />

现在你可以使用ActivityManager::getRunningTasks()确定 ResumeActivity 是否是堆栈中唯一的活动:

public class ResumeActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if(isOnlyActivityInStack()) { //check the application stack
            //This activity is the only activity in the application stack, so we need to launch the main activity
            Intent main = new Intent(this, MainActivity.class);
            main.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(main);
        } else {
            //Return the user to the last activity they had open
            this.finish();
        }
    }

    /**
     * Checks the currently running tasks. If this activity is the base activity, we know it's the only activity in the stack
     *
     * @return  boolean  This activity is the only activity in the stack?
     **/
    private boolean isOnlyActivityInStack() {
        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        boolean onlyActivityInStack = false;

        for(RunningTaskInfo tasks : manager.getRunningTasks(Integer.MAX_VALUE)) {
            if(tasks.baseActivity.getPackageName().equals(this.getPackageName())) { //find this package's application stack
                if(tasks.baseActivity.getClassName().equals(this.getClass().getName())) {
                    //If the ResumeActivity is the base activity, we know that it is the only activity in the stack
                    onlyActivityInStack = true;
                    break;
                }
            }
        }

        return onlyActivityInStack;
    }

}

我知道您在两年多前问过这个问题,但我提供这个答案是为了防止其他人遇到这种特殊情况(就像我所做的那样)。我认为您最初致力于的解决方案走在正确的轨道上。

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

使用持久通知允许用户返回到正在运行的 Android 应用程序 的相关文章

随机推荐

  • 为分组表视图中的每个部分添加阴影

    如图所示 我想向表视图部分添加阴影 就像表视图有 4 个部分一样 表视图中也会有 4 个阴影视图 func numberOfSections in tableView UITableView gt Int 返回 3 func tableVi
  • Backbone.save POST 而不是 PUT

    只是一个简短的问题 拥有模型的新实例并发出model save URL 设置为 api store category Backbone 发出 POST 据我所知 它应该使用 PUT 就像本中提到的那样 PUT 或 POST 故事的其余部分
  • linux/module.h 没有这样的文件或目录

    在我的论文中 我将使用 ARAN 协议创建一个马奈 安装我正在使用的协议本手册 但是第一步 创建trace route 我收到了错误 例如 linux module h No such file or directory linux pro
  • C# 中的finally 块是必须的吗?

    2个条件有什么区别 每次method1和method2运行时 都应该有一个代码块需要运行 在我看来 两种方法是相同的 example method1 void Method1 void try do something catch Exce
  • OnItemLongClickListener 无法在自定义列表视图中工作

    我希望在长时间单击自定义列表视图中的项目后显示上下文菜单 我正在使用动作栏夏洛克 尝试使用 Toast 通知进行调试 我发现长按事件未触发 如何解决这个问题 m vwJokeLayout ListView findViewById R id
  • 是否可以通过 Julia 中的覆盖函数来调用重载函数?

    问题如下 我有一个抽象类型MyAbstract和派生的复合类型MyType1 and MyType2 abstract type MyAbstract end struct MyType1 lt MyAbstract somestuff e
  • 动画剪辑:矩形属性?

    我想为 css 属性设置动画clip rect与 jQuery 的 animate 但无法找到这是否可能在任何地方 试过 img1 animate clip rect 1px 945px 499px 1px 300 没有任何运气 有人知道吗
  • 在 C 中转换为 ASCII

    使用微控制器 PIC18F4580 我需要收集数据并将其发送到 SD 卡以供以后分析 它收集的数据的值介于 0 到 1023 或 0x0 到 0x3FF 之间 所以我需要做的是将 1023 转换为以 10 为基数的 ASCII 值字符串 0
  • 使用 AutoIt 发送电子邮件

    如何使用 AutoIt 发送电子邮件 只需要一个干净的示例和解释 其中包含 to from subject message 使用内置代码有两种主要方法 INetMail 或 INetSmtpMail 以下是帮助文件中的简单代码示例 如果您对
  • 从 iOS 应用程序上传文件到 ftp

    我读了SimpleFTP示例但我需要一个比这个文档更好的例子 我在 Google 上搜索了一些其他示例 但我发现的所有网站最终都引用了 Apple 文档 而且我还没有找到任何其他没有引用的内容 有人能帮我吗 谢谢 为 iOS 编写了一个易于
  • Global const string& 对我来说很难闻,它真的安全吗?

    我正在审查一位同事的代码 我发现他在全局范围内定义了几个常量 如下所示 const string SomeConstant This is some constant text 就我个人而言 这对我来说很糟糕 因为该引用指的是我假设是从给定
  • AFNetworking后台文件上传

    我想从我的应用程序将文件上传到我的服务器 当应用程序处于活动状态时 下面的代码运行良好 如果我按主页按钮或打开另一个应用程序 上传就会停止 我激活了后台获取但仍然无法工作 Afnetworking 有后台支持 但我不知道如何在我的代码中实现
  • 将foreignKey小部件添加到django-import-export

    我正在尝试将数据导入到我的模型之一 但它失败了 因为我正在尝试上传foreignKey Id 而不是导入导出创建的迭代数 模型 py from django db import models from import export impor
  • 将数字四舍五入到最接近的 5 的倍数

    有谁知道如何将数字四舍五入到最接近的 5 倍数 我找到了一种算法将其四舍五入到最接近的 10 倍数 但我找不到这个算法 这样就可以做十 个了 double number Math round len 5 10 0 10 0 要四舍五入到最接
  • @login_required Flask 应用程序出现问题

    我创建了一个处理身份验证的蓝图 该蓝图使用 Flask Login 并具有以下内容 以及更多未显示的代码 在蓝图中我有以下内容 from flask ext login import LoginManager from flask ext
  • Qt Creator 5 - 未设置调试器

    我设置了一个编译器微软 Visual C x86 编译器 但现在我有这个错误 编译器 Microsoft Visual C x86 Compiler 无法生成 Qt 版本的代码 警告 没有设置调试器 我想我需要设置调试器 但我不知道将 调试
  • 如何重命名 pandas 数据框的第一列?

    我在互联网上多次遇到这个问题 但除了以下几个之外 答案并不多 无法重命名 pandas DataFrame 中的第一列 我使用以下方法达到了相同的目的 df df rename columns df columns 0 Column1 有没
  • 在Oracle中将时差转换为给定格式

    我如何转换EVENT DATE B EVENT DATE A这是要串连的天数HH MM format 另一种方法 一个查询可以在不同的日子进行 with tt as select numToDsinterval EVENT DATE B E
  • Perl 匹配仅返回“1”。布尔值?为什么?

    这一定是显而易见的 但我只是没有看到它 我有一个包含数千条记录的文档 如下所示 Row 1 DATA 0 37755442 1 DDG00000010 2 FALLS 3 IMAGE 4 Defect 5 3 6 CLOSED 我已经设法将
  • 使用持久通知允许用户返回到正在运行的 Android 应用程序

    我正在开发一个包含大量活动的应用程序 我想创建一个持久通知 或多或少 说 AppName 返回AppName 每当我的后台服务运行时都会出现该通知 创建和处理通知没有问题 现在 用户可以在多个屏幕 活动中的任何一个上 离开应用程序 然后希望