Android 基础知识:四大组件之 Service详解

  • 可以在后台执行长时间运行操作而没有用户界面的应用组件
  • Service 分为两种工作状态,一种是启动状态,主要用于执行后台计算;另一种是绑定状态,主要用于其他组件和 Service 的交互。
  • 对于同一 app 来说,默认情况下 Service 和 Activity 是在同一个线程中的,main Thread (UI Thread)。

一、启动过程

  • 同样 建议结合源码去看,这里给出调用链
  • 一篇文章看明白 Android Service 启动过程


1.1 注册Service

  • Service还是运行在主线程当中的,所以如果需要执行一些复杂的逻辑操作,最好在服务的内部手动创建子线程进行处理,否则会出现UI线程被阻塞的问题

1.2 ActivityThread.java

  • Service 的启动

  • ContextWrapper

Proxying代理 implementation实现 of Context that simply简单的 delegates委托 all of its calls to another Context. Can be subclassed to归为 modify修改 behavior without changing the original Context.

  • ContextImpl

ContextImpl作为Context的抽象类,实现了所有的方法,我们常见的getResources(),getAssets(),getApplication()等等的具体实现都是在ContextImpl的

  • AMP/AMN/AMS AT/ATP/ATN

这块内容太多,比如可以看看这个 AMP/AMN/AMS AT/ATP/ATN

  • Zygote

Zygote 是android系统应用中一个相当重要的进程,其主要功能是执行Android应用程序。在android系统中运行新的应用,需要跟Zygote进程(拥有应用程序运行时所需要的各种元素和条件)结合后才能执行。

Zygote进程运行时,会初始化Dalvik虚拟机,并启动它。android的应用程序是由java编写的,不能直接以本地进程的形态运行在linux上,只能运行在Dalvik虚拟机中。并且每个应用程序都运行在各自的虚拟机中,应用程序每次运行都要重新初始化并启动虚拟机,这就相当耗时。在android中,应用程序运行前,Zygote进程通过共享已运行的虚拟机的代码与内存信息,缩短应用程序运行所耗费的时间。并且,它会事先将应用程序要使用的android Fromework中的类和资源加载到内存中,并组织形成所用资源的链接信息。新运行的 android 应用程序在使用所需要的资源时不必每次重新形成资源的链接信息,这样提高程序运行速度。

在android中,使用Zygote进程的目的?对于手机,为了是应用程序在有限的资源型有更快的运行响应速度,提高资源利用率和设备使用时间。android使用Zygote来有效的减少系统负担,提高运行速度。

二、绑定过程


2.1 只使用startService启动服务的生命周期

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

如果想获取Service中提供的代理对象,那么必须通过bindService方法,进行绑定服务。 使用场景比如:音乐播放器,第三方支付等。

2.2 只使用BindService绑定服务的生命周期

  • Service 的 onRebind(Intent)方法, 如果在 onUnbind() 方法返回 true 的情况下会执行,否则不执行。

2.3 同时使用startService()启动服务、BindService()绑定服务的生命周期

  • 在Activity中可以通过startService和bindService方法启动Service。

2.4 ActivityThread.java

3、生命周期

2.4 Service 与 Activity 通信

2.5 启用前台服务

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
Notification notification = new Notification(icon, text, System.currentTimeMillis());
Intent notificationIntent = new Intent(this, ExampleActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.setLatestEventInfo(this, title, mmessage, pendingIntent);
startForeground(ONGOING_NOTIFICATION_ID, notification);

2.6 IntentService

IntentService是Service的子类,是一个异步的,会自动停止的服务,很好解决了传统的Service中处理完耗时操作忘记停止并销毁Service的问题

  • 区别

今年年初我花一个月的时间收录整理了一套知识体系,如果有想法深入的系统化的去学习的,可以私信我【安卓】,我会把我收录整理的资料都送给大家,帮助大家更快的进阶。

发布了289 篇原创文章 · 获赞 30 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_45365889/article/details/102776958