If your Service
是活跃的,那么你的Application
类是active以及。
否则你将无法使用getApplicationContext()
.
虽然我对此表示怀疑永远运行的服务有一种非常干净的方法可以使Service
与某个人沟通Activity
,最后一个当前是否处于活动状态。
这种干净的方式称为本地广播管理器.
The Activity
意味着接收数据应该注册一个BroadcastReceiver
in 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");
in onResume()
LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(this.localBroadcastReceiver, notifIntentFilter);
in 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);
If your Activity
is awake,它将响应信号。否则,如果它在后台,或者它没有被实例化,它就不会。
您可以将此模式应用于任意数量的活动。
Still, 我从来没有用过这里面的Application
班级。但您可以尝试在那里注册您的接收器。它可能会起作用,因为如果Application
类被破坏了,BroadcastReceiver
也被破坏,因此可能也未注册。
关键是,如果您的应用程序被破坏,您的服务也将被终止。除非你在另一个进程中启动它。但随后它将拥有自己的实例Application
;这是一件复杂的事情,您现在可能不想详细了解......
重要的: 自从Application
类不绑定到任何 UI 组件,您可以直接在服务中执行您需要的任何操作。如果您需要操作 UI,那么上述模式将适合您。
请阅读有关新Android 的后台限制.
Edit:
哦,是的,如果您需要您的服务调用您的服务中声明的函数Application
类,你可以这样做
((MyApplication) getApplication()).myFunctionToHandleData(Intent intent);
虽然我不太明白你的问题,但上述任何一种方法都应该适合你。