Service之基础(开启服务、绑定本地服务)

【vue看板】 大屏看板提示:以下是本篇文章正文内容,下面案例可供参考提示:这里对文章进行总结:代码量较多,看板中的。 阅读详情

Service

什么是Service

  • 一个组件长期后台运行,没有界面。

  • 简单的理解:service理解成一个没有界面长期运行的activity。

  • 特点:

    • 即使进程被杀死,稍后service会重新启动

开启服务的第一种方式(很简单)

前提(略)

  1. 继承Service
  2. 清单注册Service

如何开启服务

    startService(this,MyService.class)

如何关闭服务

    stopService()

也可以在手机上—打开设置—打开应用程序服务列表—点击停止来关闭服务

startService方法开启服务的生命周期

  • onCreate() –>onStartCommand–>onStart(过时) –>ondestory(销毁)
  • 如果服务已经开启了,就不会重新调用oncreate方法,服务只会被创建一次(oncreate只会被调用一次)。

开启服务的第二种方式(有点绕)

Activity

public class BindServiceActivity extends AppCompatActivity {

    private MyBindService.MyBinder binder;
    private ServiceConnection serviceConnection;

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

        serviceConnection = new ServiceConnection() {
            /**
             * 当服务被成功绑定的时候执行的方法,得到中间人IBinder service。
             */
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                binder = (MyBindService.MyBinder) service;
                binder.callMethod();
            }
            /**
             * 当服务失去绑定的时候调用的方法。当服务突然异常终止的时候
             */
            @Override
            public void onServiceDisconnected(ComponentName name) {

            }
        };
        bindService(new Intent(this, MyBindService.class), serviceConnection, BIND_AUTO_CREATE);
    }

        @Override
        protected void onDestroy() {
            super.onDestroy();
    //        一定要在activity销毁时,把这个activity绑定的service解绑,否则会leaked---漏气
            unbindService(serviceConnection);
        }
}

Service

 public class MyBindService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.e("qwe", "onBind");
    //  返回的这个IBinder就是activity和service之间的通讯的中间人
    //  这里的IBinder将会在activity调用bindService绑定服务时所用的一个参数ServiceConnection的回调方法中获取
    //  获取到了这个IBinder,就相当于activity打通了service的内部,可以调用service内部的所有方法

    // IBinder是一个接口,不要实现这个接口(要重写的方法太多了),继承Binder(IBinder的一个实现类)即可
        return new MyBinder();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.e("qwe", "onCreate");
    }

    private void method() {
        Toast.makeText(this, "我是写在Service内部的方法", Toast.LENGTH_SHORT).show();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    //  在绑定服务开启服务时,不会走onStartCommand这个生命周期方法
        Log.e("qwe", "onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        Log.e("qwe", "onDestroy");

        super.onDestroy();
    }

    public class MyBinder extends Binder {
        /**
         * 中间人帮助我们调用服务的方法。
         * 中间人这里可以做很多事情
         */
        public void callMethod() {
            method();
        }
    }
}

绑定服务总结

最核心的思路:

  • activity里拿到service里的Ibinder
  • 通过Ibinder去和service通讯

最核心的方法是:

  • activity里的binderService方法(参数ServiceConnection的回调方法的参数IBinder service)

  • service里的onBinde方法(返回值Ibinder)

    1. 使用bindService的方式开启服务。

    2. bindService(intent, new MyConn(), Context.BIND_AUTO_CREATE);
    3. 实现一个MyConn 服务与activity的通讯频道(中间人的联系渠道)

      private class MyConn implements ServiceConnection{
      /**
      * 当服务被成功绑定的时候执行的方法,得到中间人。
      */
      @Override
      public void onServiceConnected(ComponentName name, IBinder service) {
      binder = (MyBinder) service;
      }
      /**
      * 当服务失去绑定的时候调用的方法。当服务突然异常终止的时候
      */
      @Override
      public void onServiceDisconnected(ComponentName name) {

      }
      

      }

    4. 服务成功绑定的时候 会执行onBinde方法,返回中间人

      public class MyBinder extends Binder{
      /**
      * 内部人员帮助我们调用服务的方法。
      */
      public void callMethodInService(){
      methodInService();
      }
      }

    5. 在调用者 activity代码里面通过中间人调用服务的方法。

    6. 解除绑定服务 unbindService(conn)。

绑定服务的生命周期

oncreate()–>onbind()—>onDestory(); 不会调用onstart()方法 和 onstartCommand()方法。

开启服务的第二种方式更标准的写法—抽取接口隐藏私有方法

