android学习总结--activity

Activity介绍

actvity作为Android四大组件之一,主要为用户提供可视化界面及人机交互。是Android中最基础最重要的组件。我们可以形象的狭隘的将activity视作一个“活动窗口”,一个眼睛能够看得见的实实在在的界面。用户与软件进行交互时,大多数情况都是通过activity进行交互。在学习activity时,我们需要知道activity的生命周期、启动方式、activity之间的跳转、activity之间的数据通信等等。

activity生命周期

activity生命周期
从图中可以看出activity的生命周期包括oncreate()、onStart()、onResume()、onPause()、onStop()、onDestroy()、onRestart()方法。

  • onCreate():activity创建时回调该方法,在该 方法内会做一些初始化操作,比如设置布局文件,初始化组件资源等,此时activity还处于后台,属于不可见状态。
  • onStart():表示activity已经启动,属于可见状态,但没有在前台显示(此处可以理解为Android机制认为activity已经可见了,但是我们看不见)。
  • onResume():此时activity处于前台可见状态,可以与用户进行交互。
  • onPause():此时activity处于暂停状态,activity仍然处于部分可见的状态,大多数时候,意味着用户正在离开这个activity并马上会进入Stopped state,可以进行以下操作:

    • 停止动画或者是其他正在运行的操作,那些都会导致CPU的浪费
    • 提交没有保存的改变,但是仅仅是在用户离开时期待保存的内容(such as a draft email).
    • 释放系统资源,例如broadcast receivers, sensors (like GPS), 或者是其他任何会影响到电量的资源。
  • onStop():此时activity处于停止状态,activity不可见,释放那些不再需要的所有资源。在极端情况下,系统会直接杀死你的app进程,并且不执行activity的onDestroy()回调方法, 因此你需要使用onStop()来释放资源,从而避免内存泄漏。
  • onDestroy():activity处于销毁状态,activity不可见,做一些回收工作和最终的资源释放。
  • onRestart():表示Activity正在重新启动,当Activity由不可见变为可见状态时,该方法被回调。这种情况一般是用户打开了一个新的Activity时,当前的Activity就会被暂停(onPause和onStop被执行了),接着又回到当前Activity页面时,onRestart方法就会被回调。
onCreate和onStart之间有什么区别?
  1. 可见与不可见的区别。前者不可见,后者可见。
  2. 执行次数的区别。onCreate方法只在Activity创建时执行一次,而onStart方法在Activity的切换以及按Home键返回桌面再切回应用的过程中被多次调用。因此Bundle数据的恢复在onStart中进行比onCreate中执行更合适。
  3. onCreate能做的事onStart其实都能做,但是onstart能做的事onCreate却未必适合做。比如,setContentView和资源初始化在两者都能做,然而想动画的初始化在onStart中做比较好。
onStart方法和onResume方法有什么区别?
  1. 是否在前台。onStart方法中Activity可见但不在前台,不可交互,而在onResume中在前台。
  2. 进行初始化工作,而onResume方法,根据官方的建议,可以做开启动画和独占设备的操作。
onPause方法和onStop方法有什么区别?
  1. 是否可见。onPause时Activity可见,onStop时Activity不可见,但Activity对象还在内存中。
  2. onPause中处理一些程序状态的保存、独占设备和动画的关闭、以及一些数据的保存等操作
onStop方法和onDestroy方法有什么区别?
  1. onstop阶段activity对象还在内存中,没有被销毁,而onDestroy阶段已经被销毁了
  2. 在某些极端情况下,比如系统内存不足,系统会强制销毁activity,不走ondestroy流程,直接走到onStop流程就结束了
