Service生命周期

246 阅读4分钟

一. Service生命周期

先展示一张Service的生命周期图:

service lifecycle

2.1 启动方式:

service有两种启动方式, 不同的启动方式决定了Service具有两种生命周期的可能(并非互斥的两种)。

  1. start方式:onCreate(),onStartCommand()。onDestroy释放资源。
  2. bind方式: onCreate(),onBind()方法。需要所有client全部调用unbindService()才能将Service释放资源,等待系统回收。

2.2 代码实践

利用下面的DemoService代码,通过logcat自行感受每一个阶段的状态与场景的关系。

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class DemoService extends Service {
    private static final String TAG = "demo";

    int mStartMode;       // service被杀掉的方式
    IBinder mBinder;      // clients绑定接口
    boolean mAllowRebind; // 是否允许onRebind

    @Override
    public void onCreate() {
        Log.i(TAG,"onCreate::The service is being created");
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG,"onStartCommand::The service is starting");
        return mStartMode;
    }
    @Override
    public IBinder onBind(Intent intent) {
        Log.i(TAG,"onBind::A client is binding to the service");
        return mBinder;
    }
    @Override
    public boolean onUnbind(Intent intent) {
        Log.i(TAG,"onUnbind::All clients have unbound");
        return mAllowRebind;
    }
    @Override
    public void onRebind(Intent intent) {
        Log.i(TAG,"onRebind::A client rebind to the service " +
                "after onUnbind() has already been called");
    }
    @Override
    public void onDestroy() {
        Log.i(TAG,"onDestroy::The service is no longer used");
    }
}

一. 小故事理解Service生命周期

《小熊猫安迪的超级任务:Service生命周期大揭秘》

从前有只叫安迪的小熊猫,他住在"手机乐园"的云朵小镇里。和其他小动物不同,安迪有个神奇背包,能装下好多看不见的魔法工具!今天他要完成三项超级任务,让我们跟着他的背包看看会发生什么吧~

🌅 清晨6点:onCreate魔法觉醒
"叮铃铃!"任务闹钟响起,安迪揉揉眼睛从床上坐起来。他的神奇背包突然"噗"地鼓起来,里面自动飞出工具箱(初始化资源)、魔法地图(加载配置),连最爱吃的竹子饼干都整整齐齐码在隔层里(准备数据)。妈妈说:"安迪,今天要保管好这些工具哦!"

☀️ 上午9点:onStartCommand执行任务
安迪背着鼓鼓的背包来到森林广场。市长猫头鹰发布任务:"请用魔法喷泉浇灌向日葵田!"安迪立刻打开背包,掏出喷壶工具。第一次执行时(第一次startService),喷泉"哗啦啦"启动;中午太阳大时(多次startService),他又掏出更大功率的喷头继续浇水,让向日葵们咕咚咕咚喝个饱!

🌳 下午2点:onBind建立连接
小兔子拿着坏掉的胡萝卜收音机来找安迪:"能帮我修好吗?"安迪从背包掏出金色工具箱(IBinder),拉出一根发光丝带系在收音机上。神奇的是,小兔子通过丝带能看到维修进度,还能用胡萝卜按钮远程控制维修速度呢!(客户端通过Binder与服务交互)

🌇 傍晚5点:onUnbind断开连接
当最后一只小动物的收音机修好时,发光丝带自动断开。如果所有小动物都取回工具(所有客户端unbind),安迪的背包就会轻轻震动,提醒他可以收工啦~

🌙 晚上8点:onDestroy魔法回收
当月亮爬上树梢,安迪完成所有任务回家。他的神奇背包突然打开,工具们排着队飞回云朵仓库(释放资源),连竹子饼干包装纸都被风吹进回收站(清理内存)。不过别担心,如果明天还有任务,魔法背包又会"噗"地鼓起来!

🎉 特别彩蛋:混合任务大挑战
有时候安迪会同时做两件事:一边浇灌向日葵(startService),一边帮小动物修东西(bindService)。这时候他的背包会分成两个小格子,浇花格子要等市长说"停"才会收工,修东西格子则要等所有小动物取回工具才关闭。

小朋友,现在你知道了吗?每个App的后台服务都像安迪的神奇背包,可能在做浇花(播放音乐)、修东西(下载文件)这些看不见的工作。当你打开游戏时,就是小英雄在执行新任务;当你切出去回消息时,他还在默默完成工作;即使App看起来关闭了,重要的任务还会在背包里悄悄继续哦!

试试看:下次用手机时,猜猜你的小熊猫背包现在装着什么魔法任务吧!🐾