23 个安卓重难点突破,带你吃透 Service 知识点「长达 1W+ 字」

3.1.3 第三点是应用场景上

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 当你需要执行耗时的网络,或者这种文件数据的查询,以及其它阻塞 UI 线程的时候,都应该使用工作线程,也就是开启一个子线程的方式。
  2. 这样才能保证 UI 线程不被占用,而影响用户体验。
  3. service 来说,我们经常需要长时间在后台运行,而且不需要进行交互的情况下才会使用到服务,比如说,我们在后台播放音乐,开启天气预报的统计,还有一些数据的统计等等。

3.2 为什么要用 Service 而不是 Thread

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • Thread 的运行是独立于 Activity 的,也就是当一个 Activityfinish 之后,如果没有主动停止 Thread 或者 Thread 中的 run 没有执行完毕时那么这个线程会一直执行下去。
  • 因此这里会出现一个问题:当 Activityfinish 之后,你不再持有该 Thread 的引用。
  • 另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。

3.3 Service 里面是否能执行耗时的操作

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • service 里面不能执行耗时的操作(网络请求,拷贝数据库,大文件 )

  • Service 不是独立的进程,也不是独立的线程,它是依赖于应用程序的主线程的,也就是说,在更多时候不建议在 Service 中编写耗时的逻辑和操作(比如:网络请求,拷贝数据库,大文件),否则会引起 ANR

  • 如果想在服务中执行耗时的任务。有以下解决方案:

  1. service 中开启一个子线程

new Thread(){}.start();

  1. 可以使用 IntentService 异步管理服务( 有关 IntentService 的内容在后文中给出 )

3.4 Service 是否在 main thread 中执行

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 默认情况, 如果没有显示的指 service 所运行的进程, Serviceactivity 是运 行在当前 app 所在进程的 main thread ( UI 主线程)里面。
  • ServiceActivity 在同一个线程,对于同一 app 来说默认情况下是在同一个线程中的 main Thread ( UI Thread )
  • 特殊情况 ,可以在清单文件配置 service 执行所在的进程 ,让 service 在另 外的进程中执行 Service 不死之身

注:如果是在 application 里创建的 Thread :这个 Thread 的生命周期就跟 app 生命周期一致了,不同 activity 也可操作它,这时 service 和这个 Thread 就很相似了(前提是这个 service 只提供给自身 app 使用,第三方 app 不能访问)

3.4.1 在 onStartCommand 方法中将 flag 设置为 START_STICKY ;

return Service.START_STICKY;

3.4.2 在 xml 中设置了 android:priority

<service android:name=“.MyService”
android:priority=“2147483647”

3.4.3 在 onStartCommand 方法中设置为前台进程

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Notification notification = new Notification(R.mipmap.ic_launcher, “服务正在运行”,System.currentTimeMillis());
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,notificationIntent,0);
RemoteViews remoteView = new RemoteViews(this.getPackageName(),R.layout.notification);
remoteView.setImageViewResource(R.id.image, R.mipmap.ic_launcher);
remoteView.setTextViewText(R.id.text , “Hello,this message is in a custom expanded view”);
notification.contentView = remoteView;
notification.contentIntent = pendingIntent;
startForeground(1, notification);
return Service.START_STICKY;
}

3.4.4 在 onDestroy 方法中重启 service

@Override
public void onDestroy() {
super.onDestroy();
startService(new Intent(this, MyService.class));
}

3.4.5 用 AlarmManager.setRepeating(…) 方法循环发送闹钟广播, 接收的时候调用 serviceonstart 方法

Intent intent = new Intent(MainActivity.this,MyAlarmReciver.class);
PendingIntent sender = PendingIntent.getBroadcast( MainActivity.this, 0, intent, 0);

// We want the alarm to go off 10 seconds from now.
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 1);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
//重复闹钟
/**

  • @param type
  • @param triggerAtMillis t 闹钟的第一次执行时间,以毫秒为单位
  • go off, using the appropriate clock (depending on the alarm type).
  • @param intervalMillis 表示两次闹钟执行的间隔时间,也是以毫秒为单位
  • of the alarm.
  • @param operation 绑定了闹钟的执行动作,比如发送一个广播、给出提示等等
    */
    am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 2 * 1000, sender);
3.4.6 目前市场面的很多三方的消息推送 SDK 唤醒 APP , 例如 Jpush

