谷歌提供的安卓生态有两部分,一部分是开源操作系统(Android Open Source Project,AOSP),即基于AOSP Apache 2.0开源协议提供的完整版操作系统; 第二部分是谷歌基于商业授权协议提供的...咱们用到的主要是第一部分开源操作系统。 这玩意开源,就是说任何人都可以免费使用; 而第二部分我们自己有(感谢腾讯和百度等公司),不用谷歌的,因此华为国内手机业务并不会受到影响。...华为靠着恐怖的基站建设能力,打入亚非拉市场; 靠着技术过硬、服务到位打入欧洲高端市场。 一路上踩倒的通路设备商不计其数,它们是瑞典的爱立信、芬兰的诺基亚、美国的思科、法国的阿尔卡特等等。...而且,消费者业务已经连续五年增长30%以上,2018年增速高达45.1%,在华为三大业务中增长最为迅猛。 ? 若海外市场失守的话,手机业务的营收可能陷入增长停滞或倒退的状况。...谷歌说了目前拥有谷歌应用程序的华为智能手机用户,只要能访问谷歌应用商店,就能继续使用和下载谷歌提供的应用程序更新。 所以应该也不受影响。
//所以使用IntentService时不需要额外新建线程 HandlerThread thread = new HandlerThread("IntentService[" + mName +...单独开启一个名为IntentService的线程 创建一个名叫ServiceHandler的内部Handler 把内部Handler与HandlerThread所对应的子线程进行绑定 通过onStartCommand...如果服务停止,会清除消息队列中的消息,后续的事件得不到执行。...内部采用了HandlerThread实现,作用类似于后台线程; 与后台线程相比,IntentService是一种后台服务,优势是:优先级高(不容易被系统杀死),从而保证任务的执行 对于后台线程,若进程中没有活动的四大组件...有兴趣可以继续关注Carson_Ho的安卓开发笔记 ---- 请帮顶或点赞评论!
); } 通过源码可以看到,IntentService在onCreate()方法中创建了一个HandlerThread,并为这个HandlerThread绑定了一个Handler(ServiceHandler...注:HandlerThread 是一种具有消息循环的线程,在其内部可以使用handler,其底层实现是内部创建了Looper的线程。...,当执行完onHandleIntent中的代码就会使用stopSelf(msg.arg1)尝试关闭Service。...,想比而言单纯的开启一个线程来执行后台任务,由于这个进程中没有活动的四大组件,所以非常容易被系统杀死。...其实在普通的Service中开启一个线程也能达到IntentService的效果,只是这样我们用起来更方便,那么在Service中开启线程或者使用IntentService相比在Activity中开启线程有什么优势呢
回到onCreate中,接下来的代码则是通过HandlerThread的looper创建了一个ServiceHandler,这是一个内部类,源码如下: private final class ServiceHandler...onHandleIntent,这样函数中的代码就在这个HandlerThread的子线程中运行。...然后执行了stopSelf函数,这个函数是Service的,用于停止服务的,与context的stopService效果是一样的。...但是注意,在onBind函数中并没有sendMessage,所以IntentService需要使用start的方式,bind的方式由于不会走onStart这个周期,所以onHandleIntent不会执行...总结 IntentService其实很简单,就是内部实现了一个使用Handler机制的子线程而已,但是它使用起来方便了很多。
SVG,即Scalable Vector Graphics 可伸缩矢量图形,这种图像格式在前端中已经使用的非常广泛了 SVG图片相对于一般的图片(png、jpg等),拥有占用体积小,支持等比例缩放不失真...中的SVG实现(并不是支持全部的SVG语法,现已支持的完全足够用了) Vector图像刚发布的时候,是只支持Android 5.0+的,自从AppCompat 23.2之后,Vector可以使用于Android...2.1以上的所有系统,只需要引用com.android.support:appcompat-v7:23.2.0以上的版本就可以了。...Vector 语法简介 通过使用它的Path标签,几乎可以实现SVG中的其它所有标签,虽然可能会复杂一点,但这些东西都是可以通过工具来完成的,所以,不用担心写起来会很复杂。...代替原来的android:src,代码里面使用无区别 2.2 Button 不支持app:srcCompat,支持Xml 中使用在Button的selector 2.3 RadioButton 直接使用
为了使用方便也是为了代码规范化,我们都将文字信息放在res-values-strings.xml中, 因为开发中需要用到将文字的换行,百度了一下,可以将文字段信息直接在strings.xml文件中换行...具体做法 属性\n攻击力+60点,并附带18\%%吸血效果\n\n使用\n3秒内普通攻击附带84\%%吸血效果,冷却时间50秒。... 我们看到其中\n就是换行符, 需要注意的是在文字段信息中,想要输出%号可不是直接打一个百分比号,否则会出现错误 1 Description Resource Path...Unexpected end tag string strings.xml /群雄/res/values line 16 Android AAPT Problem 出现这两种错误,正确的做法就是在想要输出的
IntentService 一、IntentService概述 上一篇我们聊到了HandlerThread,本篇我们就来看看HandlerThread在IntentService中的应用,看本篇前建议先看看上篇的...,不易被系统杀死(继承自Service的缘故),因此比较适合执行一些高优先级的异步任务 它内部通过HandlerThread和Handler实现异步操作 创建IntentService时,只需实现onHandleIntent...这里我们的案例主要利用onHandleIntent实现异步下载图片,然后通过回调监听的方法把下载完的bitmap放在message中回调给Activity(当然也可以使用广播完成),最后通过Handler...其实是不会的,因为IntentService真正执行异步任务的是HandlerThread+Handler,每次启动都会把下载图片的任务添加到依附的消息队列中,最后由HandlerThread+Handler...,而Looper是按顺序从消息队列中取任务的,也就是说IntentService的后台任务时顺序执行的,当有多个后台任务同时存在时,这些后台任务会按外部调用的顺序排队执行,我们前面的使用案例也很好说明了这点
线程中处理任务 任务完成后,会自动停止 可多次启动同一个IntentService,它们会自一个接一个地排队处理 IntentService 与 Service 耗时任务可以不用在Service中手动开启线程...IntentService 自动停止 参考IntentService源码: private volatile ServiceHandler mServiceHandler; private final...intent, int startId) { Message msg = mServiceHandler.obtainMessage(); msg.arg1 = startId; // 这个是停止服务的依据...onCreate方法中开启了一个HandlerThread来处理请求。 在onStart中获取到startId。...在ServiceHandler中每次处理完一个命令都会调用stopSelf(int startId)方法来停止服务。 IntentService直到命令队列中的所有命令被执行完后才会停止服务。
在开发安卓应用的过程中,我们经常需要这样的场景:希望APP在不影响当前用户的操作的前提下,在后台默默的做一些任务。比如:静默的下载文件或者上传数据。我们一般会考虑到新启一个线程去做异步的操作。.... 1.优点 本质上IntentService也是开了一个线程,但是IntentService是继承自Service的,所以根据Android系统Kill Application的机制,使用IntentService.... 2.正确使用的姿势 优点我们已经知道了,那该如何正确的使用呢?我们知道Service可以通过startService和bindService这两种方式启动。...private final class ServiceHandler extends Handler { 17 public ServiceHandler(Looper looper) {...并且通过源码我们知道,处理异步任务是在onHandleIntent中的。所以我们应该将任务逻辑放在onHandleIntent中处理。 . 3.应用 学以致用。
IntentService继承于Service,内部使用工作线程来处理请求的任务。 使用 Step1....,这是一个工作线程, // 因此使用IntentService,不用再额外创建子线程,就可以处理耗时任务 HandlerThread thread = new HandlerThread...的内部Handler; 将 ServiceHandler与 HandlerThread所对应的子线程进行绑定; 通过 onStartCommand()传递给服务的Intent,依次插入到工作队列中,并逐个发送给...使用场景 线程任务需要按顺序,在后台执行的使用场景,如:离线下载。 由于所有的任务都在一个Thread Looper里面来做,所以不适合多个数据同时请求的场景。...(对于后台线程,若进程中没有活动的四大组件,则该线程的优先级非常低,容易被系统杀死,无法保证任务的执行。)
线程是 CPU 调度的基本单位,进程是系统资源分配的基本单位。 进程独享内存资源,一个进程可以看作一个 JVM ,一个进程崩溃后,在保护模式下一般不会对其它进程产生影响。...后来 Google 又做了一些调整(任何事物都不完美),将线程池的容量与 CPU 的核心数联系起来,如目前 SDK 25 版本中,预定义的核心线程数量最少有 2 个,最多 4 个,线程池容量范围 5 ~...HandlerThread HandlerThread 可以看作在子线程中创建一个异步消息处理机制的简化版,HandlerThread 对象自动帮我们在工作线程里创建 Looper 对象和消息队列。...使用方法: mHandlerThread = new HandlerThread("MyHandlerThread"); mHandlerThread.start(); mHandler = new...,任务会被一次串行执行,执行结束后,服务停止; 多次启动 IntentService ,在所有任务执行结束之前,停止 IntentService ,服务停止,除了当前执行的任务外,后续的任务不会被执行
概述 线程分为主线程和子线程,主线程主要处理和界面相关的事情,而子线程则往往用于执行耗时的操作。在操作系统中,线程是操作系统调度的最小单元。...- AsyncTask封装了线程池和Handler,它主要方便开发者在子线程中更新UI。 - HandlerThread是一个具有消息循环的线程,在它的内部可以使用Handler。...- IntentService是一个服务,系统对它进行了封装使其可以更方便地使用后台任务,IntentService内部使用了HandlerThread来执行任务,当任务执行完毕之后IntentService...HandlerThread工作原理 HandlerThread继承了Thread,它是一种可以使用Handler的Thread,它的实现也是很简单,就是在run‘方法中通过Looper.prepare(...)来创建消息队列,并通过Looper.loop()来开启消息循环,这样在实际的使用中就允许HandlerThread中创建Handler了,HandlerThread的run方法如下所示: @Override
IntentService的Demo程序 IntentService常被用于处理异步任务,使用的步骤是,先继承IntentService,再在handleIntent方法里写业务逻辑。...super.onCreate(); // HandlerThread继承于Thread,可见这是一个子线程 HandlerThread thread = new HandlerThread...由于这里的HandlerThread是Thread的子类,它的Looper是子线程的Looper,这样ServiceHandler的构造方法传入的是子线程的Looper,所以ServerHandler的...然后发送到ServiceHandler对象中。...onCreate()方法,创建 HandlerThread对象,创建在子线程中执行的ServiceHandler,调用了startService(intent)则会执行到onStartCommand()
前言 多线程的应用在Android开发中是非常常见的,常用方法主要有: 继承Thread类 实现Runnable接口 AsyncTask Handler HandlerThread IntentService...的原理及源码分析 Android多线程:HandlerThread使用教程(含实例讲解) Android多线程:HandlerThread原理及源码分析 Android多线程:IntentService...: 通过HandlerThread 单独开启1个工作线程:IntentService 创建1个内部 Handler :ServiceHandler 绑定 ServiceHandler 与 IntentService...3, 所以,多次启动 IntentService 会按顺序执行事件 若服务停止,则会清除消息队列中的消息,后续的事件不执行 注意事项2:不建议通过 bindService() 启动 IntentService...:AsyncTask的原理及源码分析 Android多线程:HandlerThread使用教程(含实例讲解) Android多线程:HandlerThread的原理及源码分析 Android多线程
IntentService可以用于执行后台耗时的任务,当任务执行后会自动停止,IntentService的优先级比一般的线程高,比较适合执行一些优先级高的后台任务。...轮询框架实现 要实现轮询,可以借鉴Handler中的looper机制,如下图,维护一个消息队列,循环的从消息队列中取出消息来执行,轮询框架可以定时的向消息队列中加入消息,然后循环中消息队列中取出消息执行...可以自己实现一个Looper,但是IntentService中已经包含了一个Looper和一个HandlerThread。因此轮询框架中使用IntentService作为循环框架。...PollingUtil 用于控制轮询服务的开始和结束 使用PollingUtil中的startPollingService来根据action和context生成一个PendingIntent,并将PendingIntent...其中mServiceHandler.sendMessage(msg)中的msg都会放到mServiceLooper,执行时从mServiceLooper中取出执行,其中ServiceHandler 的代码如下
由于是一个 Service,IntentService 的优先级比较高,在后台不会轻易被系统杀死;它可以接收 Intent 请求,然后在子线程中按顺序执行。...(); //拿到 HandlerThread 中的 Looper,然后创建一个子线程中的 Handler mServiceLooper = thread.getLooper...默认的工作线程 使用 HandlerThread 的 Looper 创建了一个 Handler,这个 Handler 执行在子线程 在 onStartCommand() 中调用 onStart(),然后在...中根据消息类型进行相应处理 可以看到,调用方的代码和上一篇使用 HandlerThread 的方法很相似。...使用 IntentService 显著简化了启动服务的实现,如果您决定还重写其他回调方法(如 onCreate()、onStartCommand() 或 onDestroy()),请确保调用超类实现,以便
在调用这个 api 之后应马上调用 Service#startForeground(int, Notification),来设置 Notification,否则系统会自动停止 Service,并发生 ANR...,然而在实际使用的时候,通常会两个结合使用,也或者是多个 activity 对同一个 service 绑定。...我们今天在看一下它的原理: IntentService 内部由 HandlerThread 维护一个线程,在启动后获取 intent 并发送给 HandlerThread 所在的线程执行,执行完任务后自动调用...总结起来两句代码,大致如下: new HandlerThread().start(); new ServiceHandler(thread.getLooper()); onStart(): 这个函数中...ServiceHandler 的 handleMessage 函数实现中,先执行抽象函数 onHandleIntent,此函数中即是我们想要在 IntentService 中执行的任务。
如: public void run() { /** * 耗时的代码在子线程里面写 */ stopSelf(); } 或者在代码里的某个地方调用stopService...首先,我们省去了在 Service 中手动开线程的麻烦,第二,当操作完成时,我们不用手动停止 Service。...为什么多次启动 IntentService 会顺序执行事件,停止服务后,后续的事件得不到执行?...Handler、Looper、MessageQueue 机制把消息发送到线程中去执行的,所以多次启动 IntentService 不会重新创建新的服务和新的线程,只是把消息加入消息队列中等待执行,而如果服务停止...,会清除消息队列中的消息,后续的事件得不到执行。
领取专属 10元无门槛券
手把手带您无忧上云