8.1.2  绑定Activity和Service

本节的例子代码所在的工程目录是src\ch08\ch08_serviceactivity

如果使用8.1.1节介绍的方法启动服务,并且未调用stopService来停止服务,这个服务就会随着Android系统的启动而启动,随着Android系统的关闭而关闭。也就是服务会在Android系统启动后一直在后台运行,直到Android系统关闭后服务才停止。但有时我们希望在启动服务的Activity关闭后服务自动关闭,这就需要将Activity和Service绑定。

通过bindService方法可以将Activity和Service绑定。bindService方法的定义如下:public boolean bindService(Intent service,

ServiceConnection conn, int flags)

该方法的第1个参数表示与服务类相关联的Intent对象,第2个参数是一个ServiceConnection类型的变量,负责连接Intent对象指定的服务。通过ServiceConnection对象可以获得连接成功或失败的状态,并可以获得连接后的服务对象。第3个参数是一个标志位,一般设为Context.BIND_AUTO_CREATE。

下面重新编写8.1.1节的MyService类,在该类中增加了几个与绑定相关的事件方法。package net.blogjava.mobile.service;

import android.app.Service;

import android.content.Intent;

import android.os.Binder;

import android.os.IBinder;

import android.util.Log;

public class MyService extends Service

{

private MyBindermyBinder=newMyBinder();

//  成功绑定后调用该方法

@Override

public IBinder onBind(Intent intent)

{

Log.d("MyService", "onBind");

return myBinder;

}

//  重新绑定时调用该方法

@Override

public void onRebind(Intent intent)

{

Log.d("MyService", "onRebind");

super.onRebind(intent);

}

//  解除绑定时调用该方法

@Override

public boolean onUnbind(Intent intent)

{

Log.d("MyService", "onUnbind");

return super.onUnbind(intent);

}

@Override

public void onCreate()

{

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

super.onCreate();

}

@Override

public void onDestroy()

{

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

super.onDestroy();

}

@Override

public void onStart(Intent intent, int startId)

{

Log.d("MyService", "onStart");

super.onStart(intent, startId);

}

public class MyBinder extends Binder

{

MyService getService()

{

return MyService.this;

}

}

}

现在定义一个MyService变量和一个ServiceConnection变量,代码如下:private MyService myService;

private ServiceConnectionserviceConnection=newServiceConnection()

