在 Android Service 未被绑定的情况下,调用 unbindService(connection) 会报错误:service Service not registered, 所以在解除绑定前要先判断连接是否处于绑定状态.

MainActivity类:

public class MainActivity extends AppCompatActivity {

private MyService.DownloadBinder downloadBinder;

private boolean isBind = false; //是否绑定服务

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

final Button startService = (Button)findViewById(R.id.start_service);

final Button stopService = (Button)findViewById(R.id.stop_service);

final Button bindService = (Button)findViewById(R.id.bind_service);

final Button unbindService = (Button)findViewById(R.id.unbind_service);

startService.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent startIntent = new Intent(MainActivity.this, MyService.class);

startService(startIntent);

}

});

stopService.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent stopIntent = new Intent(MainActivity.this, MyService.class);

stopService(stopIntent);

}

});

bindService.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent bindIntent = new Intent(MainActivity.this, MyService.class);

isBind = bindService(bindIntent, connection, BIND_AUTO_CREATE); //绑定服务

}

});

unbindService.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

if(isBind){ //解除绑定前要判断服务是否是绑定状态,其实此处应该还要加入 connection 是否为null 的判断

unbindService(connection); //解绑服务

isBind = false;

}

}

});

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.menu_main, menu);

return true;

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

// Handle action bar item clicks here. The action bar will

// automatically handle clicks on the Home/Up button, so long

// as you specify a parent activity in AndroidManifest.xml.

int id = item.getItemId();

//noinspection SimplifiableIfStatement

if (id == R.id.action_settings) {

return true;

}

return super.onOptionsItemSelected(item);

}

private ServiceConnection connection = new ServiceConnection() {

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

downloadBinder = (MyService.DownloadBinder)service;

downloadBinder.startDownload();

downloadBinder.getProgress();

}

@Override

public void onServiceDisconnected(ComponentName name) {

}

};

}

MyService类:

public class MyService extends Service {

private DownloadBinder mBinder = new DownloadBinder();

public MyService() {

}

@Override

public IBinder onBind(Intent intent) {

return mBinder;

}

@Override

public void onCreate() {

super.onCreate();

Log.d("MyService", "onCreate execute");

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

Log.d("MyService", "onStartCommand execute");

return super.onStartCommand(intent, flags, startId);

}

@Override

public void onDestroy() {

super.onDestroy();

Log.d("MyService", "onDestroy execute");

}

class DownloadBinder extends Binder{

public void startDownload(){

Log.d("MyService", "startDownload executed");

}

public int getProgress(){

Log.d("MyService", "getProgress executed");

return 0;

}

}

}

android serviceconnection unbind流程,Android Service 再次 unbindSrvice 时的问题相关推荐

  1. android serviceconnection unbind流程,Android - Service Bind/Unbind 使用

    Service Bind/Unbind 使用方式 本文介绍了本地服务,也就是同一个进程内的服务,如何使用 Bind/Unbind 方式被 Activity 使用. 本文不涉及 AIDL 使用 Serv ...

  2. android serviceconnection unbind流程,Android unbindService 流程分析

    基于Android 6.0的源码剖析, 分析bind service的启动流程. /frameworks/base/core/java/android/app/ContextImpl.java /fr ...

  3. android p 权限流程,Android native 权限控制流程

    关联文章: 前言: 在 Android Runtime Permission 详解 中详细的说明了permission 在Android 6.0 前后的区别,对于M 以后应用可以通过checkPerm ...

  4. android zygote启动流程,Android zygote启动流程详解

    对zygote的理解 在Android系统中,zygote是一个native进程,是所有应用进程的父进程.而zygote则是Linux系统用户空间的第一个进程--init进程,通过fork的方式创建并 ...

  5. android屏幕适配流程,Android屏幕适配姿势

    GitHub地址 为什么要屏幕适配? device_framentation.png 统计 碎片化 品牌机型碎片化 屏幕尺寸碎片化 操作系统碎片化 为了保证用户获得一致的用户体验效果,使得某一元素在A ...

  6. android otg 挂载流程,android USB OTG功能如何打开及实现

    1.检查HW原理图,确认是否支持OTG功能(vbus是否供上电,IDDIG pin链接是否正确) 2.若HW确认支持OTG功能,则按照如下方法分别打开USB OTG功能及实现挂载: 如何打开USB O ...

  7. android wifi wps 流程,android中WiFi wps连接方式

    Android 个人热点 wps方式连接流程 android手机开启个人热点时,可以选择WPS连接方式 个人热点端 连接端 当个人热点端选择按钮时,连接端只需要点击WPS按钮即可连接:当个人热点端选择 ...

  8. Android 安装apk流程,Android PMS(二)-Apk安装流程

    原创内容,转载请注明出处,多谢配合. 一.APK组成 在APK的安装流程,在此之前先简单了解下APK组成: 目录/文件 描述 assert 存放的原生资源文件,通过AssetManager类访问. l ...

  9. android 蓝牙扫描流程,Android 9.0 Bluetooth源码分析(二)蓝牙扫描流程

    1 UI 蓝牙开始扫描位于setting的 /packages/apps/Settings/src/com/android/settings/bluetooth/BluetoothPairingDet ...

最新文章

  1. 关于登录记住密码使用cookie的详解
  2. 四十一、Vue项目上手 | 用户管理系统 实现用户修改和删除功能(完成篇)
  3. xp系统的计算机管理中用户在哪里,WINDOWSXP的用户管理和系统安全设置
  4. OJ1062: 最大公约数(C语言)
  5. 【数字图像处理】直方图均衡化详解及编程实现
  6. Mysql查询数据(单表查询)
  7. chap8_1 Render to texture in OGRE
  8. RTMP 协议包头参考
  9. Myeclipse的web项目移植到Eclipse中需要添加的包
  10. mysql数据库定时清理数据
  11. excel打不开html格式的文件,excel文件打不开提示格式无效怎么解决【图文】
  12. 叶罗丽颜值测试软件齐娜多少分,精灵梦叶罗丽:美颜相机下灵公主16岁、齐娜7岁,他竟然拍的46岁...
  13. python实现在线答题_仿 StackOverflow 开发在线问答系统
  14. Java手机游戏新流星蝴蝶剑,网页最好玩的游戏
  15. C语言程序设计笔记(浙大翁恺版) 第七章:函数
  16. 如何对Hive Metastore进行权限控制
  17. 1000行代码入门python-小白入门篇,Python到底是什么?
  18. [NOIP]模拟17 题解
  19. 运行期间动态切换Redis数据库
  20. 【JavaSE】算术运算符、关系运算符、逻辑运算符、赋值运算符与三元运算符

热门文章

  1. [面试] 算法 —— 数组(有序二维数组的查找)
  2. hive 操作(五)——常用内置函数
  3. 使用 Java API 操作 HBase
  4. 面试中的智力题及编程实践
  5. java assert可以检查exception吗_PETCT检查可以排查大肠癌吗?
  6. python所有软件-太牛逼!一款软件几乎可以操作所有的数据库!
  7. python自学行吗-自学Python可以吗?怎样从入门到大师?我写这篇文章告诉你
  8. python官网的软件-mPython
  9. 如何系统的自学python-如何系统地自学Python?
  10. python能干什么-Python这么火,学完到底能干什么