android 面试—activity

   2016-10-09 0
核心提示:本篇总结关于activity相关的面试内容。生命周期首先来看一下官网上面的关于activity的生命周期的图。 首先新建两个activity,MainActivity和BActivity,第一个activity可以跳转到BActivity,然后观察它们之间的生命周期的log public class MainActivity exten

本篇总结关于activity相关的面试内容。

生命周期

首先来看一下官网上面的关于activity的生命周期的图。

android 面试—activity

首先新建两个activity,MainActivity和BActivity,第一个activity可以跳转到BActivity,然后观察它们之间的生命周期的log

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
KLog.d("MainActivity ----------> onCreate");
}

public void onClickBtn(View view) {
KLog.d("MainActivity ----------> onClickBtn");
switch (view.getId()) {
//跳转到BActivity
case R.id.button:
startActivity(new Intent(MainActivity.this, BActivity.class));
break;
}

}

@Override
protected void on Start() {
super.on Start();
KLog.d("MainActivity ----------> on Start");
}

@Override
protected void onResume() {
super.onResume();
KLog.d("MainActivity ----------> onResume");
}

@Override
protected void onPause() {
super.onPause();
KLog.d("MainActivity ----------> onPause");
}

@Override
protected void on Stop() {
super.on Stop();
KLog.d("MainActivity ----------> on Stop");
}

@Override
protected void onDestroy() {
super.onDestroy();
KLog.d("MainActivity ----------> onDestroy");
}

@Override
protected void onRestart() {
super.onRestart();
KLog.d("MainActivity ----------> onRestart");
}
}

启动MainActivity

Log打印出为onCreate——>on Start——>onResume

android 面试—activity

跳转到BActivity

Log打印出为onPause(MainActivity)——>onCreate(BActivity)——>on Start(BActivity)——>onResume(BActivity) ——> on Stop(MainActivity)

android 面试—activity

BActivity锁屏

Log打印出为onPause——>on Stop

android 面试—activity

BActivity解锁显示

Log打印出为onRestart——>on Start——>onResume

android 面试—activity

BActivity退回到MainActivity

Log打印出为onPause(BActivity)——>onRestart(MainActivity)——>on Start(MainActivity)——>onResume(MainActivity) ——> on Stop(BActivity)——>onDestroy(BActivity)

android 面试—activity

按home键

Log打印出为onPause——>on Stop

android 面试—activity

再次进入MainActivity

Log打印出为onRestart——>on Start——>onResume

android 面试—activity

可以看出来,锁屏和按home键,显示生命周期是一样的。

退出MainActivity

Log打印出为onPause——>on Stop——>onDestroy

android 面试—activity

以上便是一个完整的生命周期图,当然了其中还有可能包括:正好来电话了、、、、等生命周期。

横竖屏切换

当我们进行横竖屏切换时,相应的activity会销毁并进行重建操作。

启动MainActivity(竖屏)

Log打印出为onCreate——>on Start——>onResume

android 面试—activity

然后进行横屏显示

android 面试—activity

可以很清楚地看到了activity销毁并重建了,但是在重建过程中会调用onRestoreInstanceState进行恢复数据操作。所以为了不必要的麻烦,我们可以设置只显示竖屏或者横屏

通过在AndroidManifest.xml中设置activity中的android:screenOrientation属性值来实现。

android:screenOrientation="portrait"

则无论手机如何变动,拥有这个属性的activity都将是竖屏显示。

android:screenOrientation="landscape",为横屏显示。

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

另外,android中每次屏幕的切换动会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在Activity再次Create的时候载入配置,那样,进行中的游戏就不会自动重启了!

onSaveInstanceState和onRestoreInstanceState 是一对兄弟,一个负责存储,一个负责取出.“不一定”是成对的被调用的。

Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate()、onPause()等生命周期方法,它们并不一定会被触发。当应用遇到意外情况(如:内存不足、用户直接按Home键)由系统销毁一个Activity时,onSaveInstanceState() 会被调用。但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。因为在这种情况下,用户的行为决定了不需要保存Activity的状态。通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。

http://www.cnblogs.com/hanyonglu/archive/2012/03/28/2420515.html

关于生命周期注意事项

  1. 如果一个Activity在用户可见时才处理某个广播,不可见时注销掉,那么应该在哪两个生命周期的回调方法去注册和注销BroadcastReceiver呢?

Activity 的可见生命周期发生在 on Start调用与 on Stop调用之间。在这段时间,用户可以在屏幕上看到 Activity 并与其交互。我们可以在 on Start中注册一个 BroadcastReceiver以监控影响 UI 的变化,并在用户无法再看到您显示的内容时在 on Stop中将其取消注册。

  1. 如果有一些数据在Activity跳转时(或者离开时)要保存到数据库,那么你认为是在onPause好还是在on Stop执行这个操作好呢?

onPause较容易被触发,所以我们在做BroadcastReceiver注销时放在on Stop要好些。onPause时Activity界面仍然是可见的,如弹出一个Dialog时。但在保存数据时,放在onPause去做可以保证数据存储的有效性,如果放在on Stop去做,在某些情况下Activity走完onPause后有可能还没顺利走到on Stop就被系统回收了。

参考链接: http://www.jianshu.com/p/ae6e1d93cc8e

启动模式

