如果您的Service 处于活动状态,那么您的Application 类也处于活动状态。
否则您将无法使用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 发送数据,您的 Service 就可以调用:
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。
编辑:
哦,对了,如果你需要你的 Service 来调用在你的 Application 类中声明的函数,你可以这样做
((MyApplication) getApplication()).myFunctionToHandleData(Intent intent);
虽然我并没有真正理解您的问题,但上述任何一种方法都应该适合您。