1.生命周期

关于生命周期,在详细讲解下:

上图是从android官网获取的生命周期。

正常的流程,很多文章都讨论过了,我们讨论几个特殊的情况。

1)OnResume->OnPause->OnResume 我们看这段解释:The activity is no longer visible。

也就是说在onpause阶段,activity还是可见的,but,它不在最上面,这种情况一般情况下,就是在activity页面弹一个dialog。

测试:亲测,android5.1 onpause不会走到。

还有一种说法是,有一个半透明的activity覆盖了activityA,activityA就会走到onPause,但不会onStop。

在android 5.1 上,还是会走到onStop。

我自己发现了一种可以的case:

ActivityA->ActivityB, ActivityB 的theme是@android:style/Theme.Dialog

这个时候ActivityA是onPause,but不会进入onStop。

2)App process killed

If an activity is paused or stopped, the system can drop the activity from memory by either asking it to finish, 
or simply killing its process. When it is displayed again to the user, it must be completely restarted and restored to its previous state.

上面代码解释了,当app处于onpause/onStop状态时,如果系统内存不足,该activity就会被回收,恢复的时候将需要从onCreate从新开始走。

protected void onCreate(@Nullable Bundle savedInstanceState)

所以说判断activity是否是首次创建,通过Bundle参数是否为null可以来判断。

当然,activity的内容已被回收,需要考虑如何恢复场景。

这里暂时先保留一个疑问:这个savedInstanceState是存在哪里的,为什么可以被重现?

关于onSavedInstanceState的说明:

这个方法不属于生命周期的概念,所以它与OnPause没有先后之分,并且它并不一定会被调用。

而该函数的目的,是为了在activity被回收的时候,有一个保存状态的地方。

如果app没有被回收,onRestoreInstanceState & onCreate也不会从新被走到。

这里会有个问题,这2个方法的bundle参数是一样的吗?

是的,它们是一份内容。onRestoreInstanceState 只是在onCreate的时机不是特别好做状态还原的时候,提供一次机会,在初始化结束的时候

回复状态。

onRestoreInstanceState 只有在activity重新init的时候,才会被调到。