PS: 以上这些方法并不代表着你的 Service 就永生不死了,只能说是提高了进程的优先级。迄今为止我没有发现能够通过常规方法达到流氓需求 (通过长按 home 键清除都清除不掉) 的方法,目前所有方法都是指通过 Android 的内存回收机制和普通的第三方内存清除等手段后仍然保持运行的方法,有些手机厂商把这些知名的 app 放入了自己的白名单中,保证了进程不死来提高用户体验(如微信、QQ 、陌陌都在小米的白名单中)。如果从白名单中移除,他们终究还是和普通 app 一样躲避不了被杀的命运。

第四篇:IntentService


  • 作为一个老司机,如果连 Interservice 都没听说过,那就有点那个啥了

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.1 什么是 IntentService

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • IntentServiceService 的子类,比普通的 Service 增加了额外的功能。

  • 我们常用的 Service 存在两个问题:

  1. Service 不会专门启动一条单独的进程,Service 与它所在应用位于同一个进程中

  2. Service 也不是专门一条新线程,因此不应该在 Service 中直接处理耗时的任务

4.2 IntentService 的特征

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 会创建独立的 worker 线程来处理所有的 Intent 请求

  • 会创建独立的 worker 线程来处理 onHandleIntent() 方法实现的代码,无需处理多线程问题

  • 所有请求处理完成后,IntentService 会自动停止,无需调用 stopSelf() 方法停止 Service

  • ServiceonBind() 提供默认实现,返回 null

  • ServiceonStartCommand 提供默认实现,将请求 Intent 添加到队列中

4.3 Service 和 IntentService 区别

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.3.1 Service 是用于后台服务的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 当应用程序被挂到后台的时候,为了保证应用某些组件仍然可以工作而引入了 Service 这个概念
  2. 那么这里面要强调的是:Service 不是独立的进程,也不是独立的线程,它是依赖于应用程序的主线程的,也就是说,在更多时候不建议在 Service 中编写耗时的逻辑和操作,否则会引起 ANR

也就是,service 里面不可以进行耗时的操作。虽然在后台服务。但是也是在主线程里面。

4.3.2 当我们编写的耗时逻辑,不得不被 service 来管理的时候,就需要引入 IntentService

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. IntentService 是继承 Service 的,那么它包含了 Service 的全部特性,当然也包含 service 的生命周期。
  2. 那么与 service 不同的是,IntentService 在执行 onCreate 操作的时候,内部开了一个线程,去你执行你的耗时操作。
4.3.3 使用:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 重写 protected abstract void onHandleIntent(Intent intent)
4.3.4 IntentService 是一个通过 Context.startService(Intent) 启动可以处理异步请求的 Service

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 使用时你只需要继承 IntentService 和重写其中的 onHandleIntent(Intent) 方法接收一个 Intent 对象 , 在适当的时候会停止自己 ( 一般在工作完成的时候 ) 。
  2. 所有的请求的处理都在一个工作线程中完成 , 它们会交替执行 ( 但不会阻塞主线程的执行 ) ,一次只能执行一个请求。
4.3.5 是一个基于消息的服务

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 每次启动该服务并不是马上处理你的工作,而是首先会创建对应的 LooperHandler 并且在 MessageQueue 中添加的附带客户 IntentMessage 对象。
  2. Looper 发现有 Message 的时候接着得到 Intent 对象通过在 onHandleIntent((Intent)msg.obj) 中调用你的处理程序,处理完后即会停止自己的服务。
  3. 意思是 Intent 的生命周期跟你的处理的任务是一致的,所以这个类用下载任务中非常好,下载任务结束后服务自身就会结束退出。
4.3.6 总结 IntentService 的特征有:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 会创建独立的 worker 线程来处理所有的 Intent 请求;

  2. 会创建独立的 worker 线程来处理 onHandleIntent() 方法实现的代码,无需处理多线程问题;

  3. 所有请求处理完成后,IntentService会自动停止,无需调用 stopSelf() 方法停止 Service

第五篇:Service 与 Activity


外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5.1 Activity 怎么和 Service 绑定,怎么在 Activity 中启动对应的 Service

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • Activity 通过 bindService(Intent service, ServiceConnection conn, int flags)Service 进行绑定,当绑定成功的时候 Service 会将代理对象通过回调的形式传给 conn ,这样我们就拿到了 Service 提供的服务代理对象。

  • Activity 中可以通过 startServicebindService 方法启动 Service。一般情况下如果想获取 Service 的服务对象那么肯定需要通过 bindService() 方法,比如音乐播放器,第三方支付等。

  • 如果仅仅只是为了开启一个后台任务那么可以使用 startService() 方法。

