Android 用于控制服务的防御代码
我正在尝试修改我的多活动应用程序,以便只使用一个LocationListener实例,我打算在服务中实现它。在执行此操作之前,我一直在试验存根活动和存根服务,以了解在错误条件下会发生什么 我想看看如果我试图从一个已经解除绑定的服务中解除绑定会发生什么,如果发生这种情况,我想避免任何错误。该活动有两个绑定/取消绑定按钮。如果我故意连续两次取消绑定,我会得到一个运行时错误Android 用于控制服务的防御代码,android,Android,我正在尝试修改我的多活动应用程序,以便只使用一个LocationListener实例,我打算在服务中实现它。在执行此操作之前,我一直在试验存根活动和存根服务,以了解在错误条件下会发生什么 我想看看如果我试图从一个已经解除绑定的服务中解除绑定会发生什么,如果发生这种情况,我想避免任何错误。该活动有两个绑定/取消绑定按钮。如果我故意连续两次取消绑定,我会得到一个运行时错误 我可以在标记为“的点上测试什么条件最简单的方法是引入另一个变量,例如,isservconnbund,并在绑定和取消绑定操作上添加
我可以在标记为“的点上测试什么条件最简单的方法是引入另一个变量,例如,
isservconnbund
,并在绑定和取消绑定操作上添加检查。当然,记得在调用bindService
和unbindService
后更新变量。我同意vhallac
——只需使用布尔标志。您对这种方法有何顾虑?至于我,没什么好怕的
至于为什么“活动的onServiceDisconnected()从未被调用”-是的,这是正常的。看看API在这个回调上说了什么:
当与服务的连接丢失时调用。这通常发生在承载服务的进程崩溃或被终止时
您的进程既没有崩溃也没有被终止,因此这是一种预期行为。更重要的是,由于您的服务在同一个过程中,因此您永远不会得到此调用。当您绑定到在另一个进程中运行的服务(进程间通信)时,这一点很重要。在完美的条件下,这是显而易见的方法,但我也想处理“不可能发生”的问题。我可能只是想在我所有真正应用程序的活动中,在启动时绑定,在顶部取消绑定。我想捕获任何异常都可能需要这样做,这就是API示例代码所做的,所以我想这没关系。我现在有两个存根活动,它们在启动/停止时绑定/取消绑定到实现LocationListener的服务。这会发送一个广播onLocationChanged,似乎被接收机接收到。我只需要确保它没有泄漏,我会把它插入真正的应用程序中。谢谢
public void myClickHandler(View target) {
switch (target.getId()) {
case R.id.bind:
Log.d("STAG", "Activity One pressed BIND button");
mServiceConnected = bindService(new Intent(
"com.nbt.servicetest.LOCATIONSERVICE"), mServconn,
Context.BIND_AUTO_CREATE);
break;
case R.id.unbind:
Log.d("STAG", "Activity One pressed UNBIND button");
try{
if (mServconn != null) // <<<< What to put here if already unbound?
unbindService(mServconn);}
catch(Exception e){
Log.d("STAG", "Exception " + e.getMessage());
}
break;
}
}
ServiceConnection mServconn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d("STAG", "Activity One service connected");
mIbinder = service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d("STAG", "Activity One service disconnected");
}
};
STAG(2945): Activity One onCreate
STAG(2945): Activity One onStart
STAG(2945): Activity One onResume
STAG(2945): Activity One pressed BIND button
STAG(2945): Loc service ONCREATE
STAG(2945): Loc service ONBIND
STAG(2945): Activity One service connected
STAG(2945): Activity One pressed UNBIND button
STAG(2945): Loc service ONUNBIND
STAG(2945): Loc service ONDESTROY
STAG(2945): Activity One pressed UNBIND button
STAG(2945): Exception Service not registered: com.nbt.servicetest.ServiceTesterActivityOne$1@43b8b290