生命周期

        onCreate():activity进行创建,在该方法中应调用setContentView(),findViewById()以及获取要展示的数据的方法(如调用managerQuery()去查询数据库中将要展示的数据)。

        在该方法中可直接调用finish(),此时activity会马上运行onDestory(),中间的生命周期将不会被运行到。
        onStart():在onCreate()或onRestart()之后运行。此时activity处于前台(能够拦截全部用户的操作)。对用户不可见(类似于透明),且不能响应用户的操作

比如。在onResume()中Thread.sleep(5000)后再调用super.onResume(),那么从桌面上启动app时。显示的依然是桌面。但对桌面上的不论什么操作都无法得到响应。

因此,能够觉得activity对用户不可见(简单理解为透明的),且不能响应用户操作。

        onResume():onStart()之后运行。

此时activity对用户已经可见。而且能够响应用户操作

        onPause():activity已进入后台,但依然可见。

该方法中适合停止动画等很消耗cpu的操作。保存全局数据以及关闭独占资源(如相机等)

因为A启动B时,首先运行的是A中的onPause()方法,因此为了提高显示B界面的速度。onPause()中严禁运行耗时操作。

        onStop():当前activity对用户不可见时,运行该方法。
        onDestroy()为当前activity进行最后的清理工作,如关闭与当前activity关联的线程等。不能在该方法中保存数据。用户调用finish()或者系统为节约内存而临时清理掉activity实例时。会导致该方法被回调(可通过调用isFinishing()区分这两种情况)。

onSaveInstanceState()与onRestoreInstanceState()

        onSaveInstanceState():在onStop()之前调用。但与onPause()的顺序不固定。该activity可能会再次出现前台时才使用该方法保证数据。

如切换到桌面,启动还有一个activity,那么这个activity就有可能会再次出如今前台。所以为了安全,须要使用该方法保存数据。但返回时不会调用,比如从activity
B中返回activity A时,activity B中的该方法不会被调用。

        onSaveInstanceState()中的參数会在activity重建时传递到onCreate()和onRestoreInstanceState()中。

        onRestoreInstanceState():用于恢复onSaveInstanceState()保存的状态,在onStart()之后运行。

可是一般的恢复状态在onCreate()中进行,该方法仅仅是用于子activity进行个性化恢复。而且onCreate中须要推断參数是否为null。但onRestoreInstanceState()中不须要进行推断。

        在默认情况下,这两个方法会自己主动保存并恢复View的状态(每个View中都有onSaveInstanceState()与onRestoreInstanceState()),如Edittext中用户输入的文字。ListView滚动的位置等。

onPause()与onSaveInstanceState()

        因为在内存紧张时。系统会关闭处于pause状态的activity,因此应该在onPause()中保存一些全局数据(如内容提供者,文件等)。
        onSaveInstanceState()却是适合用于保存activity自身的数据。
        在正常的生命周期中。onSaveInstanceState()是不会被调用的,但onPause会。

A启动B

        生命周期运行顺序为:A#onPause()->B#onCreate()->#B#onStart()->B#onResume()->A#onStop()。

onConfigurationChanged

        屏幕方向等手机配置发生变化时。会导致当前的activity被销毁重建,在该过程中会调用onSaveInstanceState()与onRestoreInstanceState()方法。
        假设想不重建activity,须要在<activity>中配置configChanges属性,比方configChanges="orientation",那么当屏幕旋转时就不会引起activity重建。但会调用onConfigurationChanged()。即:配置在configChanges中的手机配置发生变化时,不会引起activity的销毁重建。仅仅会调用Activity#onConfigurationChanged()的调用。

经常使用配置例如以下:
        locale|keyboardHidden|orientation|screenSize:分别表示手机位置发生变化(一般则改动系统语言),键盘可訪问性发生变化以及屏幕方向。

        注:配置configChanges时。一定要加上screenSize,不然不会调用onConfigurationChanged()

这是由于在横竖屏切换的时候,screenSize也发生了变化。假设不配置该属性。照样会销毁activity然后重建。

操作

设置动画

为activity设置动画,除了在代码中用overridePendingTransition()方法外,还能够在清单文件里配置theme来实现。

演示样例