针对上例:

  1. MyBinder为了让activity中可以调用,使用了public修饰符,但是这样带来一个坏处,因为MyBinder是Service的一个内部类,如果把他暴露给外界,外界就会通过MyBinder轻松地调用Service内部的所有方法,万一有些方法是隐秘的呢
  2. 那么问题来了,又想让activity使用MyBinder的某个方法,又不想让activity直接拿到MyBinder的引用,该怎么办呢
  3. ok,抽取接口IService,定义好准备要被外界调用的方法,在activity里强制转换Ibinder service为该接口IService,即可

代码:

IService

public interface IService {
  public void callMethod();
}

MyBindService的内部类

private class MyBinder extends Binder implements IService {

    /**
     * 中间人帮助我们调用服务的方法。
     * 中间人这里可以做很多事情
     */
    @Override
    public void callMethod() {
        method();
    }

    //私密方法,不想让外界知道
    public void simifangfa() {
    }
}

Activity

private IService binder;
 /**
 * 当服务被成功绑定的时候执行的方法,得到中间人IBinder service。
 */
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
    binder = (IService) service;
    binder.callMethod();
}

开启服务的两种方法的对比

  • startService(); 直接开启服务,服务一旦启动跟调用者(开启者没有任何关系)
    • 调用者activity退出了,服务还是继续运行活的好好的。
    • 调用者activity,没法访问服务里面的方法。
  • bindService(); 绑定开启服务,服务和开启者(调用者)有密切的关系。
    • 只要activity挂了,服务跟着挂了。
    • 调用者activity,可以调用服务里面的方法。
未连接互联网的银河麒麟v10安装g++,各种报错,如何处理? 🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 备注:部分问题/疑难杂症搜集于互联网。 阅读详情

相关推荐

工业以太网通讯Profinet协议详解

Profinet是通过西门子控制系统被广泛使用的工业通信协议,是一种较新的,基于以太网的工业通讯协议。

mydatai的专栏 8855

2024年Android最全Android服务——Service(1),2024年最新腾讯游戏客户端开发面试

在此为大家准备了四节优质的Android高级进阶视频:架构师项目实战——全球首批Android开发者对Android架构的见解。

2301_82244182的博客 705

Web自动化神操作:如何用OpenCV 破解滑块验证码?

验证码作为一种安全机制,可以有效防止暴力破解密码、发帖、灌水、刷票等,大家在做 Web 自动化的时候应该有碰到验证码这个难题,一般我们可以和开发沟通请求他们的帮助:去掉验证码或者设置一个万能验证码,而如果开发不帮忙我们该如何去解决呢? 本篇文章以 Java 语言为例教你怎么破解验证码。 现在大多数网址会采用滑块验证码的方式,下面以腾讯的滑块验证码为例,先来看看破解的效果: 要破解滑块验证码,我们一般采取的思路如下: 获取滑块到背景缺口图的距离 通过 selenium 的 Actio

不喝枸杞的程序员 2037

绑定服务并调用服务中的方法

今天我们重点讲下服务的绑定与解绑,还有如何调用服务中的方法。我们直接看代码吧,其中都有很详细的描述。 MainActivity: package com.example.text02; import com.example.text02.MyService.MyBind; import android.os.Bundle; import android.os.IBinder; impo

hi_0123的专栏 713

PySWMM新手避坑指南:从安装到批量处理INP文件的完整流程(附常见错误解决方案)

本文为PySWMM新手提供从环境搭建到批量处理INP文件的完整避坑指南。详细讲解了虚拟环境配置、库安装方法,并针对“无法打开输入文件”和对象访问错误等高频问题提供解决方案。核心部分展示了如何利用Python脚本实现INP文件的批量运行、结果汇总以及参数自动化修改,显著提升SWMM模型的工作效率。

weixin_29092031的博客 393

ArcGIS小白必看:5分钟搞定shp矢量文件分割(附常见错误排查)

本文为ArcGIS新手详细解析了分割shp矢量文件的四种核心方法:裁剪工具、分割工具、按属性选择导出及ArcPy脚本自动化。重点强调了投影匹配等关键步骤,并提供了常见错误排查指南,帮助用户快速掌握矢量数据分割技巧,提升GIS数据处理效率。

h9j8k7l6m5n的博客 801

Service组件(本地、远程调用)详解

一、Service组件使用介绍 service组件的使用分为两种,一种是远程调用(夸进程);另一种本地调用(同进程)。 Android系统中,各应用程序都运行在自己的进程中,进程之间一般无法进行数据交换。 Android远程调用Service,可以先定义一个远程调用接口,然后为该接口提供一个实现类,就可以实现跨进程调用。 1.1 本地(同进程)调用Service组件 本地

