热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

startService,startForegroundSer推vice和bindService

最近在开发过程中遇到相关问题,在此记录过程及解决思路bindservice。1原生已经实现功能  R来自adio应用

最近在开发过程中遇到相关问题,在此记录过程及解决思路bindservice

1 原生已经实现功能

   R来自adio应用

   a 监听开机广播startService

   b 点应用360问答图标后bindservice,bindService,实现与Serv减验态预通只映ice的通信

2 需要新实现的功能

其他应用接收开机广播后调用Radio应用,可能会s误入厂世tartActivity,可能会startService, 被拉起后,恢复退出前的状态bindservice

    a 恢复退出前的状态在Service中实现bindservice,在Ser其放又宁安减响理亚手vice中的onBind和onStartCommand中可以获取Intent,

        从武击液呀高移intent中获取标记位,如果需要恢复状态,恢复记录的band和channelbindservice

    b 但是判断过程只需要一次,五移掉所以考虑是在onStartCommand中还是onBind中做该判断bindservice

    c 测试发现bindservice,startService时,如果Service府波你照不木克尚未启动,onBind和onStartCo着示重况地笔松矛某mmand都会执行到,如果service已经启动,

       则只执行onStartCommandbindservice

    d 己四住害沿鲁几强所以将判断逻辑放在了onStartCommand中bindservice

    e 另外一种情况bindservice,其他应用拉起来的是Activity,需要将intent中的标记位通知到service,之前是用的on度团安义坚相解蒸Bind,同样的原因,

       当service已经启动的情况下,onBind不会重新执处想重势氧危课剧线行,并且,bind拉起来的service不会走到onStartCommandbindservice

    f  而如果在Activity拉起来service的时候,只用startService的话,则只会走onStartCommand,无法实现Activity和Service的通信bindservice

    g 所以最后实现,在activ怀跳ity中先startService再bindServicebindservice

1  Service也是运行在主线程

    一个服务(service)运行在主线程中,服务并不创建自己的线程,也不在隔离进程中运行(除非你指定)bindservice。这意味着,如果你的服务要执行CPU费时操作或阻塞操作,你需要在服务中创建新的线程来执行该操作。使用加起李主操间已其他线程,可以避免ANR错误,保证应用的主线程可以与用户交互。

    Se向帮也rvice多用于不需要浓越军了项商怎和用户进行交互的后台播放音乐,后台播放Radio等情况,如果涉及交互,只是不希望耗时,可以用threadbindservice

2 startSe保回延延江击通与rvice和bindService的区别

   a  交字似问况问刑里答东依互

       通过startservice来启动一个service,启动后,service在后台运行bindservice。通常来说,该service是无法返回结果的。

       可以利用bindservice来和service绑定,绑定后,我们可以和service交互,发送请求,得到结果甚至执行IPC通信bindservice

   b  生命周期

startService

       通过调用startService启动服务的过程:

       -》onCreate —》onStartCommand

       多次调用startServicebindservice,服务会多次执行:

       -》onStartCommand 

       多次调用startService后,调用一次stopService即可结束服务bindservice。(若多次调用stopService,只有第一次有用)

       调用stopService的服务结束过程

       -》onDestroy

startService,startForegroundSer推vice和bindService

 bindService

       调用bindService启动服务的过程:

       -》onCreate —》onBind  —》(onServiceConnected)

       多次调用bindService,服务本身未执行任何操作bindservice

       一次unBindService就能结束服务bindservice。(若多次调用unBindService,第一次有用,后面会出错)

       调用unBindService的服务结束过程:

       -》onUnbind —》onDestroy

 先startService后bindService

       先调用startService,后调用bindServicebindservice。服务的执行过程为:

       onCreate —》onStartCommand —》onStart —》onBind  —》(onServiceConnected)

       先unBindService,后stopServicebindservice。服务结束的执行过程:

       onUnbind —》onDestroy

        需注意的是:unBindService会执行到onUnbind,stopService会执行到onDestroybindservice

       先stopService,后unBindServicebindservice。服务结束的执行过程:

       onUnbind —》onDestroy

       需注意的是:stopService不会执行任何操作,unBindService会执行到onUnbind—》onDestroybindservice

      先bindService后startService

       先调用bindService,后调用startServicebindservice。服务的执行过程为:

       onCreate —》onBind  —》(onServiceConnected) —》onStartCommand

       先unBindService,后stopServicebindservice

       服务执行的过程同 三bindservice

       先stopService,后unBindServicebindservice。服务结束的执行过程:

       服务执行的过程同 三

        总结:

       1、多次bindService时,服务本身的onBind不会被多次执行bindservice

       2、bind上一个Service后,执行一次unBindService就够了bindservice。不然会出错。

       3、一个App里,同一个Activity多次bind一个服务,除了第一次,后面的bind不会有任何onBind、onServiceConnected打印bindservice

            一个App里bindservice,不同的Activity去bind一个服务,第一次bind有onBind、onServiceConnected打印,后面的bind只会             

            onServiceConnected打印bindservice

        4、一个Activity bind上一个Service后bindservice,如果Activity finish前没有调用unBind,App会崩溃,Log打印如下:

android.***.serviceconnectionleaked: Activity com.***.mainactivity has leaked ServiceConnection

   com.***.mainactivity$1@412d9808 that was originally bound here.

  3  startForegroundService

      Android 8.0 有一项复杂功能;系统不允许后台应用创建后台服务bindservice。 因此,Android 8.0 引入了一种全新的方法,即 ***.startforegroundservice(),以在前台启动新服务。

在系统创建服务后,应用有五秒的时间来调用该服务的 startForeground() 方法以显示新服务的用户可见通知bindservice

如果应用在此时间限制内未调用 startForeground(),则系统将停止服务并声明此应用为 ANRbindservice

8.0 以后不希望后台应用运行后台服务bindservice,除非特殊条件

一旦通过startForegroundService() 启动前台服务bindservice,必须在service 中有startForeground() 配套,不然会出现ANR 或者crash

startService,startForegroundSer推vice和bindService

startForeground() 中的id 和notification 不能为0 和 null


推荐阅读
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 在分析Android的Audio系统时,我们对mpAudioPolicy->get_input进行了详细探讨,发现其背后涉及的机制相当复杂。本文将详细介绍这一过程及其背后的实现细节。 ... [详细]
  • 最详尽的4K技术科普
    什么是4K?4K是一个分辨率的范畴,即40962160的像素分辨率,一般用于专业设备居多,目前家庭用的设备,如 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 实验九:使用SharedPreferences存储简单数据
    本实验旨在帮助学生理解和掌握使用SharedPreferences存储和读取简单数据的方法,包括程序参数和用户选项。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 深入解析 Synchronized 锁的升级机制及其在并发编程中的应用
    深入解析 Synchronized 锁的升级机制及其在并发编程中的应用 ... [详细]
  • 深入解析C语言中结构体的内存对齐机制及其优化方法
    为了提高CPU访问效率,C语言中的结构体成员在内存中遵循特定的对齐规则。本文详细解析了这些对齐机制,并探讨了如何通过合理的布局和编译器选项来优化结构体的内存使用,从而提升程序性能。 ... [详细]
  • 在 Android 开发中,`android:exported` 属性用于控制组件(如 Activity、Service、BroadcastReceiver 和 ContentProvider)是否可以被其他应用组件访问或与其交互。若将此属性设为 `true`,则允许外部应用调用或与之交互;反之,若设为 `false`,则仅限于同一应用内的组件进行访问。这一属性对于确保应用的安全性和隐私保护至关重要。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
author-avatar
oz法卡山英雄营
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有