gpt4 book ai didi

android - 可选择启动 Activity 并使用来自 Android 服务的通知。仅在存在某个应用程序时启动或通知

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:28:16 25 4
gpt4 key购买 nike

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

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);

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

  1. 服务是否有办法了解当前正在运行的应用程序?
  2. 或者目前可能在前台?
  3. 或者当前绑定(bind)到服务怎么样?

我对 1-3(用于一般知识和解决此问题)感兴趣,但 2 可能是最有用的。毕竟,可能有多个应用程序绑定(bind)到该服务,而且我不确定是否仅仅因为这条消息就想将原始应用程序置于前台而不是我自己的应用程序。最后……忘记我说的一切,然后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);

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

非常感谢,戴夫

最佳答案

How would you solve this?

您从未真正说明“这个”是什么。我猜“这个”是:

How do I have a service notify a foreground activity of mine if there is one, and otherwise raise a Notification (or perhaps do nothing at all)?

对于那个“this”,使用有序广播。正如我写的 in a blog post from a ways back , 这是通知前台 Activity 或引发 Notification 的方法:

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

  2. 动态注册一个BroadcastReceiever在你的 Activity 中,有一个 IntentFilter为上述操作字符串设置并具有正优先级(过滤器的默认优先级为 0)。然后这个接收者应该让 Activity 做任何它需要做的事情来根据这个事件更新用户界面。收件人还应调用 abortBroadcast()以防止其他人得到它。请务必在 onStart() 中注册接收器或 onResume()并在相应的onStop()中注销接收者或 onPause()方法。

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

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

如果您只是想通知您的前台 Activity 之一,但如果它不在前台则什么都不做,请跳过第 3 步。

Here is a sample project这证明了这一点。

Is there a way for the service to know what applications are currently running?

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

Or perhaps currently in the foreground?

不可靠。

Or how about currently bound to the service?

仅当您自己跟踪时。

关于android - 可选择启动 Activity 并使用来自 Android 服务的通知。仅在存在某个应用程序时启动或通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8762192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com