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

Dav*_*ave 5 service notifications android android-intent

我有一个我正在重用的服务(它是一个"绑定"和"启动"服务)在我自己的应用程序中,因为它做了很多我感兴趣的有用的数据获取.一切正常,但我注意到了一个问题.此代码中抛出异常:

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);
Run Code Online (Sandbox Code Playgroud)

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

  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);
Run Code Online (Sandbox Code Playgroud)

这个没有抛出异常; 它会发出通知,当我点击它时,会启动原始应用程序.这可能实际上是可以的,但是再次,如果没有这个(或者可能是妥协 - 如果应用程序至少绑定,但不一定在前台,则通知通知)可能会很好.思考?

非常感谢,戴夫

Com*_*are 7

你怎么解决这个问题?

你从来没有真正说过"这个"是什么.我猜这个"这个"是:

如果有服务,如何通知我的前台活动,否则提出Notification(或者根本不做任何事情)?

对于"this",请使用有序广播.正如我在回顾过去的博客文章中写的那样,这里是通知前台活动或提出以下内容的方法Notification:

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

  2. BroadcastReceiever在您的活动中动态注册a ,IntentFilter设置上述操作字符串并具有正优先级(过滤器的默认优先级为0).然后,此接收器应该让活动执行基于此事件更新UI所需的任何操作.接收者还应该打电话abortBroadcast()以防止其他人获得它.一定要在登记接收器onStart()onResume()和注销相应的接收器onStop()onPause()方法.

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

  4. 在您的服务(例如,a IntentService)中,当事件发生时,请致电sendOrderedBroadcast().

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

这是一个演示这个的示例项目.

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

你可以问ActivityManager,但是,坦率地说,那是要求一个脆弱的应用程序.

或者也许目前在前台?

不可靠.

或者目前如何绑定服务?

只有你自己跟踪它.