startService和bindService两种使用方式, 隐式启动、显式启动两种启动方式及生命周期

startService启动过程分析 本文将开启对ActivityManagerService的分析。ActivityManagerService是Android的Java framework的服务框架最重要的服务之一。对于Andorid的Activity、Service、Broadcast、ContentProvider四剑客的管理,包含其生命周期都是通过ActivityManagerService来完成的。对于这四剑客的介绍,此处先略过,后续博主会针对这4剑客分别阐述。在整个startService过程,从进程角度看服务启动过程。 阅读详情

一、Service的两种使用方式

本文介绍的是app A 启动 app B的服务的方式。本篇内容相关代码已经上传Github:BinderDemo

这是一篇很基础的帖子,本身是不想写的,我想写的是《Binder的原理》,但是我略微思索一下,发现事情不简单。要了解Binder,当然离不开Service,我干脆再说一下《Service启动原理》吧,既然已经说了这么多了,我干脆再简单说一下Service启动方式吧,于是就有了现在的这篇文章……上面的两篇我后面补充吧。

首先声明,startService和bindService中贴的log可能由于使用隐式/显式启动/绑定服务的方式不同 ,日志有所出入,具体看1.5版本差异。
首先声明,startService和bindService中贴的log可能由于使用隐式/显式启动/绑定服务的方式不同 ,日志有所出入,具体看1.5版本差异。
首先声明,startService和bindService中贴的log可能由于使用隐式/显式启动/绑定服务的方式不同 ,日志有所出入,具体看1.5版本差异。

1.1 首先,准备app B

  • 首先继承系统Service,实现自己的Service;
public class SnapService extends Service {
    private static final L.TAG TAG = new L.TAG("SnapServer");

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
    	L.i(TAG, "onBind: ");
        return null;
    }
 	@Override
    public boolean onUnbind(Intent intent) {
        L.i(TAG, "onUnbind: ");
        return super.onUnbind(intent);
    }
    @Override
    public void onCreate() {
        super.onCreate();
        L.i(TAG, "onCreate: ");
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG, "onStartCommand: ");
 	}
    @Override
    public void onDestroy() {
        super.onDestroy();
        L.i(TAG, "onDestroy: ");
    }
}
  • 2.将Service添加到Manifest;
<service
    android:name=".SnapService"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="com.example.demoserver.action" />
	</intent-filter>
</service>

注意 exported属性为true,否则不允许外部启动; 添加action 。

1.2 准备app A

暂时只需要创建好并添加一个ClientMainActivity就够了,先准备以下代码:
	//app B的包名
    private final static String TARGET_APP_PACKAGE = "com.example.demoserver";
    //app B 目标Service的名字
    private final static String TARGET_SERVICE_NAME = TARGET_APP_PACKAGE + ".SnapService";
    private final static String TARGET_SERVICE_ACTION = TARGET_APP_PACKAGE + ".action";

接下来开始正文,我们在app A 中启动app B的服务

1.3 启动服务——startService

1. 显式启动
	private void startService(){
		  // --- 显式启动 ---
        Intent intent = new Intent();
//        intent.setClassName(TARGET_APP_PACKAGE, TARGET_SERVICE_NAME);
        intent.setComponent(new ComponentName(
                TARGET_APP_PACKAGE,  //这个参数是另外一个app的包名
                TARGET_SERVICE_NAME));//这个是要启动的Service的全路径名
                
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            startForegroundService(intent);
        } else {
            startService(intent);
        }
}

2. 隐式启动
private void startService(){
        // --- 隐式启动 ---
        Intent intent = new Intent();
        intent.setPackage(TARGET_APP_PACKAGE);
        intent.setAction(TARGET_SERVICE_ACTION);
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            startForegroundService(intent);
        } else {
            startService(intent);
        }
3. 服务前台化