<style name="mystyle">
<item name="android:windowAnimationStyle">@style/animation</item><!-- 配置动画 -->
<item name="android:windowNoTitle">true</item>
</style> <style name="animation" mce_bogus="1" parent="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/anim_enter</item>
<item name="android:activityOpenExitAnimation">@anim/anim_exit</item>
<item name="android:activityCloseEnterAnimation">@anim/back_enter</item>
<item name="android:activityCloseExitAnimation">@anim/back_exit</item>
</style>

清单文件里的配置为

android:theme="@style/mystyle"

假设写在<application>结点下,就会作用于全部的activity;假设写在单一的activity下,就仅仅会作用于当前的activity。

对于每个activity来说,它仅仅有打开和关闭两种状态。打开和关闭会有各自有两种情况,从A启动B时B就是进入。从B退回到A时A就是进入。从A启动B时A关闭。从B退回到A时B关闭。

当中的几个item的说明:

        android:activityOpenEnterAnimation:当A打开B时。B的进入动画。

因打开而导致的进入时的动画——open enter。

        android:activityOpenExitAnimation:当A打开B时,A退出的动画。

因打开而导致的关闭的动画——open exit。

        android:activityCloseEnterAnimation:当B关闭时。A进入的动画。因关闭而导致的进入的动画——close enter。

        android:activityCloseExitAnimation:当B关闭时,B的退出动画。因关闭而导致的退出动画——close exit。

从底部弹起

弹出的菜单项能够通过activity来完毕。效果:

当中拍照等就是一个activity界面。该activity的theme例如以下:

    <style name="TransparentBottom" parent="android:Theme">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowAnimationStyle">@style/AnimBottom</item>
<item name="android:backgroundDimEnabled">true</item>
<!-- 模糊 -->
</style>

当中AnimBottom为:

    <style name="AnimBottom" parent="@android:style/Animation">
<item name="android:windowEnterAnimation">@anim/push_bottom_in</item>
<item name="android:windowExitAnimation">@anim/push_bottom_out</item>
</style>

经常用法

attach():Activity在onCreate之前调用attach方法,在attach方法中会创建Window对象。window对象创建时并没有创建DecorView对象。用户在Activity中调用setContentView,该方法会调用Window的setContentView,这时会检查DecorView是否存在,假设不存在则创建DecorView对象,然后把用户自己的View
加入到DecorView中。

这就是Activity显示界面的过程。

<activity>

windowSoftInputMode

设置软键盘模式。主要解析adjustResize与adjustPan。

前者重绘整个屏幕,会调用到View中的onSizeChanged()方法。后者不会重绘整个屏幕,它仅仅是把屏幕中的组件进行平移。把获取焦点的组件显示出来就可以。未获取焦点的则还会被软键盘遮盖。可是是adjustResize则不会。

adjustResize的图:

adjustPan的图:

从两个图能够看见:第一个图中(adjustResize)当软键盘弹起的时候。ListView会自己主动滚动到最后一个条目,由于它重绘了整个屏幕,相当于ListView又一次载入一次。而第二个界面中(adjustPan),当软键盘弹起时,仅仅是把当前屏幕中最后一个条目给顶起来,并不显示ListView中的最后一个条目。

taskAffinity

        它指明当前的activity所希望属于的栈。假设没有指定。就按<application>中的taskAffinity的值。假设后者也没有指定,就指的是在清单文件里声明的包名。一个栈有一个affinity。它的值指的是这个栈的根activity的taskAffinity的值。因此,当全部的activity都不指定taskAffinity的时候,这些activity都会进入同一个栈中(由于taskAffinity的值都是清单文件里声明的包名)。

allowTaskReparenting

        是否同意当前的activity又一次宿主到具有同样的affinity的栈中。当该栈处于前台时。如果应用A有一个activityA的taskAffinity的值为com.example.demo1。且allowTaskReparenting为true;应用B有一个activityB的taskAffinity也为com.example.demo1。那么先执行应用A,执行后按小房子。再执行应用B。这时会发现显示的是activityA的内容。

这是由于,activityA同意该activity又一次宿主。因此,当activityB启动的时候,会建立一个affinity为com.example.demo1的栈。这个栈的affinity和activityA的taskAffinity一样,所以activityA就又一次宿主(也就是移动到了activityB启动的栈中)了。再比方,应用A中启动了应用B的activityA(该activity的此属性值为true),那么当执行应用B时,显示的会是activityA(从应用A的task中重宿到应用B的task中)。

