Android:捕获应用程序退出

2024-03-31

我目前正在构建一个可以播放声音的应用程序。当用户启动声音时,我会使用以下代码显示状态栏通知:



notificationManager = (NotificationManager) activity.getSystemService(Activity.NOTIFICATION_SERVICE);

Intent intent = new Intent(activity, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

PendingIntent pendingIntent = PendingIntent.getActivity(activity, 0, intent, 0);

notification = new Notification();
notification.icon = android.R.drawable.stat_notify_sync;
notification.flags |= Notification.FLAG_ONGOING_EVENT;

String title = activity.getString(R.string.notification_title);
String text = activity.getString(R.string.notification_text);

notification.setLatestEventInfo(activity, title, text, pendingIntent);
  

这工作正常。稍后,如果用户停止所有声音,我使用 notificationManager.cancel 删除通知,并且再次运行正常。

我的问题是我想处理某人使用任务杀手应用程序的情况。如果有人使用它来杀死我的应用程序,我希望从状态栏中删除通知图标。我知道很多用户喜欢使用此类应用程序,我不希望有人抱怨他们无法“关闭”我的应用程序!

到目前为止,我还无法检测到应用程序何时即将退出。我试过这个:



Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
{
  @Override
  public void uncaughtException(Thread thread, Throwable ex)
  {
    notificationManager.cancel(NOTIFICATION_ID);
  }
});
  

还有这个:



Runtime.getRuntime().addShutdownHook(new Thread()
{
  @Override
  public void run()
  {
     notificationManager.cancel(NOTIFICATION_ID);              
  }
});
  

但这是行不通的。当我的应用程序被终止时,通知图标仍然存在。为了杀死我的应用程序,我一直在使用一个名为“高级任务杀手”的应用程序。我还通过在 DDMS 中终止我的进程进行了测试。

我注意到本机媒体播放器正在这样做。如果正在播放音乐并且您终止了音乐服务,该图标将会消失。

那么,有没有办法检测应用程序何时即将退出,以便我可以删除通知图标?或者如果我的应用程序被终止,有没有办法自动删除通知图标?

Thanks!


通知栏中显示两种类型的图标:

  1. 通知,由应用程序或系统发送
  2. 前台服务

您使用的是第一种类型。它是由应用程序(或系统)发送的通知,其目标是向用户传递一些信息。示例:新邮件到达、存储空间不足、我的帖子有新评论。 这些都是用户理论上想要检查的信息,并且应该保留在那里,直到用户点击它以查看详细信息(如果有)或决定删除它们以删除所有剩余的通知。

我将引用以下内容开始讨论前台服务文档 https://developer.android.com/guide/components/services.html#Foreground

前台服务是一种被认为是某种东西的服务 用户主动意识到,因此不是系统的候选者 当内存不足时杀死。前台服务必须提供 状态栏的通知,位于“正在进行”下方 标题,这意味着通知不能被驳回,除非 该服务已停止或从前台删除。

例如,从服务播放音乐的音乐播放器应该是 设置为在前台运行,因为用户明确知道 它的运作。状态栏中的通知可能表明 当前歌曲并允许用户启动与之交互的活动 音乐播放器。

您在问题中提到的音乐应用程序就是这种情况。音乐应用程序内部的播放器部分作为前台服务实现。当用户通过应用程序 UI 选择一首歌曲并播放它时,服务就会启动(通知栏中会出现该图标),并且歌曲再现也会开始,并且可以独立于 UI 本身进行。当歌曲结束或用户停止再现时,该图标将随着服务(应该)停止而消失。

要了解有关如何实现前台服务的更多信息,请参阅上面的链接(只需单击“文档”一词)

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