Android8.0之后,官方为了防止app后台造成的网络、cpu、内存等性能消耗影响用户体验所以做了限制,不允许启动后台服务,常规方式启动服务超过5s就会闪退。而我们需要做的就是服务前台化:

  • manifest申请服务前台化权限:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
  • Service启动后调用startForeground
	@Override
    public void onCreate() {
        super.onCreate();
        L.i(TAG, "onCreate: ");
         //服务前台化
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            sendNotification();
        }
    }

    private void sendNotification() {
        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_ID, NotificationManager.IMPORTANCE_HIGH);
        channel.enableLights(true);//设置提示灯
        channel.setLightColor(Color.BLUE);//设置提示灯颜色
        channel.setShowBadge(true);//显示logo
        channel.setDescription("test");//设置描述
        channel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);//锁屏可见
        manager.createNotificationChannel(channel);

        Notification testNotification= new Notification.Builder(this)
                .setChannelId(CHANNEL_ID)
                .setContentText("服务前台化")
                .setContentText("服务已经至于前台了")
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.mipmap.ic_launcher)
                .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                .build();
        //id 不能是0
        startForeground(1, testNotification);
    }

客户端使用start或者bind方式启动服务后就可以看到通知栏有通知代表服务已经前台化,我就不再贴出结果了。
服务前台化具体解释可参见大神的帖子

调用方法后服务被启动:

2021-06-20 01:40:15.181 15231-15231/com.example.demoserver I/Server_SnapServer: onCreate: 
2021-06-20 01:40:15.182 15231-15231/com.example.demoserver I/Server_SnapServer: onStartCommand: action = com.example.demoserver.action
4. 停止服务
 	@Snap
    public void stopService() {
        Intent intent = new Intent();
        intent.setPackage(TARGET_APP_PACKAGE);
        intent.setAction(TARGET_SERVICE_ACTION);
        stopService(intent);
    }

日志输出:

2021-06-20 02:28:05.198 21142-21142/com.example.binderdemo D/Client_SnapUtil: - snapSnaped : stopService

2021-06-20 02:29:09.405 21289-21289/com.example.demoserver I/Server_SnapServer: onDestroy: 

1.4 绑定服务——bindService

准备代码:

	 private ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            L.i(TAG, "onServiceConnected: " + name.toShortString());
            mMessageController = MessageController.Stub.asInterface(service);
            mIsServiceConnected = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            L.i(TAG, "onServiceDisconnected: " + name.toShortString());
            mIsServiceConnected = false;
        }
    };
1.显式绑定
		// --- 显式绑定 ---
        Intent serviceIntent = new Intent();
