认识安卓组件之服务
@(Android)
创建服务
使用AS new Service时Exported
表示是否允许除了当前程序以外的其他程序访问这个服务,Enable
表示是否启用这个服务。会自动在AndroidManifest.xml文件中注册。
新建的服务都继承自Service类,该类唯一的抽象方法是publice IBinder onBind(Intent intent){}
服务中最常用的三个方法:
- onCreate():会在服务创建的时候调用
- onStartCommand(Intent intent, int flags, int startId):会在每次服务启动的时候调用
- 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问题,因为这个方法已经在子线程中运行。