excludeFromRecents

        是否从近期浏览中删除。假设为true,则在近期浏览中无该应用图标,否则有。

默认值为false。

exports

       是否同意别的应用程序打开该activity,true是同意。

false是不同意。

它的默认值是依据<intent-filter>来的,假设含有<intent-filter>,则默认值为true。

否则默认值为false。

stateNotNeeded

在正常情况下,在一个activity调用finish()之前会调用onSavaInstanceState()用来保存该activity的状态。并会将它的状态存储到一个Bundle的对象中。

当该activity再次启动时,就会把该Bundle对象传到onCreate()方法中。假设该属性设置为true了。那么就不会调用onSavaInstanceState()方法。那么onCreate()方法中传入的參数就是null,就像该activity第一次被创建时一样。默认值是false。

alwayRetainTaskState

       当某个栈处于后台的时间过长,系统会自己主动回收这个栈中的除了根activity外的全部activity。假设在根activity设置了该属性而且值为true,那么这个栈中的全部activity都不会被系统回收,不管离开多长时间。

clearTaskOnLaunch

根activity该值为true。那么该栈中除了根activtiy外的全部activity。在该栈一进入后台的时候都会被清空。

假设allowTaskReparenting与clearTaskOnLaunch都设置为true,那么在启动某一个栈的时候,该栈中能又一次宿主的activity都会又一次宿主。不能又一次宿主的activity都会被清掉。

该属性仅仅对根activity设置有效,task中其他activity设置无效。

finishOnTaskLaunch

        它和clearTaskOnLaunch类似。可是仅仅能作用于一单个的activity。而不能作用于一个栈。当某一个activity的该属性值设置为true时,该activity所处的栈再次处于前台时。这个activity会finish掉,即使它设置了allowReparenting=true。

启动模式

定义activity的启动模式有两种方式:清单文件和通过intent.setFlag()。

假设两者同一时候存在,以后者为准

standard

标准启动模式。

谁启动了该activity,那么该activity就会执行在启动它的activity所在的栈中。因此,在非activity中启动activity时,必须为intent设置FLAG_ACTIVITY_NEW_TASK标识。由于非activity没有任务栈。

singleTask

參考

1. 设置了"singleTask"启动模式的Activity,它在启动的时候。会先在系统中查找属性值affinity等于它的属性值taskAffinity的task是否存在。假设存在,它就会在这个任务中启动。否则就会在新任务栈中启动。因此,假设我们想要设置了"singleTask"启动模式的Activity在新的任务中启动。就要为它设置一个独立的taskAffinity属性值。这也能够解释为什么在同一个应用中启动singleTask的activity会是在同一个task,而不同应用中启动时却不是同一个task。由于默认时目标activity的taskAffinity为应用的包名,不同应用时taskAffinity与启动activity所在的task的affinity值不一致,因此目标activity会在新的task中启动。

2. 假设设置了"singleTask"启动模式的Activity不是在新的任务中启动时,它会在已有的任务中查看是否已经存在对应的Activity实例,假设存在,就会把位于这个Activity实例上面的Activity所有结束掉,即终于这个Activity实例会位于任务的堆栈顶端中。

假设不存在,就新建一个目标activity的实例,并压入对应的task的顶端。

3,假设目标activity不是在新task中启动。那么目标activity所在的task会被挪移到前台。从而该task中的activity位于启动activity前面。例如以下:

文字说明为:A representation of how an activity with launch mode "singleTask" is added to the back stack. If the activity is already a part of a background
task with its own back stack, then the entire back stack also comes

forward, on top of the current task.

singleInstance

新建一个栈,并将该activity放到该栈中,并且这个栈中不会放入别的随意的activity。

当启动模式为上述两种时。startActivityForResult()是无效的。onActivityResult()会马上运行,而且resultCode为RESULT_CANCELED。

