200斤牌面试必备:Activity面试题 请安利(不停更)

目录

Q:说下Activity的生命周期?

Q:onStart()和onResume()/onPause()和onStop()的区别?

Q:Activity A启动另一个Activity B会回调哪些方法?如果Activity B是完全透明呢?如果启动的是一个Dialog呢?

Q:谈谈onSaveInstanceState()方法?何时会调用?

Q:onSaveInstanceState()与onPause()的区别?

Q:如何避免配置改变时Activity重建?

Q:优先级低的Activity在内存不足被回收后怎样做可以恢复到销毁前状态?

Q:说下Activity的四种启动模式?(有时会出个实际问题来分析返回栈中Activity的情况)

Q:谈谈singleTop和singleTask的区别以及应用场景

Q:onNewIntent()调用时机?

Q:了解哪些Activity启动模式的标记位?

Q:Activity的启动过程

Q:如何启动其他应用的Activity?

Q:假设当前Activity为A,如果这时用户新启动另一个Activity B,那么B的onResume()和A的onPause()哪个先执行呢?


我非原创,只做整合,谢谢各位提供问题的小伙伴!~,题目来源尽可能在题目之前列出来!~


以下问题来源:厘米姑娘,答案来源:百度

Q:说下Activity的生命周期?

  • onCreate(),在被创建的时候回调,初始化变量或者初始化数据
  • onStart(),这个方法被回调的话就意味着Activity已经正在启动状态了,此时Activity处于可见状态,但未在前台显示,无法与用户交互
  • onResume(),这个方法被回调的话就意味着已经处在前台可见同时可以和用户交互,此时Activity进入了运行状态
  • onPause(),Activity正在停止
  • onStop(),在onPause()执行完之后,立即执行,表示这个Activity即将停止/被一个新的Activity完全覆盖,此时Activity不可见,只能在后台运行
  • onDestroy(),表示Activity正在被销毁,释放资源、回收资源
  • onReStart(),Activity正在重新启动,当Activity从onStop()变为onStart(),会回调这个方法

正常情况下的生命周期:onCreate()——> onStart()——> onResume()——> onPause()——> onStop()——> onDestroy()

相比于正常情况下,异常情况下多了两个方法——onSaveInstanceState()和onRestoreInstanceState(),这两个方法是系统自动调用的,但是,它们是在出现异常情况下才会调用的。

onSaveInstanceState()用来保存当前Activity的状态信息,我们可以在这个方法中存储一些数据,以便被销毁的Activity被重建的时候,可以直接恢复数据。

当Activity被重新创建之后,系统会自动调用onRestoreInstanceState(),会把Activity销毁时通过onSaveInstanceState()保存的bundle对象,作为参数,传递给onRestoreInstanceState()同时传递给onCreate()。

在平时,为了防止异常情况的出现,我们可以通过onRestoreInstanceState()和onCreate()来判断Activity是否被重新创建或者是否被销毁,销毁了的话,我们就可以在这两个方法当中去选一个去进行数据的恢复。

但是二者也有一些区别:在onRestoreInstanceState()当中,一旦被系统调用了,它里面传的参数bundle一定不能为空,所以在这里不需要做bundle的非空判断,而在onCreate()种bundle的参数有可能为空,所以在这里需要进行非空判断。所以推荐使用onRestoreInstanceState()。

 

Q:onStart()和onResume()/onPause()和onStop()的区别?

onStart()和onResume():两者都表示Activit已经可见,但是onStart()的时候Activity还在后台,仅仅可见不可交互,onResume()的时候Activity才显示到前台,可见可交互。

onPause()和onStop():onPause()表示Activity正在停止,Activity进入后台,这个时候可以做一些存储数据、停止动画的动作,但是不能太耗时,因为onPause()执行完后,新的Activity的onResume()才会执行。onStop()表示即将停止,此时Activity不可见。

onStart()和onStop()是从Activity是否可见来描述的;onResume()和onPause()是从Activity是否在前台来描述的。


Q:Activity A启动另一个Activity B会回调哪些方法?如果Activity B是完全透明呢?如果启动的是一个Dialog呢?

Activity A启动另一个Activity B有如下回调(我这里用的是MainActivity与NextActivity举例):

 

可以看到,原来的Activity(后称之为:MainActivity)在点击跳转按钮打开一个新的Activity(后称之为:NextActivity)的时候,MainActivity会先执行onPause(),紧接着NextActivity会走onCreate()-onStart()-onResume(),当NextActivity处于onResume()的可见可交互状态了,MainActivity才会走onStop();

如果Activity B是完全透明的,

如果启动的是一个Dialog,

 

Q:谈谈onSaveInstanceState()方法?何时会调用?

onSaveInstanceState()用来保存当前Activity的状态信息,我们可以在这个方法中存储一些数据,以便被销毁的Activity被重建的时候,可以直接恢复数据。

当Activity出现异常,被重新创建之后,系统会自动调用onRestoreInstanceState()。


Q:onSaveInstanceState()与onPause()的区别?


Q:如何避免配置改变时Activity重建?


Q:优先级低的Activity在内存不足被回收后怎样做可以恢复到销毁前状态?


Q:说下Activity的四种启动模式?(有时会出个实际问题来分析返回栈中Activity的情况)


Q:谈谈singleTop和singleTask的区别以及应用场景


Q:onNewIntent()调用时机?

 

Q:了解哪些Activity启动模式的标记位?

Q:Activity的启动过程

简单理解,启动Activity的请求会由Instrumentation来处理,然后它通过Binder向ActivityManagerService(AMS)发送请求,AMS内部维护着一个ActivityStack来负责栈内的Activity的状态同步,AMS通过ActivityThread去同步Activity的状态从而完成生命周期方法的调用。


Q:如何启动其他应用的Activity?

以下问题来源:《Android开发艺术探索》

Q:假设当前Activity为A,如果这时用户新启动另一个Activity B,那么B的onResume()和A的onPause()哪个先执行呢?

A的onPause()会先于B的onResume()执行。

Activity的启动是一个复杂的过程,简单理解,启动Activity的请求会由Instrumentation来处理,然后它通过Binder向ActivityManagerService(AMS)发送请求,AMS内部维护着一个ActivityStack来负责栈内的Activity的状态同步,AMS通过ActivityThread去同步Activity的状态从而完成生命周期方法的调用。那么在ActivityStack的resumeTopActivityInnerLocked()中,有如下一段代码:

        // We need to start pausing the current activity so the top one
        // can be resumed...
       boolean dontWaitForPause = (next.info.flags&ActivityInfo.FLAG_RESUME_WHILE_PAUSING) != 0;
        boolean pausing = mStackSupervisor.pauseBackStacks(userLeaving, true, dontWaitForPause);
        if (mResumedActivity != null) {
           if (DEBUG_STATES) Slog.d(TAG, "resumeTopActivityLocked: Pausing " + mResumedActivity);
            pausing |= startPausingLocked(userLeaving, false, true, dontWaitForPause);
        }
        if (pausing) {
           if (DEBUG_SWITCH || DEBUG_STATES) Slog.v(TAG,
                    "resumeTopActivityLocked: Skip resume: need to start pausing");
           // At this point we want to put the upcoming activity's process
            // at the top of the LRU list, since we know we will be needing it
           // very soon and it would be a waste to let it get killed if it
            // happens to be sitting towards the end.
           if (next.app != null && next.app.thread != null) {
                mService.updateLruProcessLocked(next.app, true, null);
           }
            if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked();
            return true;
       }

可以看到,当前的Activity被pausing之后,在top的Activity才能被resumed。


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值