2017-10-06 141 views
1

是否可以将服务意图从服务发送到应用程序类?不活动?将广播意图从服务发送到应用程序类

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

+0

为什么应用程序类?你可以澄清你的情况 –

+0

@VivekMishra我有一个服务运行XMPP繁重。这项服务永远在后台运行。现在,当我想将数据从服务传输到应用程序时,用户可能正在使用该应用程序。所以我想先唤醒应用程序,然后发送意图和应用程序类将其处理到正确的活动 – Bezaleel

+0

为什么应用程序类?那可以在广播接收机上完成 –

回答

0

如果您的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类中的函数声明,你可以做

​​

我没虽然我不明白你的问题,但是上述任何一种方法都适合你。

+0

尝试了这一点,它并没有很好的工作。调用类是在一个单独的模块中。 – Bezaleel

+0

@bezaleel你在另一个模块中的含义是什么?如果您发布了一些代码,它会帮助我们找到解决方案 – payloc

+0

想通了,上面的答案确实有效。我只是从单独的模块/库扩展到当前的类,然后使用广播接收器。然而,我不能将意图发送给应用程序类本身,而不是首先发送到一个活动,但这是有效的。 – Bezaleel

相关问题