Activity面试三(Service)

一,service

service是一种可以在后台执行长时间运行操作而没有用户界面的应用组件。

二,service和Thread的区别(其实二者没有任何关系的)

(1)Service运行在主线程上,不是独立的,是依托于主线程的,不能执行耗时操作,否则会ANR,注意,服务不是后台。

如果一定要进行耗时操作:

可以新开线程执行耗时操作。(既然service也是新开线程执行耗时操作,但为什么不直接在activity里新开线程呢,因为activity容易销毁。)

也可以使用IntentService异步管理服务。

Thread是程序执行的最小单元,是分配CPU的基本单位,在线程里可以执行耗时操作。

(2)长时间任务如音乐播放,定时播放可以用service,但耗时操作如下载文件,数据库出来使用Thread。

三,开启service的两种方式以及区别

(1)生命周期

startService:

客户端调用startService()后:onCreate(),onStartCommand()

客户端调用stopService()后:onDestroy()

bindService:

客户端调用bindService()后:onCreate(),onBind()

客户端调用unbindService()后:onUnbind(),onDestroy()

(2)步骤

startService:

1,定义一个类继承Service,必须实现的onBind方法返回null即可;

2,在Manifest.xml文件中配置该Service;

3,使用startService(intent)方法和stopService(intent)方法启动和停止该service

bindService:

1,定义一个类继承Service,创建一个继承Binder的实例对象(LocalBinder 的对象) ,提供公共方法供客户端使用;

2,实现onBind()方法

如创建内部类,onBind方法返回该binder

private LocalBinder binder = new LocalBinder();
public class LocalBinder extends Binder{
    //声明一个方法,提供给客户端调用实例
    BindService getService(){
        return BindService.this;
    }
}

3,在Manifest.xml文件中配置该Service;

4,在客户端中创建ServiceConnection实例,在回调方法onServiceConnected(ComponentName componentName, IBinder iBinder)中接受binder并获取mService:

BindService.LocalBinder binder = (BindService.LocalBinder) iBinder;
mService = binder.getService();

ServiceConnection的回调方法onServiceDisconnected(ComponentName componentName)在服务崩溃或者服务杀死导致的连接中断时调用

5,客户端中使用bindService(intent,conn,BIND_AUTO_CREATE)方法绑定service,使用unbindService(conn)方法解除绑定。

四,提高Service优先级

1,<service android:name=".MyService" android:priority="1000" /> 将该属性设置为最高,数字越小优先级越低;

2,在onStartCommand里面调用 startForeground()方法把Service提升为前台进程级别,但是在onDestroy里面要调用stopForeground ()方法。

3,在onStartCommand里面返回return Service.START_STICKY;

4,在onDestroy方法里重启service;

五,onStartCommand(Intent intent, int flags, int startId)中flags的意义

START_STICKY:被kill时,保留service的状态为开始状态,但不保留递送的intent对象。然后系统会重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。

START_NOT_STICKY:service被异常kill后,不会重启该服务;

START_REDELIVER_INTENT:service被异常kill后,系统会重启该服务,并将intent的值传入。

START_STICKY_COMPATIBILITY:START_STICKY 的兼容版本,但不保证服务被 kill 后一定能重启。

六,IntentService

IntentService是继承并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统service一样,同时,当任务执行结束后,IntentService会自动停止,不需要手动控制或stopSelf()。另外,可以启动IntentService多次,每一次耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,操作方式是串行的。

本质就是一个特殊的service,封装HandlerThread和Handler的异步框架。

内部原理是HandlerThread和Handler实现的异步操作。

1,使用方法

必须实现构造方法和onHandleIntent(Intent intent)方法

在onHandleIntent方法中,因为是异步方法,所以可以进行耗时操作。

2,源码

在onCreate()方法创建了HandlerThread对象。

在onHandleIntent方法中主动调用了stopSelf方法。

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值