分类:C#、Android、VS2015;

创建日期:2016-02-29

一、简介

Android的活动(Activities)可以有多种状态,具体取决于用户的行为以及对操作系统的要求。虽然Activity的生命周期会随着状态的变化而改变,比如创建活动、转入后台、转到前台、销毁活动等,但是,实际上Acivity并不能在后台做任何实质性的UI交互处理。由于这个原因,Android才将在后台运行的进程称为Service,其本质含义就是:Service是独立运行的类的实例,它和Activity的生命周期并没有直接的关系。此外,在活动的生命周期期间,设计良好的应用程序不应该独占资源或导致应用程序崩溃。

1、后台任务(Backgrounding)

Android在后台处理的那些事(Backgrounding)实际上是前台应用程序和后台服务(Service)之间一种折中的解决办法,换言之,通过Backgrounding可以让设备资源不会消耗太快同时又能尽量响应前台的请求。

从功能上来说,Android应用程序中的后台任务(Backgrounding)非常类似于桌面应用程序的多任务,但它和桌面应用的多任务并不是一个概念。桌面计算机一般都有应用程序可用的多种资源,如大屏幕、电源、内存、各种外存等,因此这些应用程序可以一个接一个地排列显示在屏幕上同时运行,而且都能保持高性能。但是,移动应用程序的资源极其有限,很难在那么小的屏幕上同时显示多个高速运行的应用程序,因为真要这样做的话,手机电池的电量很快就会耗尽。

处于后台状态下的Activity实际上是不能执行任何操作的,因此它又提供了一个Android专用的Service的概念(Android Service)。之所以这样做,就是为了在Android App中启用后台处理,即通过提供调用应用程序组件的方式来实现Android Service。

Android Service通常仍属于所创建的应用程序的一部分,但他们在自己的生命周期中独立运行,与Activity的生命周期无关。这意味着即便用户将应用程序转入后台,服务仍然可以继续执行,甚至在操作系统停止或已销毁了所有应用程序活动的情况下,服务也照样可以继续执行。

对于后台运行的活动(Activities)来说,Android和iOS的处理方式是不同的。在Android系统中,Activities是用转入、转出后台的状态来体现的,这些状态是Activity生命周期的一部分。而iOS处理的办法则是将没有运行的活动直接转入到后台,同时,为了节省系统资源,转入到后台后不久就会停止它,即不再允许这些转入后台的活动运行任务。

下面的概览图列出了在Android App中哪些情况下应该使用哪种后台技术,请仔细研究这个图,它能帮你快速理解相关的概念和需要采用的技术。

2、前台任务(Forgrounding)

前台任务(Forgrounding)是指在Android在前台处理那些经常会被用户关注的后台Service,这些Service的特点是:内存过低时它不会自动成为被杀死的对象。前台任务必须向用户提供一个通知,而且只有在后台服务被终止或从前台任务中被移除之后,此通知才能消失。

例如,用后台服务来播放音乐的播放器就应该将其作为前台任务来处理,因为这能让用户通过前台通知(Notification)清楚地知晓后台服务的运行情况。在前台任务中,通知可能会标明当前正在播放的歌曲,并允许用户启动一个activity来与播放器进行交互。

要把你的后台服务作为前台任务来处理(这个任务就是在前台利用通知告诉用户正在运行的后台服务当前的情况),可以调用StartForeground()方法。此方法至少有两个参数:一个是通知的标识号(整数值),另一个是提供通知的Notification对象。另外还可以在这个方法中再添加更多的参数,比如,你可以每过1秒就告诉用户一次,也可以过1分钟才告诉用户一次。

要移除前台任务,请调用StopForeground()方法,这个方法接受一个布尔型参数,表示是否同时移除通知。此方法不会终止后台服务。不过,如果后台服务被你显式终止了,那么通知也会同时被移除。

注意:StartForeground()和StopForeground()方法是自Android 2.0 (API Level 5)开始引入的。 要让后台服务能在更早版本的平台上作为前台任务来处理,你必须使用以前提供的SetForeground()方法而不是StartForeground()方法。