四种启动模式,standard, singleTask, singleTop, singleInstance。

  • standard: 标准模式,在当前的任务栈上创建新的Activity,不论之前有没有创建过该Activity。
  • singleTask: 栈内复用模式,分两种情况,第一种情况:如果有任务栈里已经创建了该Acitiviy,直接销毁该Acitivity栈上面的所有Acitivity,无须新创建一个Activity;第二种情况:如果没有任务栈里已经创建该Activity,创建一个新的任务栈并在新栈上创建新Activity。注意:该模式下复用Activity,系统会调用Activity的onNewIntent方法。
  • singleTop: 栈顶复用模式,如果该Activity在任务栈栈顶,即当前活动的Acitivty就是要创建的Activity,那么不会创建新的Activity。注意:该模式下复用Activity,系统会调用Activity的onNewIntent方法。
  • singleInstance:单实例模式,加强版的singleTask,当每次都直接创建一个新的任务栈,再在该新栈上创建新Activity。注意:singleInstance永远是单栈单Activity

    与之对应的是IntentFlag的设置,同样也能达到效果:

    Intent Flag描述启动模式

Flags:

表示Intent的标志位,常用于Activity的场景中,它和Activity的启动模式有着密切的联系,简单说,flag的有效组合(通常用“|“组合使用)决定如何打开Activity。

  • Intent.FLAG_ACTIVITY_NEW_TASK (默认) 默认的跳转类型,它会重新创建一个新的Activity。
  • FLAG_ACTIVITY_SINGLE_TOP 这个FLAG就相当于启动模式中的singletop,请参考singletop说明。
  • FLAG_ACTIVITY_CLEAR_TOP
    这个FLAG启动的Activity会把要启动的Activity之上(包含自身)的Activity全部弹出栈空间。例如:原来栈中的结构是A B C D ,从D中跳转到B,释放顺序为D C B,然后重新创建B置于栈顶,栈中的结构就变为了A B了。(这个方法可以用来关闭多个Activity)
    经验:需要销毁栈中A之前的多个activity,但并不想销毁A,就需要FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_SINGLE_TOP组合使用
  • FLAG_ACTIVITY_CLEAR_TASK 这个Flag使用的前置条件为:API level 11 以上版本,并且需要与FLAG_ACTIVITY_NEW_TASK一起使用。此标识,用于释放当前栈中所有的activity,然后再创建新的Activity对象置于栈顶。 例如栈中原有A B C D,需要从D跳转到B,依次释放D C B A,然后创建B,置于栈顶。
 
标签: Activity
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • Activity 基本生命周期
    Activity 基本生命周期
    现在讨论activity生命周期的文章已经很多了,但是有时候看得太多反而会觉得思绪很乱。这篇博的目的就是帮助你快速的理清思路,也是自己学习的一些总结。首先什么是Activity? 在很多的书籍里面将其直译为活动。因为像比如service之类的在后台跑着的服务,也可
    12-01 Activity
  • compileSdkVersion为23以下的应用运行在Android
    compileSdkVersion为23以下的应用运行在Android6.0的拍照权限处理[拍照时onActivityResult的data返回为null的处理办法]场景还原我以前开发的一个项目中需要适配到Android6.0,主要是权限的适配,其他权限基本都还能用,就拍照的有问题,能拍照但是没有获取到
    10-17 安卓开发
  • Android 研发安全 1-Activity 组件安全(上)
    Android 研发安全 1-Activity 组件安全(上)
    Activity组件是用户唯一能看见的组件,作为软件所有功能的显示载体,其安全性不言而喻。针对Activity组件安全,作为一个安卓开发者来讲需要在日常开发过程中注意两点:- Activity访问权限的控制- Activity被劫持本篇文章将分享Activity访问权限控制方面的安全
    10-09 安卓开发
  • Activity到底是什么时候显示到屏幕上的呢?
    Activity到底是什么时候显示到屏幕上的呢?
    这两天我的包工头 歪龙木灵魂架构师王半仙Yrom 给我派了一个活:统计App冷启动时间。这个任务看上去不难,但是要求统计出来的时间要 准 ,要 特别准 。 意思就是,我必须要按Activity绘制到屏幕上这个时间节点作为标杆,来进行我的统计工作。毕竟如果是因为视
    10-07 Activity
  • 安卓的Activity跳转
    预计阅读时间: 8 分钟此教程纯属业余,如有言中,不甚荣幸。开发工具android studio,我们创建一个空白安卓应用。实现应用内屏幕间的跳转,以及数据传递;按钮点击事件的处理;主屏幕代码public class MainActivity extends Activity implements View.OnClick
    09-18 Activity
  • Activity - 朱利源的博客 - 博客频道 - CSDN.NET
    Activity - 朱利源的博客 - 博客频道 - CSDN.NE
    本系列主要是读书笔记,知识点百分之90来自 安卓开发艺术探索和安卓群英传,还有百分之10是自己的扩展与理解.欢迎吐槽生命周期 一.正常情况下生命周期如图正常生命周期 开起activity调用onCreate() onStart() onResume(),按下返回键 onPause() onStop() onDestr
    09-12 Activity
  • Activity的转场动画
    Activity的转场动画
    2. V4包中的ActivityOptionsCompat和 ActivityCompat2.1. makeCustomAnimation(Context context, int enterResId, int exitResId)热修复的文章仍然在写更新,希望等待热修复的亲们耐心. iphone 7 已经发布了,你会为新的iphone买单么? 我很喜欢苹果,因为它
    09-11 Activity
  • Android编程实现两个Activity之间共享数据及互
    这篇文章主要介绍了Android编程实现两个Activity之间共享数据及互相访问的方法,简单分析了Android中Activity数据共享与访问的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
  • Android中Service实时向Activity传递数据实例分析
    Android中Service实时向Activity传递数据实例分
    这篇文章主要介绍了Android中Service实时向Activity传递数据的方法,实例分析了Service组件基于线程操作实现数值实时传递的相关技巧,需要的朋友可以参考下
  • Android实现Activity之间通信的方法
    这篇文章主要介绍了Android实现Activity之间通信的方法,涉及Android中Activity实现数据的发送及接收相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
点击排行