5.2 说说 Activity 、Intent 、Service 是什么关系

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 他们都是 Android 开发中使用频率最高的类。其中 ActivityService 都属于 Android 的四大组件。他俩都是 Context 类的子类 ContextWrapper 的子类,因此他俩可以算是兄弟关系吧。

  • 不过他们各有各自的本领,Activity 负责用户界面的显示和交互,Service 负责后台任务的处理。

  • ActivityService 之间可以通过 Intent 传递数据,因此可以把 Intent 看作是通信使者。

5.3 Service 和 Activity 在同一个线程吗

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于同一 app 来说默认情况下是在同一个线程中的,main ThreadUI Thread )。

5.4 Service 里面可以弹吐司么

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 可以
  • 弹吐司有个条件是:得有一个 Context 上下文,而 Service 本身就是 Context 的子类
  • 因此在 Service 里面弹吐司是完全可以的。比如我们在 Service 中完成下载任务后可以弹一个吐司通知给用户。

5.5 与 Service 交互方式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5.5.1 广播交互

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. Server 端将目前的下载进度,通过广播的方式发送出来,Client 端注册此广播的监听器,当获取到该广播后,将广播中当前的下载进度解析出来并更新到界面上。
  2. 定义自己的广播,这样在不同的 ActivityService 以及应用程序之间,就可以通过广播来实现交互。
5.5.2 共享文件交互

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 我们使用 SharedPreferences 来实现共享,当然也可以使用其它 IO 方法实现,通过这种方式实现交互时需要注意,对于文件的读写的时候,同一时间只能一方读一方写,不能两方同时写。
  2. Server 端将当前下载进度写入共享文件中,Client 端通过读取共享文件中的下载进度,并更新到主界面上。
5.5.3 Messenger 交互 ( 信使交互 )

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. Messenger 翻译过来指的是信使,它引用了一个 Handler 对象,别人能够向它发送消息 ( 使用 mMessenger.send ( Message msg ) 方法)。
  2. 该类允许跨进程间基于 Message 通信,在服务端使用 Handler 创建一个 Messenger ,客户端只要获得这个服务端的 Messenger 对象就可以与服务端通信了
  3. Server 端与 Client 端之间通过一个 Messenger 对象来传递消息,该对象类似于信息中转站,所有信息通过该对象携带
5.5.4 自定义接口交互

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 其实就是我们自己通过接口的实现来达到 ActivityService 交互的目的,我们通过在 ActivityService 之间架设一座桥樑,从而达到数据交互的目的,而这种实现方式和 AIDL 非常类似
  2. 自定义一个接口,该接口中有一个获取当前下载进度的空方法。Server 端用一个类继承自 Binder 并实现该接口,覆写了其中获取当前下载进度的方法。Client 端通过 ServiceConnection 获取到该类的对象,从而能够使用该获取当前下载进度的方法,最终实现实时交互。
5.5.5 AIDL 交互

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 远程服务一般通过 AIDL 来实现,可以进行进程间通信,这种服务也就是远程服务。
  2. AIDL 属于 AndroidIPC 机制,常用于跨进程通信,主要实现原理基于底层 Binder 机制。

第六篇:使用


外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

6.1 什么情况下会使用 Service

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

6.1.1 经验总结:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. Service 其实就是背地搞事情,又不想让别人知道
  2. 举一个生活当中的例子,你想知道一件事情不需要直接去问,你可以通过侧面了解。这就是 Service 设计的初衷
6.1.2 Service 为什么被设计出来

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 根据 Service 的定义,我们可以知道需要长期在后台进行的工作我们需要将其放在 Service 中去做。
  2. 得再通熟易懂一点,就是不能放在 Activity 中来执行的工作就必须得放到 Service 中去做。
  3. 如:音乐播放、下载、上传大文件、定时关闭应用等功能。这些功能如果放到 Activity 中做的话,那么 Activity 退出被销毁了的话,那这些功能也就停止了,这显然是不符合我们的设计要求的,所以要将他们放在 Service 中去执行。

6.2 onStartCommand() 返回值 int 值的区别

  • 有四种返回值,不同值代表的意思如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

6.2.1 START_STICKY :
  1. 如果 service 进程被 kill 掉,保留 service 的状态为开始状态,但不保留递送的 intent 对象。
  2. 随后系统会尝试重新创建 service, 由于服务状态为开始状态,所以创建服务后一定会调用 onStartCommand ( Intent, int, int ) 方法。
  3. 如果在此期间没有任何启动命令被传递到 service , 那么参数 Intent 将为 null
6.2.2 START_NOT_STICKY :
  1. “非粘性的”。
  2. 使用这个返回值时 , 如果在执行完 onStartCommand 后 , 服务被异常 kill 掉 ,系统不会自动重启该服务。