为什么切换Activity时各方法的执行次序是(A)onPause→(B)onCreate→(B)onStart→(B)onResume→(A)onStop而不是(A)onPause→(A)onStop→(B)onCreate→(B)onStart→(B)onResume?
  1. 一个Activity或多或少会占有系统资源,而在官方的建议中,onPause方法将会释放掉很多系统资源,为切换Activity提供流畅性的保障,而不需要再等多两个阶段,这样做切换更快
  2. 按照生命周期图的表示,如果用户在切换Activity的过程中再次切回原Activity,是在onPause方法后直接调用onResume方法的,这样比onPause→onStop→onRestart→onStart→onResume要快得多

Activity启动模式

1. 四种启动模式原理

  • Standard 模式:又称为标准模式,也是系统的默认模式(可以不指定),在这样模式下,每启动一个Activity都会重新创建一个Activity的新实例,并且将其加入任务栈中,而且完全不会去考虑这个实例是否已存在
  • singleTop 模式:又称栈顶复用模式,顾名思义,在这种模式下,如果有新的Activity已经存在任务栈的栈顶,那么此Activity就不会被重新创建新实例,而是复用已存在任务栈栈顶的Activity。这里重点是位于栈顶,才会被复用,如果新的Activity的实例已存在但没有位于栈顶,那么新的Activity仍然会被重建。需要注意的是,Activity的onNewIntent方法会被调用,此时Activity的onCreate、onStart方法不会被调用。
  • singleTask 模式: 又称为栈内复用模式。这是一种单例模式,与singTop点类似,只不过singTop是检测栈顶元素是否有需要启动的Activity,而singTask则是检测整个栈中是否存在当前需要启动的Activity,如果存在就直接将该Activity置于栈顶,并将该Activity以上的Activity都从任务栈中移出销毁,同时也会回调onNewIntent方法
  • singleInstance 模式:在singleInstance模式下,该Activity在整个android系统内存中有且只有一个实例,而且该实例单独尊享一个Task。换句话说,A应用需要启动的MainActivity 是singleInstance模式,当A启动后,系统会为它创建一个新的任务栈,然后A单独在这个新的任务栈中,如果此时B应用也要激活MainActivity,由于栈内复用的特性,则不会重新创建,而是两个应用共享一个Activity的实例。

2. 启动模式的使用方式

  • .通过AndroidMenifest.xml文件为Activity指定启动模式
<activity android:name=".ActivityC"android:launchMode="singleTask" />
  • 通过在Intent中设置标志位(addFlags方法)来为Activity指定启动模式
Intent intent = new Intent();
intent.setClass(ActivityB.this,ActivityA.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

常见Intent Flag 启动模式:

  • Intent.FLAG_ACTIVITY_NEW_TASK:该标志位表示使用一个新的Task来启动一个Activity,相当于在清单文件中给Activity指定“singleTask”启动模式。通常我们在Service启动Activity时,由于Service中并没有Activity任务栈,所以必须使用该Flag来创建一个新的Task。

  • Intent.FLAG_ACTIVITY_SINGLE_TOP:该标志位表示使用singleTop模式来启动一个Activity,与在清单文件指定android:launchMode=”singleTop”效果相同。

  • Intent.FLAG_ACTIVITY_CLEAR_TOP:该标志位表示使用singleTask模式来启动一个Activity,与在清单文件指定android:launchMode=”singleTask”效果相同。

  • Intent.FLAG_ACTIVITY_NO_HISTORY :使用该模式来启动Activity,当该Activity启动其他Activity后,该Activity就被销毁了,不会保留在任务栈中。如A-B,B中以这种模式启动C,C再启动D,则任务栈只有ABD。

  • Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:使用该标识位启动的Activity不添加到最近应用列表,也即我们从最近应用里面查看不到我们启动的这个activity。与属性android:excludeFromRecents=”true”效果相同。

3. 启动模式的使用场景

  • singleTop适合接收通知启动的内容显示页面。例如,某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很烦人的。聊天的对话窗口,
  • singleTask适合作为程序入口点。例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。之前打开过的页面,打开之前的页面就ok,不再新建。
  • singleInstance适合需要与程序分离开的页面。例如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。
  • standard 标准的启动模式,也是默认的启动模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值