This method is called between {@link #onStart} and
* {@link #onPostCreate}.

onPostCreate是Activity创建过程的最后一步,一般app不需要重载该方法。

另:系统会自动保存view的状态在savedInstanceState的时候。

关于saveInstanceState也是在mainthread里面执行回调的。

3)onDestory回收资源

在onDestory回收资源不一定是比较好的办法。应为onDestory可能不会被走到。一个可行的方式是自己管理资源的回收,而不依赖与生命周期。

2.Configuration Changes

配置变化,包括screen方向,语言

such as a change in screen orientation, language, input devices, etc

这些改变,android希望由程序员自己来handler,所以如果没有做任何配置,activity会被重新创建。

fulmath.samples I/MainActivity: onDestroy: com.joyfulmath.samples.MainActivity@c4f7c4d [at (MainActivity.java:74)]
10-09 06:39:35.951 3889-3889/com.joyfulmath.samples I/MainActivity: onCreate: com.joyfulmath.samples.MainActivity@28808a14 [at (MainActivity.java:27)]
10-09 06:39:35.951 3889-3889/com.joyfulmath.samples I/MainActivity: onCreate: 2 [at (MainActivity.java:31)]

但是saveInstanceState会被保存下来,这从另一个方面证明,这个bundle不是存在activity里面的。

亲测:language和screen orientation的改变,都会创建新的activity实例。

关于这块的详细说明android官方文档有解释:

https://developer.android.com/guide/topics/manifest/activity-element.html#config

我就不在复述了。

关于语言的监听需要从local + layoutdirection来同时设置。android:configChanges

从实际使用场景来说,屏幕方向的改变是最有可能会遇到的。orientation+screenSize需要配置在manifest中。

3.permission

关于APK之间的activity相互调用,一共有三种方式:
具体可参考http://www.cnblogs.com/winxiang/archive/2012/05/04/2482883.html

但是第一种方式是无法阻止的。就像service & contentprovider一样,可以使用permission来控制访问权限。

我们可以自定义permission,并且由activity使用。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.joyfulmath.samples">
<permission
android:name="com.joyfulmath.samples.permission.ACCESS"
android:label="Samples custome permission"
android:protectionLevel="dangerous" >
</permission>

<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:configChanges="orientation|screenSize|locale|keyboardHidden|layoutDirection">
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".basecontrol.ActivitySamples_"
android:permission="com.joyfulmath.samples.permission.ACCESS"

>
<intent-filter>
<action android:name="find.samples"></action>
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
</activity>
</application>
<!--android:theme="@android:style/Theme.Dialog"--> </manifest>

上面是一个简单的permission的使用。

permission的目的是为了阻止其他apk对该activity的任意访问,所以同一个apk内,就没有这个概念。包括explored属性是一样的。

4.Process Lifecycle

系统会尽可能的保存process的存活,但是如果一定要回收process的话,会有一个优先级来管理。

前台进程

进程持有一个与用户交互的activity

进程持有一个service,该service同某个用户交互的activity绑定。该service是setforeground。该service正在进行生命周期回调。

进程持有一个boradcast,该broadcast在进行onreceiver。

kill前台进程需要用户交互。

可见进程

进程持有一个可见,但不在前台的activity,进入onpause,but没有进入onstop。

进程持有一个可见service,该service和可见activity在交互。

服务进程

进程持有一个不属于上面2种情况的service,也就是startservice的情况。

后台进程

后台进程通常就是不属于上面3种情况下,对应activity就是在onstop状态。

通常会有很多后台进程在运行,系统会有一个LRU表来管理,而最远的process将会优先被kill掉。

空进程

只是系统缓存,目的为了加快进程组件的加载。

Android 四大组件之Activity(续2)的更多相关文章

  1. Android四大组件之Activity(活动)及其布局的创建与加载布局

    Android四大组件之Activity(活动)及其布局的创建与加载布局 什么是Activity ? 活动(Activity)是包含用户界面的组件,主要用于和用户进行交互的,一个应用程序中可以包含零个 ...

  2. Android四大组件之——Activity的生命周期(图文详解)

        转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com       [Andro ...

  3. Android四大组件之——Activity的开启:StartActivity()和StartActivityForResult()(图文详解)

                如需转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com   ...

  4. 【Android开发日记】之入门篇(四)——Android四大组件之Activity

    在Android中,无论是开发者还是用户,接触最多的就算是Activity.它是Android中最复杂.最核心的组件.Activity组件是负责与用户进行交互的组件,它的设计理念在很多方面都和Web页 ...

  5. Android四大组件及activity的四大启动模式

    Android四大组件 1. 广播接收者的两种类型: (1)系统广播接收者,就是继承BroadcastReceiver这个类,然后还要在清单文件中注册,注册之后给他一个action.当系统发生了这个a ...

  6. Android四大组件之——Activity(一)定义、状态和后退栈(图文详解)

    什么是Activity 关键字:应用组件.四大组件.用户界面,交互. An Activity is an application component that provides a screen wi ...

  7. Android 四大组件之 Activity(二)

    1.综述 Activity是Android四大组件(Application Components)之一,简单来说Activity就是平常所见到的用户界面,一般情况下,一个Activity所占的窗口是满 ...

  8. Android 四大组件之 Activity

    1 简介 Activity (活动) 即应用程序 显示的 界面.可以通过两种方式 设置显示的内容 1:纯代码方式 2:xml 布局方式 无论哪一种方式,都是通过 setContentView 来设置显 ...

  9. Android 四大组件之 Activity(一)

    1.Activity的定义及作用: Android系统中的四大组件之一,可以用于显示View.Activity是一个与用户交互的系统模块,几乎所有的Activity都是和用户进行交互的一个应用程序的组 ...

随机推荐

  1. Objective-C中的集合类

    下面详细的介绍Objective-C中的集合类以及每个集合类的用法,学过其他面向对象编程语言的小伙伴们看到OC的集合类会有种莫名的亲切感,理解起来问题不大,可以类比Java中的集合类去学习. 在Obj ...

  2. 关于近段时间论坛型APP 的一段舍弃

    一直以为缓存务必要做的很好,好到什么程度呢,我曾这样想,用户在下滑数刷新的时候也要做到,先加载久缓存再加载新的,同时只改变旧的某些项.这样的想法真的很好!好到我花费了三天去设计数据库和服务器的 php ...

  3. swift 中单例的写法

    在swift中单例的写法和oc的有所不同,在书写的时候又分很多种写法,,如果一个.swift 文件只创建了一个类,可以用那种dispatch_once的写法,如果一个.swift文件中有很多类的存在, ...

  4. Windows 10 技术预览版9926 “未知源”引起系统休眠后自启的解决办法

    问题的由来: 自从安装上了最新发布的Windows 10 ,使用起来有诸多的改进:无论是重绘的图标还是通知消息中心的整合还是更智能的OneDrive客户端都使得工作起来非常愉悦. 不过笔者这两天频繁遇 ...

  5. 【Kylin实战】邮件报表生成

    在cube build完成后,我的工作是写sql生成数据分析邮件报表.但是,问题是这种重复劳动效率低.易出错.浪费时间.还好Kylin提供RESTful API,可以将这种数据分析需求转换成HTTP请 ...

  6. SQL Server中smalldatetime的日期范围为何是[1900-01-01,2079-06-06]

    本文目录列表: 1.SQL Server中的基准日期 2.smalldatetime的日期范围 3.smalldatetime的日期范围和无符号2字节整数的关系 4.总结语 5.参考清单列表   SQ ...

  7. 7.3 数据注解特性之ConcurrencyCheck特性【Code-First系列】

    ConcurrencyCheck特性可以应用到领域类的属性中.当EF执行更新操作的时候,Code-First将列的值放在where条件语句中,你可以使用这个CurrencyCheck特性,使用已经存在 ...

  8. 那些年用过的xUnit.net的简单用法

    0x01 前言 单元测试,总是伴随着我们的开发过程,优劣自行google.当然呢,不排除有些公司是不做单元测试的, 但是呢,学多一点东西用来防身还是可以的. 0x02 简单的Demo 写个两数求和的方 ...

  9. 艾伦 Visual Studio 批量自动化代码操作工具-VS插件发布

    艾伦 Visual Studio 批量自动化代码操作工具 以下简称--艾伦工具箱. 艾伦工具箱是一个多文件批量处理插件,目的是为了广大开发者提高开发效率,减少项目代码规范化审计,缩短开发者的项目开发周 ...

  10. 记安装EP时在指定BCP账户信息时提示AOS无法访问的解决方法

    因为卡在这个问题上好久,外加同事也有遇到,因此记下来! 环境:Windows Server 2012 R2 Standard + Dynamics AX 2012 R2 + SharePoint 20 ...