Android 四大组件之 Service

基础

定义一个服务:创建类继承Service

实现功能:复写onCreate()、onStartCommand()、onDestroy()等方法。onCreate()方法会在创建服务的时候被调用了;onStartCommand()方法会在每次服务器动的时候调用,如果希望服务一旦启动就执行某个动作,就可将这些逻辑写在onStartCommand()方法中;onDestroy()会在服务被销毁的时候被调用,可回收不再使用的资源。

注册服务:<service android:name=“"></service>

启动服务:

Intent intent = new Intent(context, xxService.class);
startService(intent);

停止服务:

Intent intent = new Intent(context, xxService.class);
stopService(intent);

服务自己停止自己:在自定义的Service类中的任意处调用stopSelf()方法。

Service的onCreate()和onStartCommand()
onCreate()只会在服务被第一次创建的时候调用,onStartCommand()会在服务每次启动的时候被调用。

Activity和Service通信

新建自定义Binder类继承Binder
-> 在自定义Service类中创建自定义Binder类的实例
-> 在自定义Service的onBind()方法中返回这个实例
-> 在调用服务的类中创建ServiceConnection匿名类复写onServiceConnected()和onServiceDisconnected()方法(这两个方法分别会在Activity与Service成功绑定、解除绑定的时候调用)
-> 在onServiceConnected()方法中通过向下转型得到自定义Binder类的实例(通过该实例的public方法即可实现Activity和Service间的通信)
-> 绑定Activity和Service:

Intent intent = new Intent(context, xxService.class);
bindService(intent, connection, BIND_AUTO_CREATE);

connection即ServiceConnection匿名类的实例,BIND_AUTO_CREATE表示Activity和Service绑定后自动创建服务,即会使得Service的onCreate()方法被执行,而onStartCommand()方法不会被执行
-> 解除Activity和Service间的绑定:

unbindService(connection);


Service的生命周期

在项目的任意位置调用Context.startService()方法,相应的服务就会启动,并回调onStartCommand()方法;
如果这个服务之前没有创建过,则会先调用onCreate()再调用onStartCommand(),之后服务一直保持运行状态,直到stopService()或stopSelf()被调用;

调用Context.bindService()获取一个服务的持久连接,此时会先调用服务的onBind()方法,类似地,如果这个服务之前没有被创建过,则会先执行onCreate()再执行onBind()方法;
获取到onBind()方法里返回的IBinder对象的实例,实现Activity和Service间的通信;
只要调用方和服务之间的连接没有断开,服务就一直保持运行状态;

当调用startService()/bindService()后调用stopService()/unbindService()方法,服务的onDestroy()方法就会执行;
如果对一个服务既调用了startService()又调用了bindService()方法,则要同时调用stopService()和unbindService()方法,服务的onDestroy()方法才会执行。

使用前台服务

服务的系统优先级较低,当出现系统内存的情况,有可能回收掉正在后台运行的服务,为避免服务因内存不足而被系统回收,可使用前台服务。
前台服务与普通服务最大的区别:前台服务会一直有一个正在运行的图标在系统的状态栏显示,下拉状态栏可看到更加详细的信息,类似于通知的效果。
有些特殊需求,如,显示天气,对应服务在后台更新数据的同时,还会在系统状态栏一直显示当前天气信息,也常通过前台服务实现。

创建前台服务
在自定义Service的onCreate()方法中,添加:

Notification  notification = new Notification(R.drawable.ic_launcher, "Notification comes", System.currentTimeMillis());
Intent intent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
notification.setLatestEventInfo(this, "Test Title", "Test Content", pendingIntent);
startForeground(1, notification);

调用startstartForeground()使得自定义Service成为前台服务。

IntentService

服务中的代码默认运行在主线程中,如果直接在服务中执行耗时操作,易出现ANR(Application Not Responding)的情况。这时就要用到多线程处理,应该在服务对应具体方法中开一个子线程,在里面处理耗时逻辑。如果要实现让一个服务在执行完后自动停止,则应当在处理耗时逻辑结束后调用stopSelf()方法。
另一种最简单直接的方式就是使用IntentService来实现上述操作。

使用IntentService
在自定义IntentService中提供无参构造函数,并调用父类的有参构造函数
-> 复写onHandleIntent()方法,处理具体耗时逻辑(这个方法已经在子线程中运行,不会出现ANR问题)
-> 注册<service android:name=“”></service>
-> 启动IntentService

Intent intent = new Intent(context, xxIntentService.class);
startService(xxIntentService.class);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值