认识安卓组件之服务

2019-08-06  本文已影响0人  _好好学习

@(Android)

创建服务

使用AS new Service时Exported表示是否允许除了当前程序以外的其他程序访问这个服务,Enable表示是否启用这个服务。会自动在AndroidManifest.xml文件中注册。
新建的服务都继承自Service类,该类唯一的抽象方法是publice IBinder onBind(Intent intent){}

服务中最常用的三个方法:

  1. onCreate():会在服务创建的时候调用
  2. onStartCommand(Intent intent, int flags, int startId):会在每次服务启动的时候调用
  3. onDestroy():会在服务销毁的时候调用

启动与停止服务

Intent intent = new Intent(this, MyService.class); startService(intent); stopService(intent);

Activity与Service进行通信

需要创建一个Binder对象(实现一个继承Binder的类,在内部实现逻辑方法),然后在onBinder()方法里返回这个对象实例。
学习ServiceConnection类。
通过bindService();绑定服务,该方法接受三个参数,第一个参数是Intent对象,第二个参数是ServiceConnection实例,第三个参数是一个标志位如BIND_AUTO_CREATE表示在活动和服务进行绑定后自动创建服务,即执行Service的onCreate()方法。
通过unBindService()进行解绑,传入一个ServiceConnection实例。

服务的生命周期

每个服务都只有一个实例,所以不管调用多少次startService(),只需要调用一次stopService()stopSelf(),服务就会停止下来。
如果调用了bindService()与startService(),这时要同时调用stopService()与unbindService()方法,onDestroy()方法才会执行

前台服务

当系统出现内存不足的情况时,就会回收正在后台运行的服务。使用前台服务可以使得避免这一情况,前台服务会有一个正在运行的图标在系统的状态栏显示,类似通知的效果。在Service类的子类的onCreate()中调用startForegroud()方法(接受两个参数,第一个是通知的id,第二个是Notification实例对象)后会让服务变成前台服务,并在系统状态栏显示出来。

IntentService

普通服务的代码是默认运行在主线程中的,如果直接在服务里处理一些耗时的逻辑,就容易出现ANR(Application Not Responding),这时就需要运用Android的多线程编程技术了,应该在服务的每个具体的方法里开启一个子线程,然后在子线程中处理那些耗时的逻辑。但是,这种写法总要程序员去开启线程和调用stopSlef()方法使之停止。为了可以简单地创建一个异步的、会自动停止的服务。Android专门提供了IntentService类。

继承IntentService类,需要在无参的构造函数内调用父类的有参构造函数,子类需要实现onHandleIntent()这个抽象方法,在这个方法中可以去处理一些具体的逻辑,而不用担心ANR问题,因为这个方法已经在子线程中运行。

Service和IntentService区别

上一篇下一篇

猜你喜欢

热点阅读