Android面试集锦之Service(知识整理)

本文主要讲解两个部分:
一、service的应用场景,以及和Thread的区别
二、开启service的两种方式以及区别

第一部分又可以分为:
Service基础:
1.Service是什么?
Service是一种可以在后台执行长时间运行操作而没有用户界面的应用组件。

可以进行一些长时间的逻辑操作,用户并不会看到相关界面,必须的时候可以在app退出后,仍保持一段时间。(所以现在Service保活是必须要掌握的了)
需要注意的是:
Service和广播都有一个共同点,都是运行在主线程中的,都不能进行耗时操作

2.Service和Thread的区别
1.Thread运行是相对独立的,而本地Service是依附于主线程的
2.其实Thread和Service是没有任何关系的!就像老婆饼跟老婆有关系吗?我昨天刚吃了一个老婆饼,那咋不给我个老婆呢?
这里写图片描述
之所以把两者联系在一起,理解问题,总觉得Service是服务是用来进行耗时操作的!不要把后台和子线程联系在一起!android的后台是指即使页面退出了,app退出了,也照样进行服务的。
若是Service要进行耗时操作,那么也要开启子线程。

第二部分:
开启service有两种方式:
一.startService:
通过在activity调用此方法创建的service,一旦服务开始,就会在后期无限运行,即使activity销毁了,照样运行,除非手动销毁。
首先说一下service的生命周期:
① onbind():
这个是第二种方式bindService中才用到的,startService中可以直接返回null
②oncreate():
在onbind和onstartcommand之前调用,首次创建服务时调用,如果服务已在运行,就不会走这个方法,该方法只调用一次
③onstartcommand():
每次通过startServic()方法启动Service是都会被回调
④ondestroy():
服务销毁时调用

使用步骤:
1.定义一个类继承Service
2.在Manifest.xml文件中配置该Service
3.使用Context的startService(intent)
4. 不再使用时,调用stopService(intent)
二、bindService
服务和Activity处于绑定状态,允许service和activity进行数据交互,service处于不同进程中时,可以通信。这种service只有绑定activity之后才可以运行,并且多个activity可以绑定同一个service,如果绑定全部取消,就会自动销毁

使用步骤:
1.创建BindService服务端,继承自Service并在类中,创建一个实现IBinder接口的实例对象并提供公共方法给客户端调用
2.从onBind()回调方法返回此Binder实例
3.在客户端中,从onServiceConnected()回调方法接收Binder,并使用提供的方法调用绑定服务
Tips:Activity和Service是通过ServiceConnection进行连接的!ServicConnction是与服务端交互的接口方法,绑定服务的时候调用其内部有两个方法:onServiceConnected、onServiceDisconnected,前者是绑定成功时调用,后者是当Service意外销毁时调用!正常解绑是不会调用的!该类使用方法如下:

private ServiceTest.MyBinder myBinder;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
//实例化service
myBinder = (ServiceTest.MyBinder) iBinder;
//开始调用Service中的方法
myBinder.startDownload();
Log.i(TAG, “onServiceConnected: ———–bindService———”);
}

    @Override
    public void onServiceDisconnected(ComponentName componentName) {
        Log.i(TAG, "onServiceDisconnected: --------unbindService--------");
    }
};

Intent intent3 = new Intent(this, ServiceTest.class);
bindService(intent3, connection, BIND_AUTO_CREATE);
“`

猜你喜欢

转载自blog.csdn.net/qq_24820437/article/details/81944088