夯实基础:Service

什么是 Service?

一如既往,从官方解释开始:Service 是 Android 应用中的组件,其使用场景如下:

  1. 应用想要执行一个不需要与用户进行交互的持续运行的操作
  2. 为其他应用提供功能

A Service is an application component representing either an application’s desire to perform a longer-running operation while not interacting with the user or to supply functionality for other applications to use.

可能很多人看到这里会感觉 Service 很像进程/线程,但实际上 Service 既不是进程也不是线程。因为:

  • 除非开发者让 Service 运行在某个进程中,通常情况下,Service 都会运行在应用所在的进程中。

让 Service 成为远程服务则会另开一个进程,一般用作提供系统服务,而且实现会比较麻烦,因为需要用 AIDL 通过 IPC 进行通信。

  • Service 不是线程,因为 Service 就运行在主线程中,我们可以把 Service 当成是 Android 的一种机制

注:但 Service 的子类 IntentService 则另开了一个 worker 线程完成相应的任务,IntentService 内部有一个消息队列和消息管理器。所以对于异步的 Service 请求,IntentService 能够通过消息队列按序处理请求,并且每一个请求都在非主线程 - worker 线程中被处理,不会对主线程造成影响。

Service 的特性

  • Service 能够与系统进行通信。Service 通过 Context.startService() 方法告知系统 Service 想要在后台执行的任务(即便这个任务不是由用户产生),而后系统将执行该任务,直到该 Service 被停止(可能是通过代码完成,也可能是直接关闭了应用的进程,或者其他……)

  • Service 能够为其他应用提供功能。应用通过 Context.bindService() 与 Service 建立长期连接,进行交互,让 Service 的功能模块帮助自己完成某些任务

Service 的生命周期

首先看看官方的图吧:

Service 有两种启动方法:startService() 方法和 bindService() 方法,虽然具体实现不太相似,但启动-关闭过程是一样的。值得注意的是,无论你调用 startService() 方法多少次,只要调用 Context.stopService() 方法或 stopSelf() 方法,Service 就会被终止。那 Service 中的任务还没执行就被终止了咋办?莫慌,Service 的 stopSelf() 方法可以让 Service 被处理之后才被终止。

还有一点就是,onCreate() 方法并不是一定会执行,如果 Service 已经存在,就不会执行 onCreate() 方法创建 Service,而是直接执行 Service 的 onStartCommand() 方法,启动 Service 执行相关任务。

Service 的使用

下面是一个最最最简单的范例:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.startService(new Intent(this, MyService.class));
    }
}
public class MyService extends Service{
    private static final String TAG = "MyService";
    IBinder mBinder;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        Log.i(TAG, "onCreate");
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG, "onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        Log.i(TAG, "onDestroy");
        super.onDestroy();
    }
}

注意事项

Service 有时候会被系统杀掉(可能是因为内存不够、也可能是被各种手机卫士杀了),而 Service 可能跟某些功能相关,杀掉之后功能就不能用了。那么我们要咋办呢?

  • 提高 Service 的优先级:可以在 AndroidManifest.xml 中对通过 android:priority = “1000” 属性将 Service 的优先级设置为最高;当然了,将 Service 通过 setForeground() 方法设置为前台任务也可以提高优先级

  • 使用 AIDL 进行跨进程通信,通过另一个进程的 BroadcastReceiver 发送广播,保证你的 Service 始终存在(杀死则通过广播重启)

  • 在 Service 的 onDestroy() 方法内重启 Service

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值