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); } }

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

时间: 2024-08-26 20:32:09

Android Service类与生命周期详细介绍的相关文章

Android Activity的生命周期详细介绍

Android Activity的生命周期详细介绍 生命周期描述的是一个类从创建(new出来)到死亡(垃圾回收)的过程中会执行的方法.在这个过程中,会针对不同的生命阶段调用不同的的方法. Activity是Android中四大组件之一,是最常见的应用组件,也是用的最多的组件,它能够提供一个界面与用户进行交互.Activity从创建到销毁有多种状态,从一种状态到另一种状态时会激发相应的回调方法,这些回调方法包括:onCreate  onDestory  onStart  onStop  onRes

Android静态变量的生命周期 简单介绍_Android

Android是用Java开发,其静态变量的生命周期遵守Java的设计.我们知道静态变量是在类被load的时候分配内存的,并且存在于方法区.当类被卸载的时候,静态变量被销毁.在PC机的客户端程序中,一个类被加载和卸载,可简单的等同于jvm进程的启动和结束.那么在Android中呢?用的Dalvik vm也是一样的.不过Android不太突出的进程概念,所以对静态变量的生命周期就会感觉模糊,这种模糊对于值类型是无所谓的,如果是静态的对象引用,则与内存回收.内存泄漏这些问题有关,有必要加深研究和理解

Android静态变量的生命周期 简单介绍

Android是用Java开发,其静态变量的生命周期遵守Java的设计.我们知道静态变量是在类被load的时候分配内存的,并且存在于方法区.当类被卸载的时候,静态变量被销毁.在PC机的客户端程序中,一个类被加载和卸载,可简单的等同于jvm进程的启动和结束.那么在Android中呢?用的Dalvik vm也是一样的.不过Android不太突出的进程概念,所以对静态变量的生命周期就会感觉模糊,这种模糊对于值类型是无所谓的,如果是静态的对象引用,则与内存回收.内存泄漏这些问题有关,有必要加深研究和理解

Java 线程的生命周期详细介绍及实例代码_java

当线程被创建并启动之后,它既不是一启动就进入执行状态,也不是一直处于执行状态,在其生命周期中,要经过"新建(New)"."就绪(Runnable)"."运行(Running')"."阻塞(Blocked)"和"死亡(Dead)"五种状态.线程在创建之后,不可能一直霸占着CPU独立运行,需要在多个线程之间切换,所以大部分时间处于运行.阻塞之间切换.  一.线程的状态 线程的存在有几种不同的状态,如下: New

Spring Bean的生命周期详细介绍_java

Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring容器.这里,我们讲的也是 ApplicationContext中Bean的生命周期.而实际上BeanFactory也是差不多的,只不过处理器需要手动注册. 一.生命周期流程图: Spring Bean的完整生命周期从创建Spring容器开始,直到最终Spring容器销毁Bean,这其中包含了一系列关

Docker Runc容器生命周期详细介绍_docker

Docker Runc容器生命周期 容器的生命周期涉及到内部的程序实现和面向用户的命令行界面,runc内部容器状态转换操作.runc命令的参数定义的操作.docker client定义的容器操作是不同的,比如对于docker client的create来说, 语义和runc就完全不同,这一篇文章分析runc的容器生命周期的抽象.内部实现以及状态转换图.理解了runc的容器状态转换再对比理解docker client提供的容器操作命令的语义会更容易些. 容器生命周期相关接口 最基本的require

Android Intent传递数据底层分析详细介绍

Android  Intent传递数据底层分析详细介绍 我们知道在Activity切换时,如果需要向下一个ActivityB传递数据,可以借助Intent对象的putExtra方法. 但是不知各位有没有想过这样一个问题:ActivityB中获取到的对象跟上一个Activity中的那个对象有什么关系? 换句话说就是,我在ActivityB中通过Intent获取的对象跟ActivityA中的那个对象,有没有可能是同一个对象? 按照常理来说,博主提出一个设想后续的就是证明过程了,但是我要遗憾的告诉你,

类的生命周期回顾篇

一.JAVA虚拟机和JAVA程序的生命周期 JAVA虚拟机的生命周期和JAVA程序的生命周期一致,当我们在命令行中敲入java命令运行java程序时,java虚拟机进程启动,程序运行,当程序终止时,则JAVA虚拟机的生命也结束. 二.类的生命周期 1.加载:将.class文件的二进制数据放到内存方法区中,并在堆区中创建一个Class对象,这个Class对象封装了方法区的数据结构,用户能通过Class对象访问到方法区中. 2.连接 (1)验证:验证.class文件是否是通过JAVA程序编译出来的,

Android中Activity的生命周期探讨_Android

1.完整生命周期 上图是Android Activity的生命周期图,其中Resumed.Paused.Stopped状态是静态的,这三个状态下的Activity存在时间较长. (1)Resumed:在此状态时,用户可以与Activity进行交互,Activity在最前端 (2)Paused:在此状态时,Activity被另外一个Activity遮盖,此Activity不可接受用户输入信息.另外一个Activity来到最前面,半透明的,但并不会覆盖整个屏幕. (3)Stopped:在此状态时,A