将服务中的广播意图发送到应用程序类

时间:2017-10-06 10:46:10

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

是否可以将服务中的意图发送到Application类?没有活动?

我不知道在特定时间会运行什么活动,所以我在活动类中添加一个布尔标志来检测活动,并根据收到的广播发送相应的数据。

1 个答案:

答案 0 :(得分:1)

如果您的Service处于有效状态,那么您的Application课程也有效

否则您将无法使用getApplicationContext()

虽然我对一项永远运行的服务持怀疑态度,但有一种非常干净的方法可以让Service与某个Activity进行通信一个当前活跃。

这种干净的方式称为LocalBroadcastManager

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

您在活动BroadcastReceiver

中实例化onCreate()
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.
    }
}

您创建了一个过滤器,因此您的活动只会侦听某种类型的信号。

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

现在,只要您想将数据发送到您的活动,您的服务就可以致电:

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

的信息

修改

哦,是的,如果您需要服务来调用Application课程中声明的功能,您可以这样做

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

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