全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android  Service类与生命周期详细介绍

Android  Service类与生命周期

Service是Android四大组件与Activity最相似的组件,都代表可执行的程序,区别在于Service一直在后台运行且没有用户界面。

1.Service的类图和生命周期

先来看看Service的类图:

接下来看看Service的生命周期:

2.开发Service

(1)开发Service需要两步:

第1步:定义子类,继承Service
第2步:在AndroidManifest.xml文件中配置Service

(2)创建Service

public class MyService extends Service {
  // 必须实现,绑定该Service时被回调
  @Override
  public IBinder onBind(Intent intent) {
    return null;
  }
  // Service被创建时回调
  @Override
  public void onCreate() {
    super.onCreate();
    // 定义相关业务逻辑
    System.out.println("Service is Created");
  }
  // Service被启动时回调
  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
    // 定义相关业务逻辑
    System.out.println("Service is Started");
    return START_STICKY;
  }
  // Service被关闭之前回调
  @Override
  public void onDestroy() {
    super.onDestroy();
    System.out.println("Service is Destroyed");
  }
}

(3)配置Service

<application
  ...
  <!-- 配置一个Service组件 -->
  <service android:name=".MyService">
    <intent-filter>
      <!-- 为该Service组件的intent-filter配置action -->
      <action android:name="com.gc.service.MY_SERVICE" />
    </intent-filter>
  </service>
</application>

接下来就可以运行Service了。

(4)启动和停止Service(一般方式)

// 创建启动Service的Intent
final Intent intent = new Intent();
// 为Intent设置Action属性
intent.setAction("com.gc.service.MY_SERVICE");
...
// 启动指定Serivce
startService(intent);
...
// 停止指定Serivce
stopService(intent);

当程序使用startService()、stopService()启动、关闭Service时,Service与访问者之间无法进行通信、数据交换,故下面介绍另一种方式启动和停止Service。

(5)启动和停止Service(绑定Service并与之通信)

如果Service和访问者之间需要进行方法调用或数据交换,则应该使用bindService()和unbindService()方法启动、停止Service。

bindService(Intent intent, ServiceConnection conn, int flags),三个参数如下:

intent:指定要启动的Service

conn:用于监听访问者与Service之间的连接情况,当访问者与Service之间连接成功时将回调该ServiceConnection对象的onServiceConnected(ComponentName name, IBinder service)方法;反之回调该ServiceConnection对象的onServiceDisconnected(ComponentName name)方法(主动调用unbindService方法断开连接时则不回调)

flags:指定绑定时是否创建Service,0:不自动创建;BIND_AUTO_CREATE:自动创建

注意:ServiceConnection对象的onServiceConnected方法中有一个IBinder对象,该对象即可实现与绑定Service之间的通信。
在绑定本地Service的情况下,onBind(Intent intent)方法所返回的IBinder对象将会传给ServiceConnection对象里onServiceConnected(ComponentName name, IBinder service)方法的service参数,这样访问者就可以通过该IBinder对象与Service进行通信。

实际开发通常会采用继承Binder(IBinder的实现类)的方式实现自己的IBinder对象。

public class MyService extends Service {
  private int count;
  // 定义onBinder方法所返回的对象
  private MyBinder binder = new MyBinder();

  // 通过继承Binder来实现IBinder类
  public class MyBinder extends Binder {
    public int getCount() {
      return count; // 获取Service的运行状态
    }
  }
  // 必须实现,绑定该Service时被回调
  @Override
  public IBinder onBind(Intent intent) {
    System.out.println("Service is Binded");
    return binder; // 返回IBinder对象
  }
  // Service被创建时回调
  @Override
  public void onCreate() {
    super.onCreate();
    System.out.println("Service is Created");
    count = 100;
  }
  // Service被断开连接时回调
  @Override
  public boolean onUnbind(Intent intent) {
    System.out.println("Service is Unbinded");
    return true;
  }
  // Service被关闭之前回调
  @Override
  public void onDestroy() {
    super.onDestroy();
    System.out.println("Service is Destroyed");
  }
}

接下来定义一个Activity来绑定该Service,并在该Activity中通过MyBinder对象访问Service的内部状态。

