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

 更新时间:2017年03月07日 09:14:51   投稿:lqh  
这篇文章主要介绍了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 WebView组件用法详解

    Android WebView组件用法详解

    这篇文章主要介绍了Android WebView组件用法,结合实例形式详细分析了Android WebView组件的功能、权限设置、布局及使用技巧,需要的朋友可以参考下
    2016-02-02
  • Android自定义带进度条WebView仿微信加载过程

    Android自定义带进度条WebView仿微信加载过程

    这篇文章主要为大家详细介绍了Android自定义带进度条WebView仿微信加载过程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Android 3D滑动菜单完全解析 Android实现推拉门式的立体特效

    Android 3D滑动菜单完全解析 Android实现推拉门式的立体特效

    这篇文章主要为大家详细介绍了Android 3D滑动菜单,Android实现推拉门式的立体特效,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Android之头像图片变圆形显示

    Android之头像图片变圆形显示

    本文主要介绍了Android中头像图片变圆形的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04
  • Android 实现加载大图片的方法

    Android 实现加载大图片的方法

    对于超大的图片,如果不缩放的话,容易导致内存溢出。而经过处理后,无论多大的图片,都能够在手机屏幕上加载出来,不会导致内存溢出。本文将对Android 加载大图片的实现方法进行介绍,下面跟着小编一起来看下吧
    2017-04-04
  • Android高级UI特效仿直播点赞动画效果

    Android高级UI特效仿直播点赞动画效果

    这篇文章主要介绍了Android高级UI特效仿直播点赞动画效果,最近比较火的抖音快手直播视频都有这样的效果,下面脚本之家小编给大家带来android 仿直播点赞效果的实现代码,需要的朋友参考下吧
    2018-03-03
  • 浅析Android中常见三种弹框在项目中的应用

    浅析Android中常见三种弹框在项目中的应用

    这篇文章主要介绍了浅析Android中常见三种弹框在项目中的应用,需要的朋友可以参考下
    2017-03-03
  • 详解Java编程中的反射在Android开发中的应用

    详解Java编程中的反射在Android开发中的应用

    这篇文章主要介绍了详解Java编程中的反射在Android开发中的应用,主要来获取安卓系统的属性值,需要的朋友可以参考下
    2015-07-07
  • Android中Fragment管理及重叠问题的解决方法

    Android中Fragment管理及重叠问题的解决方法

    最近做项目碰到了Fragment重叠的问题,后来通过种种方法得以解决了,所以想着总结下这个问题的解决方法,以及Android中Fragment的管理,方便自己也给有需要的朋友们提供以帮助,感兴趣的朋友们下面通过这篇文章一起来学习学习吧
    2016-11-11
  • 教你轻松制作Android音乐播放器

    教你轻松制作Android音乐播放器

    这篇文章主要教大家轻松制作Android音乐播放器,制作一款属于自己的Android音乐播放器,希望大家喜欢。
    2015-11-11

最新评论