Android Activity学习笔记(一)

来源:互联网 发布:echart 数据加载不合并 编辑:程序博客网 时间:2024/05/20 11:50

Android中的Activity,相信大家都很熟悉了。今天我准备参考一些前辈的文章并结合自己的学习来做一个笔记,对Android中的Activity进行学习。

AppCompatActivity和Activity

我目前用的项目里,代码如下:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

AppCompatActivity和直接继承Activity的区别是什么呢:

AppCompatActivity在v7包下,我们现在在Android Studio创建一个Activity默认继承的会是AppCompatActivity。
AppCompatActivity如下:

public class AppCompatActivity extends FragmentActivity implements AppCompatCallback,        TaskStackBuilder.SupportParentable, ActionBarDrawerToggle.DelegateProvider {

然后从FragmentActivity开始,一直继承如下:
这里写图片描述
AppCompatActivity最终继承的也是Activity,它应该相较于Activity实现了更多的东西。
AppCompatActivity从5.0版本开始提供。
AppCompatActivity有更为丰富的Toolbar操作,详见AppCompatActivity。

生命周期

https://github.com/xxv/android-lifecycle
看图的右侧,是Android Activity的生命周期。
比较简洁的流程是:

onCreate->onStart->onResume->onPause->onStop->onDestroy

onPause()和onStop()区别

打开了一个新的Activity,前者是旧Activity还可见的状态;后者是旧Activity已经不可见。

onSaveInstanceState和onRestoreInstanceState

onSaveInstanceState在onPause和onStop之间执行。
onRestoreInstanceState在onStart和onResume之前执行。
可能在我这篇文文章里有用武之地:android里单例对象和某些数据被释放的问题

底下几种情形会触发:
- 点击home键回到主页或长按后选择运行其他程序
- 按下电源键关闭屏幕
- 启动新的Activity
- 横竖屏切换时,肯定会执行,因为横竖屏切换的时候会先销毁Activity,然后再重新创建 重要原则:当系统”未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用, 这是系统的责任,因为它必须要提供一个机会让你保存你的数据
而后一个方法,和onCreate同样可以从取出前者保存的数据: 一般是在onStart()和onResume()之间执行。 之所以有两个可以获取到保存数据的方法,是为了避免Activity跳转而没有关闭, 然后不走onCreate()方法,而你又想取出保存数据。

Activity启动模式

看我之前转载的一篇文章:Activity启动模式,的概念很重要。

  • standard:Activity的默认加载方法,即使某个Activity在Task栈中已经存在,另一个activity通过Intent跳转到该activity,同样会新创建一个实例压入栈中。例如:现在栈的情况为:A B C D,在D这个Activity中通过Intent跳转到D,那么现在的栈情况为:
    A B C D D 。此时如果栈顶的D通过Intent跳转到B,则栈情况为:A B C D D B。此时如果依次按返回键,D D C B A将会依次弹出栈而显示在界面上。

  • singleTop:如果某个Activity的Launch mode设置成singleTop,那么当该Activity位于栈顶的时候,再通过Intent跳转到本身这个Activity,则将不会创建一个新的实例压入栈中。例如:现在栈的情况为:A B C D。D的Launch mode设置成了singleTop,那么在D中启动Intent跳转到D,那么将不会新创建一个D的实例压入栈中,此时栈的情况依然为:A B C D。但是如果此时B的模式也是singleTop,D跳转到B,那么则会新建一个B的实例压入栈中,因为此时B不是位于栈顶,此时栈的情况就变成了:A B C D B。

  • singleTask:如果某个Activity是singleTask模式,那么Task栈中将会只有一个该Activity的实例。例如:现在栈的情况为:A B C D。B的Launch mode为singleTask,此时D通过Intent跳转到B,则栈的情况变成了:A B。而C和D被弹出销毁了,也就是说位于B之上的实例都被销毁了。这个比如说我预约一件产品,App主页面就可以设置这个属性,把之前产品详情页就可以直接移除了。

-singleInstance:将Activity压入一个新建的任务栈中。例如:Task栈1的情况为:A B C。C通过Intent跳转到D,而D的Launch mode为singleInstance,则将会新建一个Task栈2。此时Task栈1的情况还是为:A B C。Task栈2的情况为:D。此时屏幕界面显示D的内容,如果这时D又通过Intent跳转到D,则Task栈2中也不会新建一个D的实例,所以两个栈的情况也不会变化。而如果D跳转到C,则栈1的情况变成了:A B C C,因为C的Launch mode为standard,此时如果再按返回键,则栈1变成:A B C。也就是说现在界面还显示C的内容,不是D(D可能回不去了)。

横竖屏切换与状态保存

横竖屏切换时Act走下述生命周期:
onPause-> onStop-> onDestory-> onCreate->onStart->onResume

状态保存如上~

Activity建立在哪些窗口组件之上

转自:http://www.cnblogs.com/lcw/p/3372914.html

这里写图片描述

上图可以看出系统进程和应用进程分别处理了哪部分。
ViewRoot是GUI管理系统与GUI呈现系统之间的桥梁,根据ViewRoot的定义,我们发现它并不是一个View类型,而是一个Handler。它向DecorView分发收到的用户发起的event事件,如按键,触屏,轨迹球等事件;与WindowManagerService交互,完成整个Activity的GUI的绘制。
在完成Activity的ContentView设置之后,下面的工作就是准备显示了,准备显示的主要工作就是建立起Application和WindowManagerService之间的联系,第一步的工作就是向WindowManager添加前面涉及到的DecorView,这个DecorView包含了整个Activity的GUI,所以我们只需要把这个DecorView交给WindowManager打理就可以了。

Activity的window和view系统的层级关系

这里写图片描述

  • PhoneWindow
      PhoneWindow是Android中的最基本的窗口系统,每个Activity 均会创建一个PhoneWindow对象,是Activity和整个View系统交互的接口。

  • DecorView
      DecorView是当前Activity所有View的祖先,它并不会向用户呈现任何东西。
      它主要有如下几个功能:

    • Dispatch ViewRoot分发来的key、touch、trackball等外部事件;
    • DecorView有一个直接的子View,我们称之为System Layout,这个View是从系统的Layout.xml中解析出的,它包含当前UI的风格,如是否带title、是否带process bar等。可以称这些属性为Window decorations。
    • 作为PhoneWindow与ViewRoot之间的桥梁,ViewRoot通过DecorView设置窗口属性。
  • System Layout
      目前android根据用户需求预设了几种UI 风格,通过PhoneWindow通过解析预置的layout.xml来获得包含有不同Window decorations的layout,我们称之为System Layout。
    预设风格可以通过PhoneWindow方法requestFeature()来设置,需要注意的是这个方法需要在setContentView()方法调用之前调用。例如我们调用getWindow().requestFeature(Window.FEATURE_NO_TITLE);就是设置没有标题。

  • Content Parent
      Content Parent这个ViewGroup对象才是真正的ContentView的parent,ContentView终于找到了寄主,它其实对应的是System Layout中的id为”content”的一个FrameLayout。这个FrameLayout对象包括的才是Activity的layout(每个System Layout都会有这么一个id为”content”的一个FrameLayout)。

  • Activity Layout
      这个ActivityLayout便是我们需要向窗口设置的ContentView,现在我们发现其实它的地位很低,同时这一部分才是和user交互的UI部分,其上的几层并不能响应并完成user输入所期望达到的目的(setContentView)。

AppCompatActivity
Activity初学乍练
2017 Android 面试题 [ 基础与细节 ]
【Android】窗口机制分析与UI管理系统

1 0