kc58236582的博客 2989

优化Cartographer重定位速度:从子图筛选到参数调优的完整思路

本文详细介绍了优化Cartographer重定位速度的完整方法,从子图筛选到参数调优,帮助工程师在已知初始位姿的前提下将重定位耗时降低50%以上。重点分析了性能瓶颈、子图筛选策略、匹配算法选择及环境自适应的参数优化策略,并通过实战案例展示了显著效果提升。

weixin_28704565的博客 465

安卓ComponentName简介及使用

安卓ComponentName简介及使用

似霰的博客 2840

第1集:认识 Claude Code —— AI 编程新纪元

1. 定义 Claude Code:终端中的 AI 编程代理Claude Code 是 Anthropic 公司于 2025 年 5 月正式推出的命令行 AI 编程工具,它不只是一个代码补全工具,而是一个能够理解项目、自主执行任务的**终端 AI 代理(Agent)。它的核心理念是 **"生于终端,活于终端"** (lives in your terminal)。与深度嵌入图形界面(GUI)的工具不同,Claude Code 选择直接融入开发者最原始、最核心的工作环境——命令行。

dianziyao_的博客 868

Python爬虫实战:高德地图POI信息爬取(餐馆/加油站等),附选址分析技巧

高德API配置AMAP_KEY = "你的高德API Key" # 替换成自己的Key# 爬取参数CITY = "成都" # 城市DISTRICTS = ["锦江区"] # 区域,可添加多个(比如["锦江区", "武侯区"])KEYWORDS_LIST = ["川菜馆", "加油站"] # 要爬取的POI类型TYPES = {"川菜馆": "050101", # 餐饮服务→中餐→川菜馆(高德POI分类编码)"加油站": "110100" # 交通设施→加油站。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2472

使用http-server或serve 开启本地服务器

在本地开启一个本地服务器,来访问HTML页面,从本地直接打开的一般是file协议。 1、下载 node.js 官网地址: https://nodejs.org 下载完成后在命令行输入命令 $ node -v 以及 $ npm -v 检查版本,确认是否安装成功。 2、下载 http-server 在终端输入 npm install http-server -g 3、开启 http-server 服务 http-server -c-1 终端进入目标文件,然后输入: http-server -c-1 // 注意

weixin_43743804的博客 2403

Python爬虫实战:利用最新技术爬取抖音话题挑战视频

本文将详细介绍如何使用Python最新技术栈构建一个高效的抖音话题挑战视频爬虫。我们将从环境配置开始,逐步讲解请求模拟、数据解析、反反爬策略、数据存储等关键环节,并提供完整的代码实现。本文适合有一定Python基础的开发者学习高级网络爬虫技术。关键词:Python爬虫、抖音API、话题挑战、视频爬取、反反爬本文详细介绍了如何使用Python最新技术栈构建抖音话题挑战视频爬虫。我们从基础请求开始,逐步实现了数据解析、反反爬策略、数据存储等核心功能,并探讨了分布式和增量爬取等高级主题。更智能的反反爬策略。

2201_76125261的博客 1745

2024年最全Service之基础(开启服务、绑定本地服务)(2),2024年最新阿里三面容易过吗

【Android 详细知识点思维脑图(技能树)】我个人是做Android开发,已经有十来年了,目前在某创业公司任职CTO兼系统架构师。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。

2401_84545213的博客 1076

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

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

2024年Android最新Service之基础(开启服务、绑定本地服务)(3),Android技术功底不够如何去面试

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的14套腾讯、字节跳动、阿里、百度等2021面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

2401_84545291的博客 852

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【Android】- Android Service的两种启动方式

Service的两种启动服务方式。

baidu_hxl的博客 972

android系统应用保活_Android 8.0以上系统应用如何保活

