错误:java.lang.IllegalArgumentException: Service not registered

在做Service的绑定和解绑小项目测试的时候,绑定成功,解绑也成功,但是如果解除绑定后再点击给解除绑定的指令(项目中就是点击按钮解除绑定),会报这个错误:

AndroidRuntime(7090): java.lang.IllegalArgumentException: Service not registered: 
com.m1910.servicetest.MainActivity$1@41ddfcc0

错误提示Service没有注册,事实上我在Manifest.xml中已经注册过这个Service了。
修改前代码:

  1. 	@Override
  2. 	public void onClick(View v) {
  3. 		switch (v.getId()) {
  4. 		case R.id.start_service:
  5. 			Intent startIntent = new Intent(this, MyService.class);
  6. 			startService(startIntent);// 启动服务
  7. 			break;
  8. 		case R.id.stop_service:
  9. 			Intent stopIntent = new Intent(this, MyService.class);
  10. 			stopService(stopIntent);// 停止服务
  11. 			break;
  12. 		case R.id.bind_service:
  13. 			Intent bindIntent = new Intent(this, MyService.class);
  14.                         // 绑定服务
  15. 			bindService(bindIntent, connection, BIND_AUTO_CREATE);
  16. 			break;
  17. 		case R.id.unbind_service:
  18. 			unbindService(connection);// 解绑服务	
  19. 			break;
  20. 		default:
  21. 			break;
  22. 		}
  23. 	}

查询官方文档中关于unbindService()这个方法的介绍:

public abstract void unbindService (ServiceConnection conn)
 
Added in API level 1
Disconnect from an application service. You will no longer receive calls as the service is restarted, and the service is now allowed to stop at any time.
 
Parameters
conn	The connection interface previously supplied to bindService(). This parameter must not be null.

最后一句看到这个传入的conn参数不能为null,也就是必须有绑定存在,才能解绑,小项目中绑定成功后第一次点击解绑不会报错,解绑后这个参数就是null了,再次点击解绑就会报错,那么我们为解绑加一个判断就可以了。
修改后代码如下:

  1. private boolean isBound = false;
  2.  
  3. 	@Override
  4. 	public void onClick(View v) {
  5. 		switch (v.getId()) {
  6. 		case R.id.start_service:
  7. 			Intent startIntent = new Intent(this, MyService.class);
  8. 			startService(startIntent);// 启动服务
  9. 			break;
  10. 		case R.id.stop_service:
  11. 			Intent stopIntent = new Intent(this, MyService.class);
  12. 			stopService(stopIntent);// 停止服务
  13. 			break;
  14. 		case R.id.bind_service:
  15. 			Intent bindIntent = new Intent(this, MyService.class);
  16.                         // 绑定服务
  17. 			isBound = bindService(bindIntent, connection, BIND_AUTO_CREATE);
  18. 			break;
  19. 		case R.id.unbind_service:
  20. 			if (isBound) {
  21. 				unbindService(connection);// 解绑服务
  22. 				isBound = false;
  23. 			}
  24. 			break;
  25. 		default:
  26. 			break;
  27. 		}
  28. 	}

网上也有人用getApplicationContext().unbindService(mConnection);这样来做,什么意思我也不太懂,不过最终效果一样也是要加一个是否为空的判断。

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值