是否可以将服务中的意图发送到Application类?没有活动?
我不知道在特定时间会运行什么活动,所以我在活动类中添加一个布尔标志来检测活动,并根据收到的广播发送相应的数据。
答案 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);
虽然我没有真正理解你的问题,但上述任何一种方法都适合你。