将广播意图从服务发送到应用程序 Class

Send broadcast intent from service to Application Class

是否可以将意图从服务发送到应用程序 class?不是Activity?

我不知道 activity 在特定时间会是什么 运行,所以我在 activity class 中添加了一个布尔标志来检测activity 并根据收到的广播发送适当的数据。

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

否则你将无法使用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 发送数据,您的服务就可以调用:

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

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

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

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


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

重点是,如果您的应用程序被销毁,您的服务也将被终止。除非你在另一个进程中启动它。但随后它将拥有自己的 Application 实例;这是一件复杂的事情,您现在可能不想详细了解...


重要:因为 Application class 没有绑定到任何 UI 组件,你可以直接在你的服务。如果您需要操纵 UI,那么上述模式将适用于您。

请阅读新的 Android's background limitations


编辑:

哦,是的,如果你需要你的服务调用你的 Application class 中声明的函数,你可以这样做

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

虽然我不是很理解你的问题,但上述任何一种方法都应该适合你。