//        intent.setClassName(TARGET_APP_PACKAGE, TARGET_SERVICE_NAME);
        serviceIntent.setComponent(new ComponentName(
                TARGET_APP_PACKAGE,  //这个参数是另外一个app的包名
                TARGET_SERVICE_NAME));//这个是要启动的Service的全路径名
        boolean success = bindService(serviceIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
        L.d(TAG, "bindService: success = " + success);
2.隐式绑定
		// --- 隐式启动 ---
        Intent serviceIntent = new Intent();
        serviceIntent.setPackage(TARGET_APP_PACKAGE);
        serviceIntent.setAction(TARGET_SERVICE_ACTION);
        boolean success = bindService(serviceIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
        L.d(TAG, "bindService: success = " + success);

调用方法后:

2021-06-20 02:13:57.678 16983-16983/com.example.binderdemo D/Client_SnapUtil: - snapSnaped : bindService
2021-06-20 02:13:57.689 16983-16983/com.example.binderdemo D/Client_ClientMainActivity: bindService: success = true
2021-06-20 02:13:57.701 16983-16983/com.example.binderdemo I/Client_ClientMainActivity: onServiceConnected: {com.example.demoserver/com.example.demoserver.SnapService}
-----------------------------------
2021-06-20 02:13:57.695 15679-15679/com.example.demoserver I/Server_SnapServer: onCreate: 
2021-06-20 02:13:57.699 15679-15679/com.example.demoserver I/Server_SnapServer: onBind: 
3.解绑服务
	public void unBindService() {
        unbindService(mServiceConnection);
    }

日志输出:

2021-06-20 02:30:53.705 21428-21428/com.example.demoserver I/Server_SnapServer: onUnbind: 

1.5 版本差异

  • Android 7.1
  • 显式startService执行onCreate(),隐式startService还执行onStartCommand();
  • 直接bindService不成功,必须在显式/隐式startService之后才能通过显式bindService绑定service。
  • unBindService之后仅仅执行onUnBind();
  • startService和bindService一起执行后:如果先执行stopService,则不执行onDestroy,执行完unBindService之后一并执行onUnbind()和onDestroy();若先后执行unBindService和stopService,则onUnBind()和onDestroy()一并先后执行。
  • Android 8.0
  • 不申请权限,不进行服务前台化。显式startService之后仅仅执行onCreate(),隐式startService(),执行onCreate()->onStartCommand();显式bindService 隐式bindService 之后正常执行onCreate()->onBind();
  • 申请权限,服务前台化。显式/隐式startService/startForeGroundService,显式/隐式bindService,看起来能启动Service,但是模拟器它SystemUI崩溃了,app都没有报错,杀掉竟然启动不起来。

奇了怪了,很可能通知创建的有问题,或者模拟器有问题,我后续换台模拟器再试试。

  • Andorid 8.1, Android 9.0,Android 10
  • 显式startForeGroundService仅仅执行onCreate() ,隐式startForeGroundService()之后还会执行onStartCommand();
  • 显式/隐式bindService,unBindService执行onCreate()->onBind()->onUnbind()->onDestroy();
  • startService和bindService一起执行后:如果先执行stopService,则不执行onDestroy,执行完unBindService之后一并执行onUnbind()和onDestroy();若先后执行unBindService和stopService,则onUnBind()和onDestroy()一并先后执行。
  • Android 11
  • 此版本很特殊,只能通过显式bindService方式启动服务,但是却没有执行相关生命周期方法
  • 无法stopService和unBindService;

ps:我不知道是代码问题还是我打开方式不对,不论是模拟器还是真机都不能从外部直接启动app B 的Service,我看google文档好像没有看到这块儿有变更,麻烦知道的大佬烦请告知一下。

二、startService和bindService异同

2.1 生命周期不同
  • startService方式:
  • 如上1.3StartService 所讲 Service被启动和停止后日志输出可以看到,该方式Service的生命周期为onCreate() -> onStartCommand…onDestroy 。
  • tartService可以多次调用,但是onCreate()只执行一遍,也就是Service只会创建一次,每次调用onStartCommand都会被调用。
  • bindService方式:
  • 如上1.4 bindService Service 的bind和unBind日志输出可以看到,这种方式Service的生命周期为:onCreate()->onBind()…onUnBind
  • bindService只有第一次调用会创建Service,执行onCreate()和onBind(),连续多次调用并不会执行onCreate()和onBind();
2.2 Service独立性
  • startService方式:

Service一旦被启动,在调用者没有调用stopService()的前提下,其生命周期就和调用者的生命周期不再关联。即使调用者被杀掉,Service也可以独立生存。

  • bindService方式:

与startService方式不同的是,这种方式,service的生命周期是和调用者关联在一起的,如果调用者进程被终结后,服务便会终止。

2.3 调用服务的方式
  • startService之后可以发送action与服务交互。
  • bindService之后,除了发送action还 可以获得服务的完整方法(Binder的实现类),可以直接交互;

三、使用ADB向Service发送命

我们平时肯定会有这样的情况,项目里有一些方便我们平时调试或测试同学测试使用的功能,这些功能可能需要做个UI或者手动开启比较麻烦,这个时候,Service是不是也可以派上用场(和测试小姐姐装x)。

  • 准备action和参数
public interface SnapAction {
    String ACTION_SWITCH_THEME = "ACTION_SWITCH_THEME";
    String EXTRA_INT_THEME = "theme";
    /**
     * 0或不传值为打开,1为关闭
     */
    String ACTION_ENABLE_LOG = "ACTION_ENABLE_LOG";
    String EXTRA_INT_ENABLE_LOG = "enable_log";
}
  • Service内重写onStartCommand()
 @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        final String action = intent.getAction();
        if (!TextUtils.isEmpty(action)) {
            L.i(TAG, "onStartCommand: action = " + action);
            switch (action) {
                case SnapAction.ACTION_ENABLE_LOG:
                    int enableLog = intent.getIntExtra(SnapAction.EXTRA_INT_ENABLE_LOG, 0);
                    SnapConfig.LOG_ENABLE = enableLog == 0;
                    L.i(TAG, "enable_log = " + enableLog);
                    break;
                case SnapAction.ACTION_SWITCH_THEME:
                    int theme = intent.getIntExtra(SnapAction.EXTRA_INT_THEME, 0);
                    L.d(TAG, "switch_theme: theme = " + theme);
                    break;
                default:
                    break;
            }
        }
        return super.onStartCommand(intent, flags, startId);
    }
  • 终端通过ADB发送命令:

后面是包名/service完整路径名,–ei表示int类型的参数,后面是参数键值对;

adb shell am startservice -n com.example.demoserver/com.example.demoserver.SnapService -a ACTION_ENABLE_LOG --ei enable_log 0

服务端收到命令:

2021-06-21 19:11:51.523 22476-22476/com.example.demoserver I/Server_SnapServer: onStartCommand: action = ACTION_ENABLE_LOG
2021-06-21 19:11:51.524 22476-22476/com.example.demoserver I/Server_SnapServer: enable_log = 0

好了,以上就是service的简单使用方式,本篇内容相关代码已经上传[Github:BinderDemo],如有不对的地方,欢迎指正。

后续我一定会不上Service启动原理,以及Binder使用方式及原理,敬请期待

startService和bindService的区别,生命周期以及使用场景 Service 生命同期 Service 生命同期 startService 和bindService 区别 startService: onCreate -> onStartCommand -> onDestory ,在多次调用startService的时候,onCreate不重复执行,但是onStartCommand会执行。startService调用了这后,会一直存在... 阅读详情

相关推荐

使用service的startservice 和bindservice方法实现音乐的播放、暂停、继续

meidiaPlay使用简单步骤 1、create方法 第一种: 加载本地音频文件 MediaPlayer.create(this, R.raw.test);(我在android项目的res目录下新建raw目录 并放置test.mp3文件) 第二种: 加载网络音频 MediaPlayer.create(this,uri.parse(“http://…..test.mp3

wcooper的博客 2940

Android service介绍——startService和bindService基本使用(1)

Android service介绍——startService和bindService基本使用(1) 问题背景 在安卓日常开发和学习中,经常会使用到Service,它是Android四大组件之一。使用Service可以在后台执行长时间的操作( perform long-running operations in the b...

baorant24的博客 2616

Android 服务两种启动方式的区别

前言:苦逼的野生程序员最近在找工作,跑了各种校园招聘。仍然没有找到Android方面的工作。哎,说多了都是泪啊,进入正题吧。今天笔试题有问到Android中Service两种启动和停止方式有什么不同。所以特地来总结一下Service的知识。 Service是Android四大组件之一,也是可执行的程序,有自己的生命周期。创建、配置Service和创建、配置Activity的过程相似。和Activ...

weixin_43901866的博客 1621

理解四大组件Service之 startService() 启动流程(基于Android10)

这次继续分析 的启动过程。 相比于activity,服务可提供在后台长时间的运行操作,同时没有界面。即使切换到后台,服务仍然在后台继续运行。 前台服务 后台服务 绑定服务 1.2 服务的生命周期 service的生命周期如下:生命周期区别已经在上面的生命周期图中展示了出来。前者用来做长时间的单一工作,启动后独自运行。后者适合需要多次调用接口的RPC交互场景,偏重于交互。虽然区分了两种方式,但是一个service可以支持在启动的情况下,再对其进行绑定操作。也就是说, 。 service Intent

JavaShark的博客 1901

Isaac Gym环境安装和四足机器人模型的训练

该方法提出一种训练模式,该模式通过在单个GPU工作站上使用大规模并行的方法来实现现实世界机器人任务的快速控制策略的生成。

weixin_44061195的博客 3万+

Mixly米思齐——超声波测距控制LED灯

为了更加地贴近中小学信息技术的课程,我们用米思齐做了一个实验——根据距离的远近开启警报灯(利用超声波测出距离)。 实验硬件准备 arduino uno R3 、USB 数据线、YFROBOT UNO I/O扩展板、YFROBOT超声波传感器模块、模块3P连接线x1、LED灯x1 硬件连接图如下: 在arduino uno R3 上再接一个LED灯,实物图如下: 在本次实验中,LE...

Janise_的博客 9977

android隐式绑定服务,Android service (一) startService vs bindService

service 简介service 是Android的4大组件之一, 用于在后台(这里指的是service不提供UI, 用户不可见)执行任务.service 是在UI线程上被创建, 并且在UI线程上运行的, 如果service需要执行耗时操作,那么需要自己开启线程或线程池,然后在子线程中执行.service 有2种启动方式: startService & bindService (也可以同...

weixin_36303283的博客 852

优快云积分获取与管理全攻略

技术社区积分系统是知识共享生态的核心激励机制,通过量化用户贡献实现资源交换。其底层逻辑遵循Web2.0时代的UGC经济模型,用户通过内容创作、社区互动等行为积累虚拟资产。在开发者社区场景中,积分体系能有效促进技术文档、工具源码等资源的流通,优快云作为国内头部平台,其积分规则具有典型参考价值。掌握签到策略、内容互动技巧和资源上传规范等实操方法,可系统性提升积分获取效率。2023年新规强化了连续签到奖励和互动质量检测机制,结合GitHub等开源平台资源互补,能构建更高效的技术资源获取路径。

weixin_34233974的博客 218

服务两种启动方式(startService与bindService)的区别

综上两篇文章 1.Android Service的基本用法(startService启动方式生命周期) 2.Android Service与Activity之间的通信(bindService启动方式) 区别如下: 一.生命周期上的区别 startService启动服务:Service会经历onCreate()------->onStartCommand()。当执行stopService时,直...

计蒙不吃鱼的博客 2万+

数字孪生实战:如何用Blender+Unity快速搭建未来工厂3D模型(附资源包)

本文提供了一套利用Blender进行三维建模,再结合Unity构建虚拟仿真环境的实用方案,旨在帮助中小型制造企业低成本、高效率地搭建未来工厂数字孪生原型系统。文章详细介绍了从数据规划、模型优化到场景构建、逻辑仿真与数据对接的全流程,并附有资源包,助力技术团队快速实现从静态展示到动态交互的数字孪生应用。

weixin_29191669的博客 338

【工具使用】Keil常用的调试操作整理介绍

2、当选择了非0级优化时,调试可能会变得困难,具体表现在断点调试。该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩余部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的置。:如果是在C语言窗口中,则是按单条语句执行,与单步调试不同的是,遇到函数不会进入函数内部,而是直接全速运行函数,并跳到下一条语句。但我的Keil软件中无法显示这个视图,并且通过修改系统试图,调试时,点击打开系统视图发生了闪退的现象,目前能想到的原因是:重新安装Keil,安装最新版本。

MEYOU_Cc 不吃香菜! 1万+

Android:Service生命周期方法与Service启动方式bindService与StartService

Service是什么 服务(Service)是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务。服务的运行不依赖于任何用户界面,即使程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行。不过需要注意的是,服务并不是运行在一个独立的进程当中的,而是依赖于创建服务时所在的应用程序进程。当某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停止运行 -————取自《第一行代码——Android》 Service生命周期 自调用的方法:

qq_28837549的博客 2142

Transformer模型在时间序列预测中的应用:价格和产量预测

Transformer模型由Attention is All You Need论文提出,并在机器翻译任务上取得了巨大成功。其主要特点是使用自注意力机制代替传统的递归或卷积操作进行序列建模。Transformer模型由编码器和解码器组成,其中编码器用于学习输入序列的表示,解码器用于生成目标序列。在时间序列预测中,我们只需要使用Transformer的编码器部分。编码器将历史数据作为输入,学习一个表示,然后使用该表示来预测未来的数值。

HnrzLinux的博客 737

Service两种启动方式和生命周期

两种启动方式启动service,要求:观察并打印生命周期方法、思考service的使用场景以及在什么情况下service会被回收 文章目录第一种启动方式——startService启动、停止服务运行结果结论第二种启动方式——bindService绑定、解绑服务运行结果结论参考 第一种启动方式——startService 启动、停止服务 MainActivity @Override pu...

qq_42281792的博客 2226

RK3588 Android12 添加HDMI和喇叭声音通道切换选项

rk3588 android12系统默认接hdmi out时,声音会切换到hdmi out输出,主板声卡喇叭输出会没有声音输出。现在添加一个选项设置hdmi out时,声音可以保持主板声卡喇叭输出。

Android系统开发笔记 4163

YOLO26涨点改进| TGRS 2026 | 独家创新首发、注意力改进篇| 引入LCGA局部曲率引导注意力,保持局部稳定性的同时突出关键几何区域,含多种创新改进,促进YOLO26所有任务高效涨点

🔥本文提出LCGA(局部曲率引导注意力)模块,通过引入曲率信息改进YOLO26网络模型。LCGA在局部窗口内利用深度卷积构造曲率代理,调制标准窗口注意力,使模型更关注道路、边界等曲线型结构,提升遥感图像超分辨率中的几何保真度。相比普通注意力,LCGA能精准聚焦关键几何区域,减少边缘断裂和轮廓偏移,同时保持较低计算开销。实验表明LCGA显著提升性能,在UCMerced数据集上PSNR提升0.2148dB。文章提供了三种改进方案。

Ai缝合怪、助力小伙伴高效发论文 227

Android中bindService和startService启动服务有何区别

和是 Android 中两种用于与Service交互的方式,它们的区别主要在于和。

白泽的博客 1217

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

bindService 和 startService 生命周期对比

onCreate() → onStartCommand() → onBind() → [服务运行] → onUnbind() → [服务继续运行] → stopSelf()/stopService() → onDestroy()onCreate() → onStartCommand() → [服务运行] → stopSelf()/stopService() → onDestroy()onCreate() → onBind() → [服务运行] → onUnbind() → onDestroy()

qq_36428821的博客 621

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Service的两种使用方式比较 startService和bindService

再次start / bind也不会创建新的Service。

梁超杰 1634

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Service的两种启动方式

Service生命周期.png 第一种方式:通过StartService启动Service 通过startService启动后,service会一直无限期运行下去,只有外部调用了stopService()或stopSelf()方法时,该Service才会停止运行并销毁。 要创建一个这样的Service,你需要让该类继承Service类,然后重写以下方法: onCreate() 1...

easonguolong的博客 8904

Android中Service的两种启动方式区别与适用场景

Service 作为Android中四大组件之一,日常开发中经常会使用到,本文主要讲解Service的两种启动方式,以及两种启动方式的区别,生命周期,以及适用的场景。 Service是运行在主线程上的,是要依托android程序运行的,所以不能做耗时操作。 分别有两种启动方式: 一种startService() ,一种是bindService()。 两种启动方式的生命周期不同: 1、startService() 的生命周期 :onCreate() -> onStartCommand() (.

Anne_Wei的专栏 4600

Service的两种启动方式+生命周期+IntentService的特点

Service服务 两种启动方式 启动方式 开启服务:startService() 停止服务:stopService() 绑定方式 绑定服务:bindService() 解除绑定:unbindService() 生命周期 启动方式的生命周期 onCreate() —— onStartCommand() —— onDestroy() 绑定方式的生命周期 onCreate() —— on...

caoqijia123的博客 1532

Android中service服务生命周期以及启动方式的区别

一、生命周期: startService启动方式:onCreate()---&gt;onStartCommand() ---&gt;onDestroy(); bindService启动方式:onCreate()---&gt;onBind() ---&gt;onUnbind()---&gt;onDestroy(); 我们通过官方给出的一张图片来体会一下: 二、启动方式(基本使用方法...

林一天的博客 7720

startService 和 bindService的区别

一.Service的简介 1.Service介绍和作用 Service是Android系统中的四大组件之一,它是一种长生命周期的,没有可视化界面,运行于后台的一种服务程序。比如我们播放音乐的时候,有可能想边听音乐边干些其他事情,当退出播放音乐的应用,如果不用Service,我 们就听不到歌了,所以这时候就得用到Service了。   2.Service生命周期 Service的生命周期并

sweet 2390

Android Service两种启动方式

1.Context.startService()方式启动  ①Context.startService()方式的生命周期: 启动时,startService –> onCreate() –> onStart()停止时,stopService –> onDestroy()如果调用者直接退出而没有停止Service,则Service 会一直在后台运行 Context.startService()方法

dada360778512的专栏 8万+
上一篇: HashMap(Java8)原理解析&&HashMap扩容机制
下一篇: 什么是虚拟内存?虚拟内存的原理
cry kid
博客等级 码龄10年 144粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值