我编写了一个 android 程序:有一个 UI 主要活动,并且它启动一个服务。该服务及时回调 UI 活动以更新视图。它工作正常,除了:如果活动关闭(使用 BACK)并再次启动,服务也将再次启动(服务播放音频文件,因此有两个重叠的声音)。
我使用带有 BIND_AUTO_CREATE 标志的 bindService 来启动并连接到服务。根据文档,只有当服务不存在时才应该创建服务,但显然它在第二次打开时会启动另一个实例。
我想要的只是当活动关闭时,服务继续运行,当活动再次打开时,它可以重新连接到服务。那可能吗?或者我只是误解了服务的用法?
尝试了更多:
在bindService Intent中使用ICountService(在.aidl中描述)而不是CountService。当 Activity 关闭时,会调用 onDestroyed。
下面是创建服务的代码(如果有帮助的话)。
ServiceConnection conn = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName c, IBinder b) {
Log.d("TK","Connected");
//binder = (ICountService.Stub) b;
service = ICountService.Stub.asInterface(b);
try {
service.setCallback(new ICountCallback.Stub(){
@Override
public void alert() {
Log.d("TK","alert!");
}
@Override
public void updateTime(final int sec) {
handler.post(new Runnable(){
@Override
public void run() {
indicator.setText(toText(sec));
}
});
}
});
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName c) {
Log.d("TK","Disconnected");
}
};
private void startCountService(){
Intent i = new Intent(ICountService.class.getName());
boolean ok = context.bindService(i, conn, Context.BIND_AUTO_CREATE);
Log.d("TK", "bindService="+ok);
}
根据文档,只有当服务不存在时才应该创建服务,但显然它在第二次打开时会启动另一个实例。
bindService()
如果服务未运行,将创建服务实例。unbindService()
如果没有其他绑定连接并且没有人调用,将销毁服务实例startService()
。如果服务被破坏unbindService()
,然后是后续的bindService()
将创建一个新的服务实例。
恕我直言,理想情况下,unbindService()
不会立即销毁服务,而是先让它停留几秒钟,以防万一bindService()
不久之后unbindService()
。然而,他们并不是这样实施的。
我想要的只是当活动关闭时,服务继续运行,当活动再次打开时,它可以重新连接到服务。
你应该使用startService()
and stopService()
代替(或可以想象除了)bindService()
and unbindService()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)