安卓哪个框架有用线程池
1. 安卓框架有哪些
问题一:Android常用的框架有哪些 Android开发中常用的框架:
1、Afinal
Afinal是一个android的ioc,orm框架,内置了四大模块功能:FinalAcitivity,FinalBitmap,FinalDb,FinalHttp。通过finalActivity,可以通过注解的方式进行绑定ui和事孝戚历件。通过finalBitmap,可以方便的加载bitmap图片,而无需考虑oom等问题。通过finalDB模块,一行代码就可以对android的sqlite数据库进行增删改查。通过FinalHttp模块,以ajax形式请求数据。
2、 xUtils
xUtils:可以说是Afinal的升级版。
xUtils 包含了很多实用的android工具。
xUtils 支持大文件上传,更全面的请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响。
xUitls 最低兼容android 2.2 (api level8)。
3、LoonAndroid
这是一个纯实现功能的框架,它的目标是节省代码量,降低耦合,让代码层次看起来更清晰。
4、 KJFrameForAndroid
是一个android的orm 和 ioc 框架。同时封装了android中的Bitmap与Http操作的框架,使其更加简单易用;
KJFrameForAndroid的设计思想是通过封装Android原生SDK中复杂的复杂操作而达到简化Android应用级开发,最终实现快速而又安全的开发APP。我们提倡用最少的代码,完成最多的操作,用最高的效率,完成最复杂的功能。
项目地址:github/kymjs/KJFrameForAndroid
5、 dhroid
dhroid 是基于android 平台, 极速开发框架,其核心设计目标是开发迅速、代码量少、学习简单、功能仔或强大、轻量级、易扩展.使你更快,更好的开发商业级别应用。
6、 SmartAndroid
SmartAndroid是一套给 Android开发者使用的应用程序开发框架和工具包。提供了一套丰富的标准库以及简单的接口和逻辑结构,其目的是使开发人员更快速地进行项目开发。使用 SmartAndroid可以减少代码的编写量,并将你的精力投入到项目的创造性开发上。
7、 andBase
ndbase是为Android开发者量身打造的一款开源类库产品
8、 AndroidAnnotations
完全的注解,使开发起来更加便利,程序员写的代码也更少。
9、 volley
Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮异步加载网络图片、网络数据,Google官方推荐。
问题二:安卓软件开发框架有哪些 安卓软件开发需要一定的java基础,当然少不了Java环境的搭建,还有安卓SDK的环境搭建,接着你下个eclipse装个ADT插件,或者直接用Android studio就可以开发安卓应用了,具体的建议你找个开发教程
问题三:android有哪些实用框架?分别用来做什么? Android 目前还没有那样成熟的框架可以使用……
只能说有一些开源项目较好地解决了部分方面的问题,例如:
(1)EventBus:解决了模块之间消息传递解耦合的问题
(2)picasso:解决异步加载图片和缓存图片的问题
(3)dagger:一个依赖注入工具库
……
其他开巧搜源项目大多数解决了部分通用 UI 控件的问题,不过我看你的意思是架构级别的框架,而不是什么 UI 控件这类的小东西。
问题四:什么是android的框架开发 上图中的第二层Framework
问题五:常用的android开发框架有哪些 android bootstrap有试用过,但其实不用框架都能完成你想要的功能的话,真心没必要用。
问题六:Android的系统架构包括哪些部分 Android的系统架构和其操作系统一样,采用了分层的架构。Android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux内核层。
一、应用程序
Android会同一系列核心应用程序包一起发布,该应用程序包包括客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。
二、应用程序框架
开发人员也可以完全访问核心应用程序所使用的API框架。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。
三、系统运行库
Android 包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。
四、Linux内核层
Android内核是基于Linux 内核的修改的内核版本,它提供了用于支持Android平台的设备驱动。
问题七:android快速开发框架有哪些 ThinkAndroid免费源、简易、遵循Apache二源协议发布Android发框架其发宗旨简单、快速进行Android应用程序发包含Android mvc、简易sqlite orm、ioc模块、封装Android clitent模块,具快速构建文件缓存功能需考虑缓存文件格式都非轻松实现缓存基于文件缓存模块实现图片缓存功能android加载图片候oom问题加载图片错位问题都轻易解决包括手机发经应用实用工具类志管理配置文件管理android载器模块中国络切换检测等等工具 目前ThinkAndroid主要模块: MVC模块:实现视图与模型离 ioc模块:androidioc模块完全注解式进行UI绑定、res资源读取、及象初始化 数据库模块:androidorm框架使用线程池sqlite进行操作 模块:通client进行封装数据请求支持异步及同步式加载 缓存模块:通简单配置及设计实现缓存缓存随意配置 图片缓存模块:imageview加载图片候需考虑图片加载程现oomandroid容器快速滑候现图片错位等现象 配置器模块:简易实现配配置操作目前配置文件支持Preference、Properties配置进行存取 志打印模块:较快轻易实现志打印支持志打印扩展目前支持sdcard写入本打印、及控制台打印 载器模块:简单实现线程载、台载、断点续传、载进行控制、始、暂停、删除等等 中国络状态检测模块:中国络状态改变中国络状态进行检
问题八:主流android开发框架有哪些 android开发框架github上有非常非常多,各种都是开源的,例如侧滑菜单,ImageLoading等等。
问题九:Android 有哪些着名的开源框架呢? 什么应用才对应什么所谓框架。你写个游戏用J2EE的框架试试。或者你写个搜索引擎用游戏引擎试试。没有哪个框架解决所有问题,如果那样,搞计算机也太简单了,框架拿来,随便改改就是一个软件。还是学点设计模式这些基本的有用。
问题十:Android软件框架结构自可分为哪些层? 开发一个程序,android的系统框架是层层相扣,不能分开的。
应用程序层:
这个层主要指的就是用java语言编写的运行在虚拟机上的程序,Google在最开始时就 在android系统中捆绑了一些核心的应用(核心应用的编写必须使用应用层序框架层的API框架),例如你android手机中SMS发送短消息的程序,通讯录等等。
应用程序框架层:
指的就是开发时所需要的API框架,开发人员是在遵守该框架的原则上,调用他们的,开发自己所需要的程序。
系统运行库层:
用于支持应用框架层的各个组件的。就是说当开发人员使用android应用框架层时,android系统会通过一些C/C++库来支持对我们使用的各个组件,使其能更好地为开发者服务。
linux核心层:
android的核心系统服务如安全性、内存管理、进程管理、网络协议栈和驱动模型等都依赖于Linux2.6内核,Linux内核同时也作为硬件和软件栈之间的抽象层。
因此,你开发的程序是运行在应用程序层,开发中写代码调用的包,是基于应用框架层,而在应用框架中的各个组件是需要系统运行库的支持的,例如,你要登陆查看的信息就必须访问到SQLite数据库,SQLite就位于系统运行库,再有,你登入要输入信息,肯定需要键盘驱动的支持,而各种驱动是依赖Linux内核的。
2. 开发android app有什么架构吗
主要有以下模块:
(1) JSON,图像等的异步下载;
(2) 网络请求的排序(scheling)
(3) 网络请求的优先级处理
(4) 缓存
(5) 多级别取消请求
(6) 和Activity和生命周期的联动(Activity结束时同时取消所有网络请求)2、android-async-http
主要有以下模块:
(1) 在匿名回调中处理请求结果
(2) 在UI线程外进行http请求
(3) 文件断点上传
(4) 智能重试
(5) 默认gzip压缩
(6) 支持解析成Json格式
(7) 可将Cookies持久化到SharedPreferences 3、Afinal框架
主要有四大模块:
(1) 数据库模块:android中的orm框架,使用了线程池对sqlite进行操作。
(2) 注解模块:android中的ioc框架,完全注解方式就可以进行UI绑定和事件绑定。无需findViewById和setClickListener等。
(3) 网络模块:通过httpclient进行封装http数据请求,支持ajax方式加载,支持下载、上传文件功能。
(4) 图片缓存模块:通过FinalBitmap,imageview加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象。4、xUtils框架
主要有四大模块:
(1) 数据库模块:android中的orm框架,一行代码就可以进行增删改查;
(2) 注解模块:android中的ioc框架,完全注解方式就可以进行UI,资源和事件绑定;
(3) 网络模块:支持同步,异步方式的请求;
(4) 图片缓存模块:加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象;5、ThinkAndroid主要有以下模块:(1) MVC模块:实现视图与模型的分离。
(2) ioc模块:android中的ioc模块,完全注解方式就可以进行UI绑定、res中的资源的读取、以及对象的初始化。
(3) 数据库模块:android中的orm框架,使用了线程池对sqlite进行操作。
(4) http模块:通过httpclient进行封装http数据请求,支持异步及同步方式加载。
(5) 缓存模块:通过简单的配置及设计可以很好的实现缓存,对缓存可以随意的配置
(6) 图片缓存模块:imageview加载图片的时候无需考虑图片加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象。
(7) 配置器模块:可以对简易的实现配对配置的操作,目前配置文件可以支持Preference、Properties对配置进行存取。
(8) 日志打印模块:可以较快的轻易的是实现日志打印,支持日志打印的扩展,目前支持对sdcard写入本地打印、以及控制台打印
(9) 下载器模块:可以简单的实现多线程下载、后台下载、断点续传、对下载进行控制、如开始、暂停、删除等等。
(10) 网络状态检测模块:当网络状态改变时,对其进行检6、LoonAndroid 主要有以下模块:
(1) 自动注入框架(只需要继承框架内的application既可)
(2) 图片加载框架(多重缓存,自动回收,最大限度保证内存的安全性)
(3) 网络请求模块(继承了基本上现在所有的http请求)
(4) eventbus(集成一个开源的框架)
(5) 验证框架(集成开源框架)
(6) json解析(支持解析成集合或者对象)
(7) 数据库(不知道是哪位写的 忘记了)
(8) 多线程断点下载(自动判断是否支持多线程,判断是否是重定向)
(9) 自动更新模块
(10) 一系列工具类
3. kotlin协程有哪些应用场景
作者:J船长
一、协程:挂起与恢复,让异步像同步的核心概念
想象一下,你正在看一部非常引人入胜的电影,但是突然你想上厕所。你难道会错过电影中精彩的部分吗?当然不会。你会“暂停”电影,上完厕所再“恢复”播放。这就是协程的核心概念:挂起与恢复。你可以把协程想象成一个大厨,他正在烹饪多道菜品。当一个菜品需要等待一段时间(比如煮沸或烘烤)时,大厨不会傻傻地等待,而是转向另一个任务。这就是协程的核心思想:挂起与恢复。
什么时候,需要用到协程?
协程,轻量级的线程管理工具。什么时候用到? ——执行异步任务 和 管理并发操作。
最经典的场景
最经典的,无非就是,多个网络请求,一起执行,让这些本来都是异步的代码,像同步一样地执行。
二、 协程的依赖
安卓项目中使用协程,先添加依赖
build.gradle 引入一下
三、先从最经典的场景说起
假设,有一个页面,需要用Retrofit,请求2个接口,当且仅当两个接口都请求成功时,汇总数据返回,更新UI。
其中,一个接口请求用户详情,一个接口请求文章数据,一个类用于汇总数据。
定义我们的数据类和API接口:创建Retrofit实例ViewModel中处理异步请求在Activity中使用
上面代码,大概看个印象,可以看下下面的分析,也可以直接跳到第四大点。
上面的代码,到底讲了什么
我们对这个使用 Kotlin 协程的网络请求例子做一个分析和总结。这个例子展示了如何使用 Kotlin 协程来处理并行的异步任务,并通过 LiveData 对象将结果返回到 UI。Kotlin 协程提供了一种简洁的方式来管理异步操作,避免了回调地狱,使代码更易于阅读和维护。此外,通过正确使用viewModelScope,我们可以确保在 ViewModel 被清除时取消所有的协程,从而避免了内存泄露。
四、协程,正式开打
协程离不开的4个东西
巴拉巴拉一堆名词。
写个最简单的协程代码,然后圈出来看一下。
了然了然一下
最简单的协程代码
那么,谁是 挂起函数function ?作用域Scope? 上下文Context? 构建器Build?
Emmm,F4的第一次见面,结束。
五、协程的作用域 CoroutineScope
CoroutineScope作用域这玩意,必须先讲,不然如果是刚入门的同学,可能会因为没先了解这个东西,整的云里雾里。GlobalScope这个作用域,它不会阻止 JVM 结束运行,这意味着!!!!!很可能JVM都结束了,你的协程还在运行,然后问题就来了,你在代码里面写了一些输出语句,然后你死等,就等不到你的输出语句被打印出来。然后一脸懵逼,二脸懵逼,懵山懵海。尽量别用它
几个作用域作用域的开发场景代码典型的应用场景
GlobalScope: 几乎不用
CoroutineScope: 常用
MainScope
viewModelScope 常用
lifecycleScope 常用
runBlocking
其实,对于开发初步使用
看到这里,基本也就够了。
当然,但是,接着说,也是可以的!
六、协程的构造器 CoroutineBuilder
其实吧,这个东西,有点模糊。官方只说了launch和async是CoroutineBuilder。但是对于 runBlocking 和 coroutineScope,它们同时具有作用域和构造器的特性,但是我们这里,不把他们当做构造器,只认为 launch 和 async 是构造器。
协程的两个启动方法launch 和 async 的对比
launch 和 async 都是用来创建新协程的构造器。它们的主要区别在于返回值和目的。
Job 和 Deferred 的对比
Job 和 Deferred 都代表一个协程的生命周期和状态。它们的主要区别在于,Deferred 可以有一个结果。
launch 和 async 代码演示
这备注,可以说是相当详细了吧。
关于协程的构造器,可以了
七、协程的上下文
在 Android 开发中,以下几个协程上下文是比较常用的:
Dispatchers.Main
1.Dispatchers.Main:在主线程上执行协程代码,用于处理 UI 相关的操作,例如更新界面、响应用户交互等。在 Android 中,由于 UI 操作必须在主线程上执行,因此使用 Dispatchers.Main 是非常常见的。(由于协程在主线程中执行,不应该在该上下文中进行耗时操作,以免阻塞主线程导致应用无响应。)
Dispatchers.IO
2. Dispatchers.IO:用于执行 I/O 相关的操作,如网络请求、文件读写等。它使用了一个线程池来运行协程代码,适用于执行长时间的阻塞操作。在进行网络请求、数据库操作或文件读写等 I/O 操作时,使用 Dispatchers.IO 可以避免阻塞主线程,提高应用程序的响应性。
Dispatchers.Default
2.Dispatchers.Default:用于执行计算密集型操作,如数据处理或计算。它使用了一个线程池来运行协程代码,适用于执行消耗 CPU 资源的任务。当需要进行复杂的计算或处理大量数据时,使用 Dispatchers.Default 可以将这些操作分配到后台线程,避免阻塞主线程。
除了上述常用的协程上下文,还有一些其他的上下文也可能在特定的场景中使用:
Dispatchers.Unconfined
3.Dispatchers.Unconfined:这个上下文不受任何特定线程的限制,协程会在恢复后恢复到任意线程上。它适用于一些无需特定线程限制的操作,但需要注意的是,由于协程在不同的线程之间切换,可能会导致上下文切换的开销。
CoroutineName
4.CoroutineName:这个上下文用于为协程指定一个名称,以方便调试和追踪。在复杂的协程流程中,给协程命名可以帮助我们更好地理解和跟踪协程的执行路径。
在 Android 开发中,常用的协程上下文是根据具体的需求和场景选择的。主要关注需要在主线程上执行的 UI 操作、I/O 操作和计算密集型操作,并根据需要选择适当的协程上下文。
也就是说,日常使用基本都是Dispatchers.Main, Dispatchers.IO,Dispatchers.Default
Dispatchers.Main示例
Dispatchers.IO:
Dispatchers.Default:
八、协程 恢复和挂起
挂起(suspend)和恢复(resume)是协程的两个核心操作。
简单来说:
我们可以把协程想象成一部正在播放的电影。当你需要离开一会(比如接个电话),你可能会按下"暂停"按钮,这就是挂起协程。当你准备好继续观看时,你会按下"播放"按钮,这就是恢复协程。
谁可以调用挂起函数
在 Kotlin 协程中,挂起函数只能在以下环境中被调用:
挂起suspend 函数的小例子
看代码吧
我们前面说过,delay()本身也是一个挂起函数
在上面的代码中,launch函数启动了一个新的协程,并在内部调用了delay(1000L)。这个delay函数就是一个挂起函数,它会暂停协程的执行1秒钟(但不会阻塞线程),然后恢复协程的执行。
这段代码的输出将是:
我们看到,输出顺序是 开始 —— 继续 ——恢复。
注意观察,虽然我们的协程在等待时,主线程并没有被阻塞,而是继续执行了下一行代码。协程的暂停并不会阻塞线程。
再来一个例子
打印输出:
常见的挂起函数
被 suspend 修饰的函数就是挂起函数,协程也自带一些挂起函数
协程的挂起函数有许多,比如delay,join,await,withContext,yield,withTimeout 等等。这些函数的作用和特点如下:
以下是一个例子,结合 Android 的 Activity,演示如何使用这些函数:
单独演示下常用的 withContext
输出
emm,基本写到这里的话,日常开发也够用了。不写了太长了这个文章
番外篇 协程到底是不是在单线程里并发?还是不多线程?
协程可能在单线程,也可能是多线程。具体要取决于Dispatcher
协程本身并不直接与线程对应,它是一种轻量级的线程,可以在单个线程内并发执行,也可以在多个线程之间切换。一个协程可以在一个线程中启动,然后在另一个线程中暂停,然后再在另一个线程中恢复。
具体来说,协程的运行取决于它的调度器(Dispatcher)。调度器决定了协程在哪个线程或哪些线程上执行。比如 Dispatchers.Main 是主线程调度器,Dispatchers.IO 是专门用于磁盘和网络 IO 读写的调度器,Dispatchers.Default 是用于 CPU 密集型任务的调度器,Dispatchers.Unconfined 是一个特殊的调度器,它没有特定的线程,会在当前线程立即执行协程,如果协程中有挂起点,它会在恢复时继续在其他合适的线程执行。
总的来说,协程既可以在单线程中并发运行,也可以在多线程中运行,取决于你的需求和使用的调度器。但是,与线程相比,协程更轻量级,可以创建成千上万个而不会对性能造成大的影响。
来例子啊
在单线程内并发运行多个协程
这个例子中,我们在主线程中启动了两个协程,它们会并发执行,但都在同一个线程内。
在多线程之间切换协程:
这个例子中,我们首先在主线程中启动了一个协程,然后使用withContext(Dispatchers.IO) 切换到了 IO 线程,然后又回到了主线程。我们可以在日志中看到协程在不同的线程之间切换。
Kotlin+协程已经让我们在网络编程中体会到了它的过人之处。为了能让大家能够顺畅的使用Kotlin语言,这为大家准备了《Kotlin开发学习指南》的核心笔记: qr18.cn/CdjtAF
Android Kotlin 学习指南
概述
Kotlin 基础包括操作、编码习惯与习惯用法
基础部分: qr18.cn/CdjtAF
类与对象
函数与 Lambda 表达式: qr18.cn/CdjtAF
4. 安卓开发需要学习什么
学习分三个阶段:
1,Android基础阶段:平台架构特性(JAVA/C) Market/应用程序组件 环境搭建与部署/打包与发布 AVD/DDMS/AAPT 调试与测试 相关资源访问/资源制作 Activity/Service/Broadcast Receiver/Content Provider/原理(生命周期)及深层实现
2,Android进阶初级:组件Widget/ 菜单Menu/ 布局Layout 详解 Xml解析(Pull/Dom/Sax)/JNI 解析SQL数据库原理,。
SQLite /SharedPreferences/File详解 多媒体Audio/Video/Camera 详解
3,Android进阶高级:蓝牙/WIFI SMS/MMS 应用实现 深层次解析GPS原理。
实现LocationManager/LocationProvider 进行定位/跟踪/查找/趋近警告以及Geocoder正逆向编解码等技术细节 2D图形库(Graphics/View)详解 SDCARD/传感器/手势 应用实现
(4)安卓哪个框架有用线程池扩展阅读:
知识体系
1、Unix/Linux平台技术:基本命令,Linux下的开发环境
2、企业级数据库技术:SQL语言、SQL语句调优、Oracle数据库技术
3、Java 语言核心技术:Java语言基础、Java面向对象编程、JDK核心API、Java集合框架、Java网络编 程、JavaI/O编程、Java多线程编程、Java异常机制、Java安全、JDBC、XML
4、软件工程和设计模式:软件工程概述、配置管理及SVN、UML、基本设计模式
5、Android应用开发基础:Android开发平台、Eclipse+ADT开发环境、AVD及传感模拟器调试、Android核心组件、Android常用组件、Android高级组件、文件及网络访问、SQLite数据库编程、后台服务编程
6、互联网核心技术: HTML、CSS、JavaScript、JQuery、Ajax应用
7、Android高级应用开发:音频视频摄像头、互联网应用、GPS和位置服务、Google Map、2D3D绘制、传感器开发、游戏开发、电话及SMS服务、网络BluetoothWi-Fi等。
8、Android系统级开发:移植、驱动、NDK(C方向)。
9、JavaEE核心技术:Servlet核心技术、JSP核心技术、Struts、Spring、Hibernate框架。
5. 瀹夊崜锲涘ぇ缁勪欢鍙婂叾浣灭敤
瀹夊崜锲涘ぇ缁勪欢锛欰ctivity銆丼ervice銆丅roadcastReceiver鍜孋ontentProvider锛屼綔鐢锛
銆銆1銆丄ctivity缁勪欢镄勪富瑕佷綔鐢ㄦ槸灞旷ず涓涓鐣岄溃骞跺拰鐢ㄦ埛浜や簰锛屽畠镓婕旂殑鏄涓绉嶅墠鍙扮晫闱㈢殑瑙掕壊
銆銆Activity鏄涓绉嶅𪾢绀哄瀷缁勪欢锛屼富瑕佹槸钖戠敤鎴峰𪾢绀轰竴涓鐣岄溃锛屽苟涓斿彲浠ユ帴鏀剁敤鎴风殑杈揿叆淇℃伅浠庤屽拰鐢ㄦ埛杩涜屼氦浜掋傚圭敤鎴锋潵璇达纴Activity灏辨槸Android搴旂敤镄勫叏閮锛屽洜涓哄叾浠栦笁澶х粍浠跺圭敤鎴锋潵璇存槸涓嶅彲镒熺煡镄勚侫ctivity镄勫惎锷ㄧ敱Intent瑙﹀彂锛屽叾涓琏ntent鍒嗕负鏄惧纺钖锷ㄥ拰闅愬纺钖锷ㄣ
銆銆2銆丼ervice缁勪欢镄勪富瑕佷綔鐢ㄦ槸鍦ㄥ悗鍙版墽琛岃$畻浠诲姟锛屾墽琛屼换锷$殑缁撴灉鍙浠ュ拰澶栫晫杩涜岄氢俊
銆銆Service鏄涓绉嶈$畻鍨嬬粍浠讹纴鐢ㄤ簬鍦ㄥ悗鍙版墽琛屼竴绯诲垪璁$畻浠诲姟銆傜敱浜岙ervice缁勪欢宸ヤ綔鍦ㄥ悗鍙帮纴锲犳ょ敤鎴锋棤娉旷洿鎺ユ劅鐭ュ埌瀹幂殑瀛桦湪銆係ervice缁勪欢鍜孉ctivity缁勪欢涓嶅悓锛孉ctivity缁勪欢鍙链変竴绉嶈繍琛屾ā寮忥纴鍗矨ctivity澶勪簬钖锷ㄧ姸镐侊纴浣嗘槸Service缁勪欢鍗存湁涓ょ岖姸镐侊细钖锷ㄧ姸镐佸拰缁戝畾鐘舵併係ervice缁勪欢澶勪簬钖锷ㄧ姸镐佹椂锛屽畠镄勫唴閮ㄥ彲浠ユ墽琛屼竴浜涘悗鍙拌$畻锛屽苟涓斾笉闇瑕佸拰澶栫晫链夌洿鎺ョ殑浜や簰銆係ervice澶勪簬缁戝畾鐘舵侊纴Service鍐呴儴钖屾牱涔熷彲浠ユ墽琛屽悗鍙拌$畻锛屼絾鏄澶勪簬杩欑岖姸镐佺殑Service鍙浠ュ緢鏂逛究鍦板拰澶栫晫杩涜岄氢俊銆
銆銆3銆丅roadcastReceiver缁勪欢镄勪富瑕佷綔鐢ㄦ槸娑堟伅镄勪紶阃掞纴璇ユ秷鎭镄勪紶阃掑彲浠ュ湪搴旂敤鍐咃纴涔熷彲浠ュ湪搴旂敤涔嬮棿锛屽畠镄勮掕壊鏄涓涓娑堟伅镄勪紶阃掕
銆銆BroadcastReceiver鏄涓绉嶆秷鎭鍨嬬粍浠讹纴鐢ㄤ簬鍦ㄤ笉钖岀粍浠朵箖镊充笉钖屽簲鐢ㄤ箣闂翠紶阃掓秷鎭銆侭roadcastReceiver钖屾牱镞犳硶琚鐢ㄦ埛镓镒熺煡锛屽洜涓哄畠宸ヤ綔鍦ㄧ郴缁熷唴閮ㄣ侭roadcastReceiver涔熷彨锅氩箍鎾锛屽箍鎾镄勬敞鍐屾柟寮忔湁涓ょ嶏细闱欐佹敞鍐屽拰锷ㄦ佹敞鍐屻傞润镐佹敞鍐屾寚鍦ˋndroidManifest涓娉ㄥ唽骞挎挱锛岃繖绉嶅箍鎾鍦ㄥ簲鐢ㄥ畨瑁呮椂琚绯荤粺瑙f瀽锛屾ょ嶅舰寮忕殑骞挎挱涓嶉渶瑕佸簲鐢ㄥ惎锷ㄥ氨鍙浠ユ帴鏀跺埌鐩稿簲镄勫箍鎾銆傚姩镐佸箍鎾闇瑕侀氲繃Context.registerReceiver()𨱒ュ疄鐜帮纴骞朵笖鍦ㄤ笉闇瑕佺殑镞跺欓氲繃Context.unRegisterReceiver()瑙i櫎骞挎挱锛屾ょ嶅舰镐佺殑骞挎挱蹇呴’瑕佸簲鐢ㄥ惎锷ㄦ墠鑳芥敞鍐屽苟鎺ユ敹骞挎挱銆
銆銆4銆丆ontentProvider缁勪欢镄勪富瑕佷綔鐢ㄦ槸浣滀负涓涓骞冲彴锛屾彁渚涙暟鎹镄勫叡浜锛屽苟涓旀彁渚涙暟鎹镄勫炲垹鏀规煡锷熻兘銆备富瑕佸簲鐢ㄤ簬搴旂敤涔嬮棿镄勬暟鎹鍏变韩鍦烘櫙
銆銆ContentProvider鏄涓绉嶆暟鎹鍏变韩鍨嬬粍浠讹纴鐢ㄤ簬钖戝叾浠栫粍浠朵箖镊冲叾浠栧簲鐢ㄥ叡浜鏁版嵁銆傚悓镙风殑锛屽畠涔熸棤娉曡鐢ㄦ埛镓镒熺煡銆傚逛簬ContentProvider缁勪欢𨱒ヨ达纴瀹幂殑鍐呴儴闇瑕佸疄鐜板炲垹鏀规煡杩椤洓绉嶆搷浣溿傞渶瑕佹敞镒忕殑鏄锛孋ontentProvider鍐呴儴镄刣elete銆乽pdate鍜宷uery鏂规硶闇瑕佸勭悊濂界嚎绋嫔悓姝ワ纴锲犱负杩椤嚑涓鏂规硶閮芥槸鍦˙inder绾跨▼姹犱腑琚璋幂敤镄勚侰ontentProvider缁勪欢涓嶉渶瑕佹坠锷ㄥ仠姝銆
6. 结构型模式-安卓源码实战之的Proxy(代理)、Delegate(委托)
Proxy和Delegate的设计思想是相同的,可以一起讨论。前面是代理模式的简要介绍,后面是具体源码实战。
以下基础知识摘抄自《设计模式-可复用面向对象软件的基础》Proxy章节
为其他对象提供一种代理以控制对这个对象的访问
当创建某一具体对象RealSubject开销很大时,应该根据需要进行创建,当真正需要到这个RealSubject对象时在进行创建,此时就需要用到代理Proxy 。
例如需要在文档中嵌入 图形对象的文档编辑器功能 ,然而 创建图形文档编辑器的开销很大也不是每一个文档都需要用到图形文档编辑器 。所以我们使用另外一个对象(即图像Proxy) 代替 真正的图形文档编辑器。 Proxy可以代替一个图形文档编辑器,并且在真正需要的时候负责实例化这个图形文档编辑器对象。
只有当文档编辑器点击 图形文档编辑器 代理Proxy的图标以启动功能时,图形代理Proxy才创建真正的 图形文档编辑器 对象
上面说过,代理(委托)模式是为了避免直接创建开销大的资源而不使用,采用的一种代理模式以便于真正使用时在实例化。
在 PhoneWindowManager 中使用 KeyguardServiceDelegate 来代理 KeyguardService 的功能( KeyguardService 由 KeyguardServiceWrapper 包装器进行包装)
PhoneWindowManager 需要使用到 KeyguardService 的功能,但是在创建 PhoneWindowManager 时就实例化 KeyguardService 没必要且开销大,因为还没用到 KeyguardService 的功能。直接创建 KeyguardService 会浪费 binder线程池 资源,所以应该在需要使用的时候再创建,所以引入 KeyguardServiceDelegate 。
PhoneWindowManager 并没有直接创建 KeyguardService 对象,而是创建了代理对象 KeyguardServiceDelegate 。 后面 PhoneWindowManager 需要使用到 KeyguardService 的功能时,通过调用 KeyguardServiceDelegate.bindService 将 KeyguardService 的 binder 对象转化为 接口 封装到 KeyguardServiceWrapper 包装器,最后将 KeyguardServiceWrapper 赋值到 KeyguardServiceDelegate 的成员变量,完成整个代理模式的架构。
最终的方法调用流程:
PhoneWindowManager -> KeyguardServiceDelegate ->KeyguardServiceWrapper->KeyguardService
通过创建KeyguardServiceDelegate来避免直接创建KeyguardService而不使用带来不必要的开销。属于延迟加载。
[SystemServer.java]
众所周知SystemServer用来完成服务的创建和初始化过程。
一:WindowManagerService.main();启动了WMS,可以看到new PhoneWindowManager()传入WMS的main方法中,它将被赋值到成员变量WindowManagerPolicy mPolicy;
二:wm.onInitReady();调用WMS的init方法,这里是KeyguardServiceDelegate的创建流程
[WindowManagerService.java]
[WindowManagerService.java]
调用PhoneWindowManager.init方法
[PhoneWindowManager.java]
这里可以看到,在PhoneWindowManager.init函数中并没有直接创建KeyguardService对象,而是创建了代理对象KeyguardServiceDelegate。在后面需要使用到KeyguardService的功能时,通过调用KeyguardServiceDelegate.bindService将KeyguardService的binder对象转化为接口封装到KeyguardServiceWrapper包装器,最后将包装器赋值给KeyguardServiceDelegate的成员变量
[KeyguardServiceDelegate.java]
[SystemServer.java]
[SystemServer.java]
[WindowManagerService.java]
mPolicy指的是WindowManagerPolicy。而PhoneWindowManager实现了WindowManagerPolicy接口。mPolicy的赋值在WMS的构造函数中就已经完成了。而WMS的启动在systemServer中。
[PhoneWindowManager.java]
[PhoneWindowManager.java]
[PhoneWindowManager.java]
调用context.bindServiceAsUser(...)来绑定服务,重点关注以下几点
通过指定ComponentName来绑定服务。可以看到KeyguardServiceDelegate所在包名为
/frameworks/base/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
寻找resources.getString(com.android.internal.R.string.config_keyguardComponent)的定义位置
[/frameworks/base/core/res/res/values/config.xml]
可以看到config_keyguardComponent对应启动的就是 KeyguardService 这个服务。通过 ServiceConnection 去指定拿到 KeyguardService 后,将 KeyguardService 转换为接口对象 IKeyguardService.Stub.asInterface(service) 来创建 KeyguardServiceWrapper 对象。看一看 KeyguardServiceWrapper 的创建过程
[KeyguardServiceWrapper.java]
可以看到将IKeyguardService service传递给了成员变量mService
ServiceConnection mKeyguardConnection 里通过 KeyguardService 的创建了代理对象 KeyguardServiceWrapper 。
后续当需要使用到 KeyguardService 功能是将是以下的调用过程
PhoneWindowManager -> KeyguardServiceDelegate ->KeyguardServiceWrapper->KeyguardService