我是一名初学者,他制作了一个简单的程序来展示服务的运作方式。
.....
toStartService = new Intent(this, SimpleService.class);
sc = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Toast.makeText(MoreService.this, "SC: Binded", Toast.LENGTH_SHORT).show();
}
@Override
public void onServiceDisconnected(ComponentName name) {
Toast.makeText(MoreService.this, "SC: Unbinded", Toast.LENGTH_SHORT).show();
}
};
startService.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MoreService.this, "Starting Service", Toast.LENGTH_SHORT).show();
startService(toStartService);
}
});
stopService.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopService(toStartService);
}
});
bindService.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if((isBound = bindService(toStartService, sc, BIND_AUTO_CREATE))) {
}
}
});
unbindService.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(isBound) {
unbindService(sc);
isBound = false;
}
}
});
}
为什么没有传递sc变量(在bindService()上)调用sc.onServiceConnected()方法? 代码怎么了?
我遇到以下情况:
当我按[startService]时 服务开始很好,然后 [stopService]服务停止运行。
当我按[startService]时,[bindService]什么都不做,[unbindService]都没有。
为什么bindService创建的服务在解除绑定时会被销毁?我尝试使用startService启动服务,但它无法绑定。
Arrgh帮助我,对不起,如果我错了。
答案 0 :(得分:2)
这是所有这些方法的设计行为。例如,在根据the documentation的bindService(Intent service, ServiceConnection conn, int flags)
方法中,只要存在调用上下文,服务才会运行:
只要存在调用上下文,系统就会认为该服务是必需的。例如,如果此Context是停止的Activity,则在恢复活动之前,不需要该服务继续运行。
对于unbindService (ServiceConnection conn)
文档说:
断开与应用程序服务的连接。服务重新启动后,您将不再接听电话,现在可以随时停止服务。
在startService (Intent service)
documentation中说:
使用
startService()
会覆盖由bindService(Intent, ServiceConnection, int)
管理的默认服务生命周期:它要求服务在调用stopService(Intent)
之前保持运行,无论是否有任何客户端连接到它。请注意,startService()
的来电不会嵌套:无论您拨打startService()
多少次,只需拨打一次stopService(Intent)
即可停止拨打电话。