6.2.3 START_REDELIVER_INTENT:
  1. 重传 Intent
  2. 使用这个返回值时,如果在执行完 onStartCommand 后,服务被异常 kill 掉
  3. 系统会自动重启该服务 , 并将 Intent 的值传入。
6.2.4 START_STICKY_COMPATIBILITY:
  1. START_STICKY 的兼容版本 , 但不保证服务被 kill 后一定能重启。

6.3 在 service 的生命周期方法 onstartConmand() 可不可以执行网络操作?如何在 service 中执行网络操作?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 可以直接在 Service 中执行网络操作
  • onStartCommand() 方法中可以执行网络操作

6.4 提高 service 的优先级

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • AndroidManifest.xml 文件中对于 intent-filter 可以通过 android:priority = “1000” 这个属性设置最高优先级,1000 是最高值,如果数字越小则优先级越低,同时实用于广播。

  • onStartCommand 里面调用 startForeground() 方法把 Service 提升为前台进程级别,然后再 onDestroy 里面要记得调用 stopForeground () 方法。

  • onStartCommand 方法,手动返回 START_STICKY

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • onDestroy 方法里发广播重启 service
  1. service + broadcast 方式,就是当 serviceondestory 的时候,发送一个自定义的广播
  2. 当收到广播的时候,重新启动 service 。( 第三方应用或是在 setting 里-应用强制停止时,APP 进程就直接被干掉了,onDestroy 方法都进不来,所以无法保证会执行 )
  • 监听系统广播判断 Service 状态。
  1. 通过系统的一些广播
  2. 比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的 Service 是否还存活。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

总结:

各行各样都会淘汰一些能力差的,不仅仅是IT这个行业,所以,不要被程序猿是吃青春饭等等这类话题所吓倒,也不要觉得,找到一份工作,就享受安逸的生活,你在安逸的同时,别人正在奋力的向前跑,这样与别人的差距也就会越来越遥远,加油,希望,我们每一个人,成为更好的自己。

  • BAT大厂面试题、独家面试工具包,

  • 资料包括 数据结构、Kotlin、计算机网络、Framework源码、数据结构与算法、小程序、NDK、Flutter

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

03/13/H4lCoPEF.jpg" />

总结:

各行各样都会淘汰一些能力差的,不仅仅是IT这个行业,所以,不要被程序猿是吃青春饭等等这类话题所吓倒,也不要觉得,找到一份工作,就享受安逸的生活,你在安逸的同时,别人正在奋力的向前跑,这样与别人的差距也就会越来越遥远,加油,希望,我们每一个人,成为更好的自己。

  • BAT大厂面试题、独家面试工具包,

  • 资料包括 数据结构、Kotlin、计算机网络、Framework源码、数据结构与算法、小程序、NDK、Flutter
    [外链图片转存中…(img-ablzkAxk-1712597959043)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 16
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
操作系统是计算机系统中的核心组成部分,负责管理和协调计算机硬件和软件资源,提供程序运行环境。在CSDN上有很多关于操作系统的专题文章,以下将从操作系统的基本概念、功能和常见类型等方面简要介绍一下。 首先是操作系统的基本概念。操作系统是一种系统软件,它是计算机硬件和应用软件之间的桥梁,提供给应用程序一系列的服务和资源,同时负责调度和管理系统资源。它为用户屏蔽了底层的硬件差异,提供了一个统一的、易于使用的界面。 操作系统主要有四个基本功能。首先是处理器管理,负责将处理器分配给系统中的各个进程,并进行进程切换,实现多道程序并发执行。其次是内存管理,管理计算机的内存资源,包括分配、回收和保护等操作。再次是文件管理,负责管理文件的存储、命名和保护等操作,提供了文件操作的接口。最后是设备管理,负责管理计算机的各种设备,包括输入输出设备和存储设备等。 常见的操作系统有多种类型。最主流的是Windows、Linux和Mac OS等桌面操作系统。此外还有服务器操作系统,如Windows Server和Linux等,用于管理和部署服务器。还有嵌入式操作系统,如Android和iOS等,用于移动设备和物联网设备。操作系统也有实时操作系统,用于需要实时控制和响应的系统,如工控系统和航空航天系统等。 总之,操作系统是计算机系统中不可或缺的重要组成部分,通过CSDN上的相关文章,我们可以更深入了解操作系统的基本概念、功能和不同类型。这些知识对于理解计算机系统的工作原理和提升编程能力都有着重要意义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值