在该Activity绑定该Service后,该Activity还可以通过MyBinder对象来获取Service的运行状态。对于Service的onBind(Intent intent)方法返回的IBinder对象来说,Service允许客户端通过该IBinder对象来访问Service内部的数据,这样即可实现客户端与Service之间的通信。

public class MyServiceTest extends Activity {
  // Service的IBinder对象
  MyService.MyBinder binder;

  // 定义一个ServiceConnection对象
  private ServiceConnection conn = new ServiceConnection() {
    // 当该Activity与Service连接成功时回调
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
      // 获取Service的onBind方法所返回的MyBinder对象
      binder = (MyService.MyBinder) service;
    }
    // 当该Activity与Service断开连接时回调
    @Override
    public void onServiceDisconnected(ComponentName name) {
    }
  };

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ...
    // 创建启动Service的Intent
    final Intent intent = new Intent();
    // 为Intent设置Action属性
    intent.setAction("com.gc.service.MY_SERVICE");
    // 绑定指定Serivce
    bindService(intent, conn, Service.BIND_AUTO_CREATE);
    ...
    binder.getCount(); // 获取Serivce的count值
    ...   
    // 解除绑定Serivce
    unbindService(conn);
  }
}


感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Android  # Service  # 详解  # Service生命周期  # 详解Android中的Service  # Android IntentService详解及使用实例  # Android 如何保证service在后台不被kill  # android使用NotificationListenerService监听通知栏消息  # Android实现微信自动向附近的人打招呼(AccessibilityService)  # Android AccessibilityService实现微信抢红包插件  # Android Service中使用Toast无法正常显示问题的解决方法  # Android基于service实现音乐的后台播放功能示例  # Android Service的启动过程分析  # 回调  # 绑定  # 就可以  # 自己的  # 数据交换  # 客户端  # 运行状态  # 还可以  # 将会  # 子类  # 中有  # 并在  # 希望能  # 来看看  # 与之  # 谢谢大家  # 来实现  # 两步  # 先来  # 可执行 


相关文章: 怀化网站制作公司,怀化新生儿上户网上办理流程?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  建站之星如何配置系统实现高效建站?  如何快速搭建支持数据库操作的智能建站平台?  如何选择PHP开源工具快速搭建网站?  再谈Python中的字符串与字符编码(推荐)  网站设计制作企业有哪些,抖音官网主页怎么设置?  西安专业网站制作公司有哪些,陕西省建行官方网站?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  英语简历制作免费网站推荐,如何将简历翻译成英文?  利用JavaScript实现拖拽改变元素大小  微信小程序制作网站有哪些,微信小程序需要做网站吗?  油猴 教程,油猴搜脚本为什么会网页无法显示?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  建站之星代理如何获取技术支持?  如何在阿里云服务器自主搭建网站?  常州自助建站工具推荐:低成本搭建与模板选择技巧  北京网站制作的公司有哪些,北京白云观官方网站?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  高防服务器如何保障网站安全无虞?  javascript中的try catch异常捕获机制用法分析  Thinkphp 中 distinct 的用法解析  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  如何用搬瓦工VPS快速搭建个人网站?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  深入理解Android中的xmlns:tools属性  如何用景安虚拟主机手机版绑定域名建站?  建站之星客服服务时间及联系方式如何?  个人摄影网站制作流程,摄影爱好者都去什么网站?  网站代码制作软件有哪些,如何生成自己网站的代码?  如何快速配置高效服务器建站软件?  网站专业制作公司有哪些,做一个公司网站要多少钱?  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  如何在万网自助建站平台快速创建网站?  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  婚礼视频制作网站,学习*后期制作的网站有哪些?  如何快速完成中国万网建站详细流程?  三星网站视频制作教程下载,三星w23网页如何全屏?  Android自定义listview布局实现上拉加载下拉刷新功能  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  如何在局域网内绑定自建网站域名?  建站之星Pro快速搭建教程:模板选择与功能配置指南  建站之星展会模板:智能建站与自助搭建高效解决方案  Java解压缩zip - 解压缩多个文件或文件夹实例  如何设计高效校园网站?  常州自助建站:操作简便模板丰富,企业个人快速搭建网站  如何在建站之星网店版论坛获取技术支持?  如何快速查询域名建站关键信息?  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。