最近在做一个埋点的sdk,由于埋点是分批上传的,不是每次都上传,所以会有个进程保活的机制,这也是自研推送的实现技术之一:如何保证Android进程的存活。对于Android来说,保活主要有以下一些方法:开启前台Service(效果好,推荐)Service中循环播放一段无声音频(效果较好,但耗电量高,谨慎使用)双进程守护(Android 5.0前有效)JobScheduler(Android 5.0...

weixin_33445930的博客 314

android系统应用保活_详解Android 8.0以上系统应用如何保活

最近在做一个埋点的sdk,由于埋点是分批上传的,不是每次都上传,所以会有个进程保活的机制,这也是自研推送的实现技术之一:如何保证Android进程的存活。对于Android来说,保活主要有以下一些方法:开启前台Service(效果好,推荐)Service中循环播放一段无声音频(效果较好,但耗电量高,谨慎使用)双进程守护(Android 5.0前有效)JobScheduler(Android 5.0...

weixin_39937312的博客 297

android x 进程保活_Android 应用进程保活

最近在做一个埋点的sdk,由于埋点是分批上传的,不是每次都上传,所以会有个进程保活的机制,这也是自研推送的实现技术之一:如何保证Android进程的存活。对于Android来说,保活主要有以下一些方法: - 开启前台Service(效果好,推荐) - Service中循环播放一段无声音频(效果较好,但耗电量高,谨慎使用) - 双进程守护(Android 5.0前有效) - JobScheduler...

weixin_39828960的博客 162

Service简单总结(android四大主键之一)

1 service(服务):服务是没有界面的组件,运行在后台,服务是运行在当前应用程序的进程里 2,编写步骤:     1,写一个类继承service     2,重写onBind()方法     3, 在清单文件的下面声明service 3 应用场景:如果用耗时的操作,不想有界面,而且还不想程序退出就停止的逻辑,放在服务里    例如:消息的推送,定时的轮询   开启服务方法 st

D_zjf_的博客 665

Android入门:绑定本地服务

一、绑定服务介绍 前面文章中讲过一般的通过startService开启的服务,当访问者关闭时,服务仍然存在; 但是如果存在这样一种情况:访问者需要与服务进行通信,则我们需要将访问者与服务进行绑定; 如果使用Context.bindService()方法启动服务,则在服务未创建时,系统会调用服务的onCreate()方法,接着调用onBind()方法,这时就访问者与服务已经绑定

xiazdong 8544

Android开发--Service开启,关闭,绑定,解除

Android应用程序中有一项非常重要的技术--Service,它没有运行界面,运行在后台,但是有一点非常重要,Service并不是一个单独的进程,同时也不是一个线程,用来处理耗时的动作。     Service有两种使用方法,一种是start和stop,另一种是绑定服务。     当使用的是第一种方法时,直到用户停止这个服务,Service才会停止,即使是用户关闭这个Activity(应用程

张勤一 5077

绑定服务service

什么是服务呢? 长期于后台运行的程序,如果是官方一点,首先它是一个组件,用于执行长期运行的任务,并且与用户没有交互。 通过Context.startService()来开启服务,通过Context.stop()来停止服务,还可以通过绑定来开启服务。 为什么要使用服务呢? 我们知道这个服务是用于执行长期后台运行的操作。有些时候,我们没有界面,但是程序仍然需要工作。比如说,我们播放音乐,在后台播放音乐。比如说,我们下载任务,在后台下载文件。这些都是没有界面 的后台运行程序,这些都是用服务做的。所以,服务

qq_40447795的博客 1225

Android Service - Service 引入(Service 概述、Service 类型、Service 初识、Service 简单任务、启动式服务、绑定式服务)

Android Service - Service 引入(Service 概述、Service 类型、Service 初识、Service 简单任务、启动式服务、绑定式服务)

weixin_52173250的博客 1315

AndroidStudio通过AIDL开启、绑定远程Service

本文以一个简单的案例,记录一下怎么使用AIDL结合Serice实现进程间的通信,让其他程序可以调用服务中的方法

man_help的博客 6591

Android学习-服务 Service 基础

Android Service 服务(Service) 是Android中的四大组件之一,它能够长期在后台运行,服务是不需要提供用户界面。即使用户切到另一应用程序,服务仍可以在后台运行。 1.Service 的创建 1.Service 的创建 服务创建就是新建一个java类,让他继承Service,添加未实现的方法 @Nullable @Override public IBinder onBind(Intent intent) { return null; }

qq_43843951的博客 20万+

Service之《本地服务》

对于Service来说应该是每个搞android开发都必须会的.但是Service对于初学者来说又不那么容易理解,反正我学的时候总是感觉很乱,没有一个完整的体系,所以今天我就带着大家一起来学习学习Service,今天的内容都是我个人的理解,可能会有偏差,还请大神们指出。   Service按作用来分,可以分为本地服务和远程服务。本地服务也就是用于同一个应用程序当中,而远程服务一般用于不同应用程序

一想天开 807
上一篇: BroadcastReceiver简介
下一篇: 自定义ViewGroup
Android_Study_OK
博客等级 码龄11年 91粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值