(可选)启动活动并使用来自 Android 服务的通知。仅在某个应用程序存在时启动或通知

2023-12-10

我在自己的应用程序中重用了一项服务(它既是“绑定”又是“启动”服务),因为它进行了很多我感兴趣的有用数据采集。一切正常,但我注意到一个问题。这段代码抛出异常:

Intent dialogIntent = new Intent();
    dialogIntent.setClassName(service.getBaseContext(), "com.mycompany.receiver.ui.DialogActivity"); // names changed to protect the innocent
    dialogIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
    dialogIntent.putExtra("message", message);
    service.getApplicationContext().startActivity(dialogIntent);

该异常警告“未知活动”和“您检查过清单吗”。现在,这不是因为我没有将活动放入清单中造成的。事实上,这里确实应该抛出异常,因为我的应用程序没有此活动!这是为原始应用程序编写的活动。我一开始没有注意到它,因为只有当收集的数据超出一定范围时才会触发此代码。 我可以更改服务代码,但服务和原始应用程序必须继续像以前一样工作。只是在我的应用程序中,我对弹出此特定消息的活动不是特别感兴趣(这对我来说并不那么重要)。
我确实考虑过这一点,我可以在所有事情上扔一个 try/catch 块。但这似乎有点老套。如果原始应用程序/服务对中出现其他问题,我想知道。我提出了以下想法,我需要帮助来为我指明正确的方向。

  1. 有没有办法让服务知道当前正在运行哪些应用程序?
  2. 或者也许目前在前台?
  3. 或者当前绑定到该服务怎么样?

我对 1-3 感兴趣(对于一般知识和解决这个问题),但 2 可能是最有用的。毕竟,可能有多个应用程序绑定到该服务,并且我不确定是否因为这条消息而将原始应用程序带到前台而不是我自己的应用程序。 最后.... 忘记我说过的一切,然后 4.你会如何解决这个问题?

我在代码的其他地方也有同样非常相似的问题:

Intent toLaunch = new Intent();
    toLaunch.setClassName(context, "com.mycompany.receiver.ui.BankingActivity");

    toLaunch.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent intentBack = PendingIntent.getActivity(context, 0, toLaunch, PendingIntent.FLAG_CANCEL_CURRENT);

    notify.setLatestEventInfo(context, title, message, intentBack);
    notifier.notify(NOTIFY_1, notify);

这个不会抛出异常;它会发出一个通知,当我点击它时,原始应用程序就会启动。这实际上可能没问题,但同样,最好不要这样做(或者可能是一种妥协 - 让通知程序通知应用程序是否至少已绑定,但不一定在前台)。想法?

非常感谢, 戴夫


你会如何解决这个问题?

你从来没有真正说出“这”是什么。我猜“这个”是:

如果有的话,我如何让服务通知我的前台活动,否则引发Notification(或者也许什么也不做)?

对于“this”,使用有序广播。正如我所写在很久以前的一篇博客文章中,这是通知前台活动或引发Notification:

  1. 定义当您想要转到活动或通知的事件发生时将使用的操作字符串(例如,com.commonsware.java.packages.are.fun.EVENT).

  2. 动态注册一个BroadcastReceiever在您的活动中,IntentFilter为上述操作字符串设置并具有正优先级(过滤器的默认优先级为 0)。然后,该接收者应该让 Activity 执行任何需要执行的操作,以根据该事件更新 UI。接收者还应该调用abortBroadcast()以防止其他人得到它。请务必在中注册接收者onStart() or onResume()并在相应的接收器中取消注册onStop() or onPause() method.

  3. 在您的清单中注册BroadcastReceiver, 与<intent-filter>为上述操作字符串设置。该接收器应提高Notification.

  4. 为您服务(例如,IntentService),当事件发生时,调用sendOrderedBroadcast().

如果您只想通知某个前台活动,但如果它不在前台则不执行任何操作,请跳过步骤 #3。

这是一个示例项目这证明了这一点。

有没有办法让服务知道当前正在运行哪些应用程序?

你可以问ActivityManager,但是,坦率地说,这需要一个脆弱的应用程序。

或者也许目前在前台?

不可靠。

或者当前绑定到该服务怎么样?

只要你自己跟踪它。

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

(可选)启动活动并使用来自 Android 服务的通知。仅在某个应用程序存在时启动或通知 的相关文章

随机推荐