因此,根据我的理解,我应该使用意图来更新服务的活动UI。
但是,我有点担心我想做的事情的效率。
从理论上说,它不应该造成严重的问题,但我不想让我的手机醒来,并且运行20-30 onTick
秒立刻,每次都产生新的意图。
我想要的(如果可能的话)是每个onTick
覆盖前一个的意图,以便接收者一次只有一个进程。
我知道待处理的意图有FLAG_UPDATE_CURRENT
,但正确的做法意味着(如果我理解正确的话)使用本地广播,这不会对未决意图有效。
答案 0 :(得分:0)
事实证明这非常简单。 一个pskink在他的评论中提出,你需要的只是一个活页夹:
创建一个扩展Binder
类的类。请记住,Binder
类实现了IBinder
,这就是为什么你可以将新类的实例作为IBinder
的实例传递的原因(这是你稍后会做的)
在本课程中,实现您希望主要活动能够使用的各种功能。如果您希望您的服务能够从活动中运行事物,您可以传递活动的内部类的实例,其中包含相关的函数,或者甚至传递指向活动的指针({{1 }})。
请记住:这些事情需要您自担风险。例如,如果您的活动被销毁 - 例如,由于方向的改变,指针可能会变得毫无价值而且会抛出错误
我建议在新课程中实施this
以帮助您处理这些情况,但也许有一些我不熟悉的更好的实践。
现在,您的活动与您有双向沟通渠道。
下面是一些示例代码。请注意,如果您不希望在活动发布时销毁您的服务,则您需要(据我所知)也可以使用invalidate
启动它(除了使用startService
)< / p>
bindService
您的活页夹类:
public class MyService extends Service {
private IBinder yourBinder; //A class that will connect your service and your activity
@Override
public void onCreate() {
super.onCreate();
yourBinder = new YourBinderClass();
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return yourBinder;
}
最后,在你的主要活动中:
public class YourBinderClass extends Binder {
private Service thisService;
public YourBinderClass(Service myService)
{
thisService = myService;
}
public Service getService()
{
return thisService;
}
启动服务:
private YourBinderClass yourBinderClass;
private Service yourService;
private ServiceConnection sc = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
yourBinderClass = (YourBinderClass) service;
yourService = yourBinderClass.getService();
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
请注意,该服务不会立即就绪,因此,如果您的活动依赖于该服务,您可能希望发信号通知您已准备好在getBaseContext().bindService(new Intent(getBaseContext(),MyService.class), sc, 0)