{

//  连接服务失败后,该方法被调用

@Override

public void onServiceDisconnected(ComponentName name)

{

myService=null;

Toast.makeText(Main.this, "Service

Failed.", Toast.LENGTH_LONG).show();

}

//  成功连接服务后,该方法被调用。在该方法中可以获得MyService对象

@Override

public void onServiceConnected(ComponentName name, IBinder service)

{

//  获得MyService对象

myService= ((MyService.MyBinder) service).getService();

Toast.makeText(Main.this, "Service

Connected.", Toast.LENGTH_LONG).show();

}

};

***使用bindService方法来绑定Activity和Service,代码如下:bindService(serviceIntent, serviceConnection, Context.BIND_AUTO_CREATE);

如果想解除绑定,可以使用下面的代码:unbindService(serviceConnection);

在MyService类中定义了一个MyBinder类,该类实际上是为了获得MyService的对象实例的。在ServiceConnection接口的onServiceConnected方法中的第2个参数是一个IBinder类型的变量,将该参数转换成MyService.MyBinder对象,并使用MyBinder类中的getService方法获得MyService对象。在获得MyService对象后,就可以在Activity中随意操作MyService了。

运行本节的例子后,单击【Bind Service】按钮,如果绑定成功,会显示如图8.3所示的信息提示框。关闭应用程序后,会看到在LogCat视图中输出了onUnbind和onDestroy信息,表明在关闭Activity后,服务先被解除绑定,***被销毁。如果先启动(调用startService方法)一个服务,然后再绑定(调用bindService方法)服务,会怎么样呢?在这种情况下,虽然服务仍然会成功绑定到Activity上,但在Activity关闭后,服务虽然会被解除绑定,但并不会被销毁,也就是说,MyService类的onDestroy方法不会被调用。

图8.3  绑定服务

【责任编辑:云霞 TEL:(010)68476606】

点赞 0

android多个activity绑定一个service,8.1.2 绑定Activity和Service相关推荐

  1. Android Studio开发基础之启动Service,并通过从Activity向Service传递数据

    本实例演示启动Service,并通过从Activity向Service传递数据,新建一个Service,并敲如下代码: package com.example.lhb.startservice;imp ...

  2. android 启动服务同时传递数据,Android Studio开发基础之起动Service,并通过从Activity向Service传递数据...

    Android Studio开发基础之启动Service,并通过从Activity向Service传递数据 本实例演示启动Service,并通过从Activity向Service传递数据,新建一个Se ...

  3. Android筑基——Activity的启动过程之同进程在一个Activity中启动另一个Activity(基于api21)

    目录 1. 前言 2. 正文 2.1 Activity类的startActivity()方法 2.2 Instrumentation类的execStartActivity()方法 2.3 Activi ...

  4. Android官方开发文档Training系列课程中文版:管理Activity的生命周期之启动一个Activity

    原文地址 : http://android.xsoftlab.net/training/basics/activity-lifecycle/index.html 导言 用户通过导航退出或者返回应用的时 ...

  5. android 获取apk主activity,关于如何知道一个安装的apk的主activity

    关于如何查找知道一个安装的apk的主activity 关于如何查找知道一个安装的apk的主activity,从而命令行进行am start的方法: $ adb install /media/neil/ ...

  6. 用android中的Preferencescreen 启动一个新的 activity

    android的 setting里的Preferencescreen,它不仅可以作为设置界面显示,而且还能够启动activity,下面主要是对启动activity的介绍 一. Preferencesc ...

  7. Android MVVM框架搭建(十)Hilt、ViewBinding、Activity Result API

    Android MVVM框架搭建(十)Hilt.ViewBinding.Activity Result API 前言 正文 一.依赖 二.Hilt使用 1. Hilt 应用类 2. ViewModel ...

  8. 【Service】bindService:绑定本地服务和远程服务示例

    绑定本地服务 AndroidManifest.xml中声明服务: <service android:name=".TestLocalService"><inten ...

  9. android Service oncreate 在UI线程 何时用service,何时用thread

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 服务的生命周期 各个方法 都是在主线程中的. 这里的操作可以导致主线程阻塞. 这些方法, ...

最新文章

  1. 高校一副教授2021年全部收入清单来了!对比清华大学教授工资单 ,差距究竟大不大?...
  2. 学习OGRE - 读取天龙八部scene文件
  3. head first servlet jsp 学习笔记
  4. MSP430F5XXX中的ADC12使用
  5. mysql orderby多个_MySQL OrderBy
  6. 加分进了字节,MySQL真yyds!
  7. 网卡 远程唤醒问题故障排除
  8. mysql+字段+删除数据库表,MySQL命令行删除表中的一个字段
  9. 为推广苹果音乐服务 库克再度现身北京
  10. js判断url是否有效
  11. 19. jQuery 遍历
  12. 二阶系统响应指标图_一阶系统和二阶系统,了解一下!!!
  13. 浅谈统计检验效能和FDR
  14. Linux常用操作命令和命令行编辑快捷键
  15. 求最长不下降序列:逆推法
  16. 武大计算机保研北大,17名北大毕业生保研到武大?网友说亏大了,其实这些学生赚大了!...
  17. 图解数据分析:从入门到精通系列教程
  18. 大华服务器没进系统,交换机与大华服务器链路聚合出问题
  19. 「蚂蚁金服」热搜的背后:「李开复」到底是不是口误?
  20. SVG的国旗图标集合flag-icon-css在vue中的使用

热门文章

  1. nokia n1 android 6,诺基亚推Nokia N1拥抱安卓,微软该怎么想?
  2. 云服务器如何实现装虚拟机_如何在服务器上安装虚拟机呢?服务器虚拟机安装教程...
  3. java备份mysql数据库备份_Java实现MySQL数据库备份
  4. 33、JSONP跨域
  5. C语言学习输入输出函数,函数的调用
  6. E2: A Framework for NFV Applications, SOSP' 15
  7. 坚果云开发团队分享高效代码审查经验
  8. 技术员例会记要(一)
  9. 在ASP.NET使用javascript的一点小技巧(转www.chinacs.net 中文C#技术站 )
  10. 计算机辅助语文识字教学的优势,小学语文计算机辅助教学研究