【Android】15.1 后台任务和前台任务的更多相关文章

  1. 优化 Android 线程和后台任务开发

    在 Android 开发中,你不应该做任何阻碍主线程的事情.但这究竟意味着什么呢?在这次海湾 Android 开发者大会讲座中,Ari Lacenski 认为对于长时间运行或潜在的复杂任务要特别小心. ...

  2. Android开发_后台任务task管理_allowTaskReparenting alwaysRetainTaskState clearTaskOn

    1.android:allowTaskReparenting 这个属性用来标记一个Activity实例在当前应用退居后台后,是否能从启动它的那个task移动到有共同affinity的task,“tru ...

  3. android 15 activity跳转

    从一个屏幕跳到另一个屏幕,一个activity跳转到另一个activity,Intent类用于组件之间传递数据和跳转,组件包括不仅activity. package com.sxt.day04_01; ...

  4. Android开发艺术2之Activity的启动模式

    Activity是Android的四大组件之一,他的重要性毋庸置疑,对于这么重要的一个组件,我们首先要知道这些都是由系统进行管理和回调的,要理解Activity的启动模式,我们首先来了解一下Andro ...

  5. 我所理解的Android 启动模式

    首先,这是从 一个开源网站转载的,觉得写得不错,对我们之前理解的activity的启动模式是一个新的理解方式,并给出实际的应用场景. 任务栈是什么 任务栈Task,是一种用来放置Activity实例的 ...

  6. Android优化—— Google 发布 Android 性能优化典范

    阅读目录 0)Render Performance 1)Understanding Overdraw 2)Understanding VSYNC 3)Tool:Profile GPU Renderin ...

  7. 【转】Android Canvas绘图详解(图文)

    转自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1212/703.html Android Canvas绘图详解(图文) 泡 ...

  8. Android系统启动过程-uBoot+Kernel+Android

    摘要:本文是参考大量网上资源在结合自己查看源代码总结出来的,让自己同时也让大家加深对Android系统启动过程有一个更加深入的了解!再次强调,本文的大多数功劳应归功于那些原创者们,同时一些必要的参考链 ...

  9. Android架构分析之使用自定义硬件抽象层(HAL)模块

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本:2.3.7_r1 Linux内核版本:android-goldfish-2.6.29 在上一篇博 ...

随机推荐

  1. Ping用法大全

              Ping是典型的网络工具.Ping可以辨别网络功能的某些状态. 这些网络功能的状态是日常网络故障诊断的基础.特别是Ping可以识别连接的二进制状态(也就是是否连通).可是,这仅仅是 ...

  2. 深入解析OkHttp3

    OkHttp是一个精巧的网络请求库,有如下特性: 
1)支持http2,对一台机器的所有请求共享同一个socket 
2)内置连接池,支持连接复用,减少延迟 
3)支持透明的gzip压缩响应体 
4) ...

  3. web.xml加载顺序 [转载]

    一 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Ser ...

  4. KB/KiB,MB/MiB,GB/GiB了解一下

    Kibibyte是一种资讯计量单位,代表1024字节,即210字节,一般简称为KiB.Kibibyte是来自英文 kilo binary byte 的缩写,意思为“千位二进制字节”. 而KB是kilo ...

  5. iOS:沙盒、偏好设置、归档、解归档

    一.沙盒和应用程序包 •iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被称为沙盒 •iOS常用目录: –Bundle –Documents –Library/Ca ...

  6. [置顶] OpenJDK源码研究笔记(九)-可恨却又可亲的的异常(NullPointerException)

    可恨的异常 程序开发过程中,最讨厌异常了. 异常代表着程序出了问题,一旦出现,控制台会出现一屏又一屏的堆栈错误信息. 看着就让人心烦. 对于一个新人来讲,遇到异常经常会压力大,手忙脚乱,心生畏惧. 可 ...

  7. javascript数组去重的4个方法(转)

    原文地址:http://blog.csdn.net/chengxuyuan20100425/article/details/8497277 面试前端必须准备的一个问题:怎样去掉Javascript的A ...

  8. Mapper 与 Reducer 解析

    1 . 旧版 API 的 Mapper/Reducer 解析 Mapper/Reducer 中封装了应用程序的数据处理逻辑.为了简化接口,MapReduce 要求所有存储在底层分布式文件系统上的数据均 ...

  9. (剑指Offer)面试题48:不能被继承的类

    题目: 写一个不能被继承的类 思路: 1.把构造函数设为私有函数 在C++中子类的构造函数会自动调用父类的构造函数,子类的析构函数也会自动调用父类的构造函数,要想一个类不能被继承,只要把它的构造函数和 ...

  10. STL - vector algorithm

    // create vector with elements from 1 to 6 in arbitrary order vector<, , , , , }; // find and pri ...