【问题标题】:Send broadcast intent from service to Application Class将广播意图从服务发送到应用程序类
【发布时间】:2017-10-06 10:46:09
【问题描述】:

是否可以将意图从服务发送到应用程序类?不是活动?

我不知道在特定时间会运行什么活动,因此我在活动类中添加了一个布尔标志,用于检测活动并根据收到的广播发送适当的数据。

【问题讨论】:

  • 为什么是应用类?你能澄清一下你的情况吗
  • @VivekMishra 我有一个正在运行的服务可以执行 XMPP 繁重的工作。该服务永远在后台运行。现在,当我想将数据从服务传输到应用程序时,用户可能正在使用该应用程序。所以我想首先唤醒应用程序,然后发送意图和应用程序类处理它到正确的活动
  • 为什么是应用类?这也可以在广播接收器中完成
  • @VivekMishra 怎么样?
  • 只需调用要打开的活动的意图

标签: android android-intent android-activity service broadcast


【解决方案1】:

如果您的Service 处于活动状态,那么您的Application 类也处于活动状态

否则您将无法使用getApplicationContext()

虽然我对一项永久运行的服务持怀疑态度,但如果最后一个当前处于活动状态,有一种非常简洁的方法可以让Service 与某个Activity 通信。

这种干净的方式叫做LocalBroadcastManager

用于接收数据的Activity 应在onResume() 中注册BroadcastReceiver,并在onPause() 中取消注册。

您在 Activity 的 onCreate() 中实例化您的 BroadcastReceiver

this.localBroadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Do what you have to do here if you receive data from the Service.
    }
}

您创建了一个过滤器,因此您的 Activity 只监听特定类型的信号。

private IntentFilter notifIntentFilter new IntentFilter("com.you.yourapp.MY_SIGNAL");

onResume()

LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(this.localBroadcastReceiver, notifIntentFilter);

onPause()

LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(this.localBroadcastReceiver);

现在,只要您想向 Activity 发送数据,您的 Service 就可以调用:

final Intent intent = new Intent();
intent.setAction("com.you.yourapp.MY_SIGNAL");
// put your data in intent

LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);

如果您的Activity唤醒,它将响应信号。否则,如果它在后台,或者它没有被实例化,它就不会。

您可以将此模式应用于任意数量的活动。


不过,我从未在 Application 类中使用过这个。但是您可以尝试在那里注册您的接收器。它可能会起作用,因为如果 Application 类被销毁,BroadcastReceiver 也会被销毁,因此也可能未注册。

关键是,如果您的应用程序被破坏,您的服务也将被杀死。除非您在另一个进程中启动它。但随后它将拥有自己的Application 实例;这是一件复杂的事情,您现在可能不想详细说明...


重要提示:由于Application 类不绑定到任何 UI 组件,您可以直接在服务中执行任何您需要的操作。如果您需要操作 UI,那么上述模式将适合您。

请阅读新的Android's background limitations


编辑:

哦,对了,如果你需要你的 Service 来调用在你的 Application 类中声明的函数,你可以这样做

((MyApplication) getApplication()).myFunctionToHandleData(Intent intent);

虽然我并没有真正理解您的问题,但上述任何一种方法都应该适合您。

【讨论】:

  • 试过了,效果不太好。调用类在一个单独的模块中。
  • @bezaleel 你在另一个模块中是什么意思?如果您发布了一些代码,它将帮助我们为您找到解决方案
  • 想通了,上面的答案确实有效。我只是将类从单独的模块/库扩展到当前的类,然后使用广播接收器。但是,我无法将意图发送到 Application 类本身,而不是首先发送到活动,但这有效。
猜你喜欢
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多