gpt4 book ai didi

android - 绑定(bind)到正在运行的服务(在 finish() 之后)/回调处理程序

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:22:39 25 4
gpt4 key购买 nike

又是一个关于 LocalServices 的问题。在 onDestroy() 之后,如何(重新)绑定(bind)到现有服务?

问题:我绑定(bind)到服务并从 Activity 启动服务。我正在将可运行对象发布到 Binder ,以便在 UI 上进行回调(更新进度条)。当我关闭这个 Activity 时,操作系统可以结束生命周期并销毁 Activity,调用 onDestroy(),对吗?我模拟这个,在 onPause() 方法中调用 finish() 。因此,一旦我重新启动 Activity,如何再次绑定(bind)到 SAME 服务?我以为服务是 Singelton,但是当我尝试重新绑定(bind)时,我得到了另一个 Binder 引用。所以 binder.callbackHandler.post(binder.progressHandler); 仍然引用旧的 binder/callback/progressHandler,而不是我的新的。甚至服务的构造函数也被再次调用!

是否有任何解决方案可以让进度条通过服务的回调对象进行更新(有效)。关闭/onDestroy() Activity 。回来,继续进度条?

我的代码相当大,但重新创建了 Szenario:

    public class MyService extends Service {
private final LocalBinder binder = new LocalBinder();

public class LocalBinder extends Binder implements TestRunServiceBinder {
private Handler callbackHandler;
private ServiceStartActivity.RunOnServiceProgress onProgress;

@Override
public void setActivityCallbackHandler(Handler messageHandler) {
callbackHandler = messageHandler;
}

@Override
public void setServiceProgressHandler(RunOnServiceProgress runnable) {
onProgress = runnable;
}

public void doSomething(){
_doSomething();

};

private void _doSomething(){
while(...){
//do this a couple of times (could take up to 10min)
binder.callbackHandler.post(binder.progressHandler);
wait()
}
}

}

_

public class ServiceStartActivity{
private final Handler messageHandler = new Handler();
private ServiceConnection mTestServiceConnection = new ServiceConnection() {


@Override
public void onServiceDisconnected(ComponentName name) {
testRunBinder = null;
}

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
testRunBinder = (TestRunServiceBinder) service;
testRunBinder.setActivityCallbackHandler(messageHandler);
testRunBinder.setServiceProgressHandler(new RunOnServiceProgress());
}
};

@Override
protected void onStart() {
super.onStart();

// bind to the Service
final Intent serviceIntent = new Intent(ServiceStartActivity.this,
MyService.class);
getApplicationContext().bindService(serviceIntent,
mTestServiceConnection, Context.BIND_AUTO_CREATE);

}
@Override
protected void onStop() {
super.onStop();
getApplicationContext().unbindService(mTestServiceConnection);
}
public class RunOnServiceProgress implements Runnable {
@Override
public void run() {
//do something on the UI!
}
}
}

最佳答案

我现在明白了。解决方案是在使用 getApplicationContext().bindService(serviceIntent,mTestServiceConnection, Context.BIND_AUTO_CREATE);

绑定(bind)到服务之前显式调用 startService(serviceIntent); >

原因:当您使用 bindService() 启动服务时,它成为绑定(bind)服务和

runs only as long as another application component is bound to it.

如果您使用 startService() 启动服务,它可以

can run in the background indefinitely,

所以如果你有UI 上的进度条,并且您希望它继续更新它,您应该启动您的服务,并在 onResume()/onPause() 中绑定(bind)和取消绑定(bind)它。但要小心:由于您手动启动了该服务,您还应该手动停止它。执行此操作的最简单方法是在服务完成后调用 stopSelf()

这个灵魂涵盖了一个 Activity 的正确绑定(bind),例如即使在 Activity 被销毁或方向更改后,同一服务的进度条也是如此。

关于android - 绑定(bind)到正在运行的服务(在 finish() 之后)/回调处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9730915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com