热门标签 | 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


推荐阅读
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
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社区 版权所有