Android:捕获应用程序退出 的相关文章

  • onActivityResult 中的完成活动不起作用

    我有一对必须同生共死的活动 基本上 AlphaActivity 会做一些工作 然后发送一个意图 startActivityForResult 对于 Beta 活动 当 Beta 活动完成时 我希望它发送一个意图 startActivity
  • 带阴影的弯曲 Android 工具栏

    我需要为工具栏或卡片视图提供弯曲的底视图 我尝试过的 bg toolbar xml
  • Android 12:如何防止更改手机壁纸时重新启动活动?

    在 Android 12 上 如果我们开启一个活动 进入手机主屏幕更换壁纸 切换回我们的 Activity 该 Activity 重新启动 看起来它与 Material You 主题有关 我想在我的应用程序进入前台时禁用活动的重新启动 有办
  • 未找到 Gradle DSL 方法:“versionCode()”

    构建我的 Android 项目时遇到问题 我使用Grgit https github com ajoberstar grgit填写versionCode and versionName在 gradle 中 一切工作正常 直到我将 Andro
  • 更改工具栏中汉堡图标的大小?

    我有两个问题 可能很奇怪 但无论如何 我有带有应用程序标题的工具栏 如何将其更改为非徽标的图片 下一个问题 是否可以设置 更改工具栏中汉堡图标的大小 我在下面的下一个代码的帮助下制作了经典的导航抽屉 我也使用了 ActionBarDrawe
  • Mailgun POST /messages API 总是抛出 401 禁止

    我正在尝试使用改造库在 Android 中发送 Mailgun POST messages API 请求 以下是改装要求 HTTP POSThttps api key xxx v3 sandboxxxx messages https api
  • 方法断点可能会大大减慢调试速度

    每当向方法声明行添加断点 在 Intellij IDEA 或 Android Studio 中 时 都会出现一个弹出窗口 方法断点可能会大大减慢调试速度 为什么会这样戏剧性地减慢调试速度 是我的问题吗 将断点放在函数的第一行有什么不同 Th
  • Android SDK 中可用的所有“android.intent.action”操作的详尽列表是什么?

    大家好 我想知道标准 Android SDK 中定义的所有 Intent 操作是否有详尽的参考 我正在考虑完整的 android intent action someaction 名称 而不是 Intent 类中定义的方便别名操作的限制列表
  • 无法将 Tesseract OCR 模块添加到 Android Studio

    我按照此处找到的分步指南进行操作 https www codeproject com Articles 840623 Android Character Recognition https www codeproject com Artic
  • 如何在照片删除后刷新 Android 的 MediaStore

    问题 如何使媒体存储刷新其已删除文件的条目 从外部存储中删除代码中的照片后 我仍然在图库中看到已删除照片的插槽 空白照片 画廊似乎反映了媒体存储 并且在媒体存储中找到了已删除的照片 直到手机重新启动或通常 直到重新扫描媒体为止 尝试扫描已删
  • 如何检测 Google Play 上是否有我的应用程序的更新? [复制]

    这个问题在这里已经有答案了 有没有办法以编程方式检查 Google Play 上我的应用程序是否有更新 以便通知用户 我知道 android google play 有自动通知 但我想使用我自己的通知 弹出消息来更新可用性 有点像 Vibe
  • 如何在 Android 清单文件中设置文本外观?

    是否可以做相当于 setTextAppearance context android R style TextAppearance Medium 在 Android 应用程序的清单文件中 android textAppearance and
  • 如何在 Android 上的 HttpPost 中发送 unicode 字符

    我试图在我的应用程序中允许多语言支持 这会发出 HTTP post 来上传新消息 我需要做什么才能支持日语和其他非拉丁语语言 我的代码目前看起来像这样 note the msg string is a JSON message by the
  • 当参数具有默认值时,为什么无法使用导航组件将参数传递给片段?

    我正在使用导航组件 但我不明白为什么如果定义了参数 则将参数传递给下面的方法时会出现错误 我正在使用 SafeArgs 只有当我为此参数定义默认值时才会出现此错误 有人可以解释一下为什么会发生这种情况以及如何解决它吗 这是导航图的部分代码
  • 在 Android 中使用 iText 读取或打开 PDF 文件

    我是 Android 应用程序开发新手 使用 iText 我完成了 PDF 创建并在创建的文件上写入 现在我想阅读该 PDF 文件 如何使用 iText 打开或阅读 PDF 文件 例子将是可观的 那么提前 哪个是渲染 PDF 文件的最佳库
  • 如何覆盖日期选择器的高度和宽度以填充父布局

    我有一个活动包含一个日期选择器 我想设置DatePicker适合屏幕 我试过这个答案 https stackoverflow com questions 6674667 how to customize date pickers width
  • 点击监听器的公共类

    我的所有 6 项活动中有 7 个按钮 所有 6 个按钮在所有活动中都具有相同的功能 如何为这 6 个按钮执行通用的单击事件侦听器 您可以创建一个实现 View OnClickListener 的新类 如下所示 public class My
  • 无法在 Android 模拟器中安装 apk

    我正在尝试通过 adb shell 在 ICS 模拟器中安装 apk 从一个站点下载 但出现以下错误 失败 INSTALL FAILED UID CHANGED 可能是什么问题 只需 rm r 有问题的数据目录即可 如果您在安装时遇到此错误
  • gradle-experimental:0.1.0 buildConfigField

    谁知道怎么定义buildConfigField在实验性的 gradle 插件中 android productFlavors create demo applicationId com anthonymandra rawdroid buil
  • Android:获取最新意图

    如何获取发送到活动的最后一个意图 的文档onNewIntent 建议我需要做这样的事情 class MyActivity public void onNewIntent Intent intent setIntent intent reac

随机推荐