将广播意图从服务发送到应用程序 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
处于 清醒状态 ,它将响应信号。否则,如果它在后台,或者它没有被实例化,它就不会。
您可以将此模式应用于任意数量的活动。
不过,我从来没有在Application
class里面用过这个。但是您可以尝试在那里注册您的接收器。它可能会起作用,因为如果 Application
class 被销毁,BroadcastReceiver
也会被销毁,因此也可能未注册。
重点是,如果您的应用程序被销毁,您的服务也将被终止。除非你在另一个进程中启动它。但随后它将拥有自己的 Application
实例;这是一件复杂的事情,您现在可能不想详细了解...
重要:因为 Application
class 没有绑定到任何 UI 组件,你可以直接在你的服务。如果您需要操纵 UI,那么上述模式将适用于您。
请阅读新的 Android's background limitations。
编辑:
哦,是的,如果你需要你的服务调用你的 Application
class 中声明的函数,你可以这样做
((MyApplication) getApplication()).myFunctionToHandleData(Intent intent);
虽然我不是很理解你的问题,但上述任何一种方法都应该适合你。
是否可以将意图从服务发送到应用程序 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
处于 清醒状态 ,它将响应信号。否则,如果它在后台,或者它没有被实例化,它就不会。
您可以将此模式应用于任意数量的活动。
不过,我从来没有在Application
class里面用过这个。但是您可以尝试在那里注册您的接收器。它可能会起作用,因为如果 Application
class 被销毁,BroadcastReceiver
也会被销毁,因此也可能未注册。
重点是,如果您的应用程序被销毁,您的服务也将被终止。除非你在另一个进程中启动它。但随后它将拥有自己的 Application
实例;这是一件复杂的事情,您现在可能不想详细了解...
重要:因为 Application
class 没有绑定到任何 UI 组件,你可以直接在你的服务。如果您需要操纵 UI,那么上述模式将适用于您。
请阅读新的 Android's background limitations。
编辑:
哦,是的,如果你需要你的服务调用你的 Application
class 中声明的函数,你可以这样做
((MyApplication) getApplication()).myFunctionToHandleData(Intent intent);
虽然我不是很理解你的问题,但上述任何一种方法都应该适合你。