将广播意图从服务发送到应用程序类
是否可以将服务意图从服务发送到应用程序类?不活动?将广播意图从服务发送到应用程序类
我不知道在特定时间将会运行什么活动,所以我在活动类中添加了一个布尔标志,它检测活动并根据收到的广播发送适当的数据。
如果您的Service
处于活动状态,那么Application
类别也是活动。
否则,您将无法使用getApplicationContext()
。
虽然我怀疑论者一直运行有一个很干净的方法,使Service
具有一定Activity
通信的服务,应该是最后一个是被激活的。
这种干净的方式叫做LocalBroadcastManager。
旨在接收数据的Activity
应该在onResume()
中注册BroadcastReceiver
并在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组件,你可以做任何你需要直接您的服务中。如果你需要操纵用户界面,那么上面描述的模式将适用于你。
请阅读关于新Android's background limitations。
编辑:
噢权利,如果你需要你的服务来调用你的Application
类中的函数声明,你可以做
我没虽然我不明白你的问题,但是上述任何一种方法都适合你。
为什么应用程序类?你可以澄清你的情况 –
@VivekMishra我有一个服务运行XMPP繁重。这项服务永远在后台运行。现在,当我想将数据从服务传输到应用程序时,用户可能正在使用该应用程序。所以我想先唤醒应用程序,然后发送意图和应用程序类将其处理到正确的活动 – Bezaleel
为什么应用程序类?那可以在广播接收机上完成 –