Activity入门(一)的更多相关文章

  1. 第35讲 Activity入门和跳转

    第35讲Activity入门和跳转 1.Activity Activity是用户接口程序.在Android当中,Activity提供可视化的用户界面,一个Android应用通常由多个activity组 ...

  2. activity入门

    1.前单文件 <activity android:name="com.example.twoactivity.OtherScreenActivity" android:lab ...

  3. 安卓开发 Activity入门

    生命周期 Activity包含5种状态,涉及7种方法 1. 启动状态 2. 运行状态 *** 即使内存不足,Android先销毁栈底的Activity,来确保当前Activity正常运行 3. 暂停状 ...

  4. activity入门2

    1.如何获取其他应用的包名和类名? 点击和查看logcat第一条信息2.第二步Intent intent = new Intent();intent.setClassName("com.an ...

  5. 《Android学习指南》目录

    源:<Android学习指南>目录 Android学习指南的内容分类: 分类 描述 0.学习Android必备的Java基础知识 没有Java基础的朋友,请不要先看Android的课程,这 ...

  6. 《Android学习指南》文件夹

    转自:http://android.yaohuiji.com/about Android学习指南的内容分类: 分类 描写叙述 0.学习Android必备的Java基础知识 没有Java基础的朋友,请不 ...

  7. 【详细】Android入门到放弃篇-YES OR NO-》各种UI组件,布局管理器,单元Activity

    问:达叔,你放弃了吗? 答:不,放弃是不可能的,丢了Android,你会心疼吗?如果别人把你丢掉,你是痛苦呢?还是痛苦呢?~ 引导语 有人说,爱上一个人是痛苦的,有人说,喜欢一个人是幸福的. 人与人之 ...

  8. Activity工作流(2)-入门安装运行第一个例子

    转: Activity工作流(2)-入门安装运行第一个例子 置顶 2017年05月24日 15:58:50 li_ch_ch 阅读数:24432   版权声明:本文为博主原创文章,未经博主允许不得转载 ...

  9. Android零基础入门第73节:Activity初入门,创建和配置如此简单

    Activity是Android应用的重要组成单元之一,也是Android应用最常见的组件之一.前面看到的示例通常都只包含一个Activity或一个AppCompatActivity,但在实际应用中这 ...

随机推荐

  1. web 大规模并发访问的解决方案

    电商的秒杀和抢购,对我们来说,都不是一个陌生的东西.然而,从技术的角度来说,这对于Web系统是一个巨大的考验.当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要.这次我们 ...

  2. BZOJ 2752:[HAOI2012]高速公路(road)(线段树)

    [HAOI2012]高速公路(road) Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y ...

  3. Python之数据结构:集合

    一.set集合 1.集合是一个无序不重复元素集,有去重的作用 set集合类需要的参数必须是迭代器类型的,如:序列.字典等,然后转换成无序不重复的元素集.由于集合是不重复的,所以可以对字符串.列表.元组 ...

  4. [bzoj 3048] [Usaco2013 Jan]Cow Lineup

    [bzoj 3048] [Usaco2013 Jan]Cow Lineup Description 给你一个长度为n(1<=n<=100,000)的自然数数列,其中每一个数都小于等于10亿 ...

  5. 【UVA11859】Division Game(SG函数,Nim游戏)

    题意:给定一个n*m的矩阵,两个游戏者轮流操作. 每次可以选一行中的1个或多个大于1的整数,把它们中的每个数都变成它的某个真因子,不能操作的输. 问先手能否获胜 n,m<=50,2<=a[ ...

  6. MySQL的配置文件无法修改的解决办法(Win8)

    问题描述      修改mysql5.7安装目录下my-default.ini发现不起作用: MySQL的版本是5.7,操作系统是window8.1.MySQL安装在 C:\Program Files ...

  7. 【小米3使用经验】小米3联通版 miui7.2.11稳定版刷机

    1.我的手机是小米3联通版的,买来后为了配合公司的手机开发,将Android系统升级到4.4.4版本,MiUi为默认版本. 前段时间可能不小心开启了自动升级,结果Android系统升级到6.0.1版本 ...

  8. Android系统启动过程【转】

    转自:http://www.cnblogs.com/bastard/archive/2012/08/28/2660389.html Android系统启动过程 首先Android框架架构图:(来自网上 ...

  9. IE/FF/Chrome下document.documentElement和document.body的 scrollHeight/scrollTop/clientHeight 以及判断滚动条是否已拉到页面最底部

    DTD已声明 IE document.documentElement.scrollHeight 浏览器所有内容高度 ,document.body.scrollHeight 浏览器所有内容高度 docu ...

  10. AutoResetEvent 和 ManualResetEvent 多线程应用

    AutoResetEvent 1.用于在多线程,对线程进行阻塞放行 static AutoResetEvent auth0 = new AutoResetEvent(false); static Au ...