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。
生命周期
看图的右侧,是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管理系统
- Android学习一(Activity笔记)
- Android Activity学习笔记(一)
- Android学习笔记(一)之Activity
- Android学习笔记(一)Activity
- Android学习笔记一:两个Activity通信
- Android学习笔记----Activity
- android学习Activity笔记
- Android学习笔记-Activity
- Android 学习笔记--Activity
- developer.android.com学习笔记Activity篇(一)
- Android学习笔记(一)——Activity
- Activity 生命周期(一)-- MarsChen Android 开发教程学习笔记
- Android学习笔记(一):创建一个Activity
- Android学习笔记之----Activity(一)生命周期
- 第一行代码Android学习笔记(一)activity
- Android学习笔记(一)——Activity基础知识
- android学习笔记(一)四大组件activity详解
- android学习笔记(一)四大组件activity详解
- POJ 2686 (状态转移dp)
- 去掉Bosch 物联网开发平台 XDK类eclipse 的控制台数据最大行数限制
- java基本树型结构实现
- Vue 2.0初学后个人总结及分享
- 剑指offer-数字在排序数组中出现的次数
- Android Activity学习笔记(一)
- Java中的垃圾回收
- linux脚本安装包
- EMACScript6之-----------------------类calss//modal
- mybatis简介
- 几种垃圾回收器的原理
- Java 账户 ,存款、取款
- 子沐课堂——分析一波Python就业前景
- Altium Designer 使用技巧备忘