Android面试题之Activity篇

Android面试题之Activity篇Activity篇目录前言一、Activity1、什么是Activity?2、请描述一下Activity生命周期3、请描述一下Activity的四个状态4、两个Activity之间传递数据,除了intent,广播接收者,contentprovider还有啥?5、Android中的Context,Activity,Appliction有什么区别?6、Context是什么?7、如何保存Activity的状态?8、横竖屏切换时Activity的生命周期9、两个Activity

大家好,又见面了,我是你们的朋友全栈君。


前言

秋招在即,计蒙准备在国庆假期结束前整理一套Android初级面试题籍,希望对大家有所帮助


提示:以下是本篇文章正文内容

一、 Activity

1、什么是 Activity?

四大组件之一,一般的,一个用户交互界面对应一个 activity

setContentView() ,// 要显示的布局 

activity 是 Context 的子类,同时实现了 window.callback 和 keyevent.callback, 可以处理与窗体用户交互的事件

button.setOnclickLinstener{ 
   
}//点击事件

我在开发常用的的有 FragmentActivitiy,ListActivity ,PreferenceActivity ,TabAcitivty 等…如果界面有共同的特点或者功能的时候,还会自己定义一个 BaseActivity


2、请描述一下 Activity 生命周期

Activity 从创建到销毁有多种状态,从一种状态到另一种状态时会激发相应的回调方法,这些回调方法包括:

onCreate onStart onResume onPause onStop onDestroy,onRestart

这些方法大都是两两对应的

onCreate 创建与 onDestroy 销毁
onStart 可见与 onStop 不可见
onResume 可编辑(即焦点)与 onPause

3、请描述一下Activity的四个状态

running-poused-stopped-killed

1.running->当前显示在屏幕的activity(位于任务栈的顶部),用户可见状态。
2.poused->依旧在用户可见状态,但是界面焦点已经失去,此Activity无法与用户进行交互。
3.stopped->用户看不到当前界面,也无法与用户进行交互 完全被覆盖.
4.killed->当前界面被销毁,等待这系统被回收


4、两个 Activity 之间传递数据,除了 intent,广播接收者,content provider 还有啥?

1)利用 static 静态数据,public static 成员变量
2)利用外部存储的传输,例如 File 文件存储

 SharedPreferences 首选项
 Sqlite 数据库

5、Android 中的 Context, Activity,Appliction 有什么区别?

  • 相同:Activity 和 Application 都是 Context 的子类。 Context
    从字面上理解就是上下文的意思,在实际应用中它也确实是起到了管理上下文环境中各个参数和变量的总用,方便我们可以简单的访问到各种资源。
  • 不同:维护的生命周期不同。 Context 维护的是当前的 Activity 的生命周期,Application维护的是整个项目的生命周期。 使用 context 的时候,小心内存泄露,防止内存泄露,注意一下几个方面:

1.不要让生命周期长的对象引用 activity context,即保证引用 activity 的对象要与 activity 本身生命周期是一样的。

2.对于生命周期长的对象,可以使用 application,context。

3.避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部对象引用导致的生命周期变化。


6、Context 是什么?

1、它描述的是一个应用程序环境的信息,即上下文。

2、该类是一个抽象(abstract class)类,Android 提供了该抽象类的具体实现类(ContextIml)。

3、通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一个 Activity,发送广播,接受 Intent,信息,等。


7、如何保存 Activity 的状态?

Activity 的状态通常情况下系统会自动保存的,只有当我们需要保存额外的数据时才需要使用到这样的功能。

  • 一般来说, 调用 onPause()和 onStop()方法后的 activity 实例仍然存在于内存中, activity的所有信息和状态数据不会消失, 当 activity 重新回到前台之后, 所有的改变都会得到保留。

  • 但是当系统内存不足时, 调用 onPause()和 onStop()方法后的 activity 可能会被系统摧毁, 此时内存中就不会存有该activity 的实例对象了。如果之后这个 activity 重新回到前台, 之前所作的改变就会消失。为了避免此种情况的发生 ,我们可以覆写 onSaveInstanceState() 方法。onSaveInstanceState()方法接受一个 Bundle类型的参数, 开发者可以将状态数据存储到这个Bundle对象中, 这样即使activity被系统摧毁,当用户重新启动这个activity而调用它的onCreate()方法时, 上述的 Bundle 对象会作为实参传递给onCreate()方法, 开发者可以从 Bundle 对象中取出保存的数据, 然后利用这些数据将 activity恢复到被摧毁之前的状态。

  • 需要注意的是, onSaveInstanceState()方法并不是一定会被调用的, 因为有些场景是不需要保存状态数据的. 比如用户按下 BACK 键退出 activity 时, 用户显然想要关闭这个 activity, 此时是没有必要保存数据以供下次恢复的, 也就是 onSaveInstanceState() 方法不会被调用. 如果调用onSaveInstanceState()方法, 调用将发生在 onPause()或 onStop()方法之前。

@Override
   protected void onSaveInstanceState(Bundle outState) { 
   
    // TODO Auto-generated method stub super.onSaveInstanceState(outState);
}

8、横竖屏切换时 Activity 的生命周期

此时的生命周期跟清单文件里的配置有关系。

  • 不设置 Activity 的 android:configChanges 时,切屏会重新调用各个生命周期默认首先销毁当前activity,然后重新加载。

  • 设置 Activity的android:configChanges=”orientation|keyboardHidden|screenSize”时,切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法。

通常在游戏开发, 屏幕的朝向都是写死的。


9、两个 Activity 之间跳转时必然会执行的是哪几个方法?

一般情况下比如说有两个activity,分别叫A,B
当在A里面激活B组件的时候, A会调用 onPause()方法,然后 B 调用 onCreate() ,onStart(), onResume()。
这个时候 B 覆盖了窗体, A 会调用 onStop()方法. 如果 B 是个透明的,或者是对话框的样式, 就不会调用 A 的 onStop()方法。


10、如何将一个 Activity 设置成窗口的样式

只需要给 Activity 配置如下属性即可。

android:theme="@android:style/Theme.Dialog"

11、Activity 的四种启动模式,singletop 和 singletask 区别是什么?

singleTop 跟 standard 模式比较类似。唯一的区别就是,当跳转的对象是位于栈顶的 activity(应该可以理解为用户眼前所 看到的 activity)时,程序将不会生成一个新的 activity 实例,而是直接跳到现存于栈顶的那个 activity 实例。拿上面的例子来说,当 Act1 为 singleTop 模式时,执行跳转后栈里面依旧只有一个实例,如果现在按返回键程序将直接退出。


12、Activity 的四种启动模式,一般书签的使用模式是 singletop,那为什么不使用 singletask?

singleTask 模式和 singleInstance 模式都是只创建一个实例的。在这种模式下,无论跳转的对象是不是位于栈顶的 activity,程序都不会生成一个新的实例(当然前提是栈里面已经有这个实例)。这种模式相当有用,在以后的多 activity 开发中,常会因为跳转的关系导致同个页面生成多个实例,这个在用户体验上始终有点不好,而如果你将对应的 activity 声明为 singleTask 模式,这种问题将不复存在。在主页的 Activity 很常用


13、如何退出 Activity ?如何安全退出已调用多个 Activity 的Application?

1、通常情况用户退出一个 Activity 只需按返回键,我们写代码想退出 activity 直接调用 finish()方法就行。

2、记录打开的 Activity:每打开一个 Activity,就记录下来。在需要退出时,关闭每一个 Activity 即可。

//伪代码
      List<Activity> lists ;// 在 application 全局的变量里面 lists = new ArrayList<Activity>();
      lists.add(this);
      for(Activity activity: lists)
      { 
   
      activity.finish();
      }
       lists.remove(this);

3、发送特定广播:在需要结束应用时,发送一个特定的广播,每个 Activity 收到广播后,关闭即可。

//给某个 activity 注册接受接受广播的意图

registerReceiver(receiver, filter)
//如果过接受到的是 关闭 activity 的广播 就调用 finish()方法 把当前的 activity finish()掉

4、递归退出:在打开新的 Activity 时使用 startActivityForResult,然后自己加标志,在 onActivityResult 中处理,递归关闭。

5、其实 也可以通过 intent 的 flag 来实现 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)激活一个新的 activity。此时如果该任务栈中已经有该 Activity,那么系统会把这个 Activity 上面的所有 Activity 干掉。其实相当于给 Activity 配置的启动模式为 SingleTop。


14、Activity-Window-View三者的关系

Activity:是安卓四大组件之一,负责界面展示、用户交互与业务逻辑处理;
Window:是负责界面展示以及交互的职能部门,就相当于Activity的下属,Activity的生命周期方法负责业务的处理;
View:是放在Window容器的元素,Window是View的载体,View是Window的具体展示。

Activity通过Window来实现视图元素的展示,window可以理解为一个容器,盛放着一个个的view,用来执行具体的展示工作。


关于整理问题

当全部整理完毕后将整理成pdf格式,以方便阅读,文件获取如下图(10月8日后)


在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/143506.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • php开发微信公众号步骤_微信公众平台php对接

    php开发微信公众号步骤_微信公众平台php对接1.SAE数据库的连接。需要主机名和端口,以后的使用是一样的。@$db=newmysqli(SAE_MYSQL_HOST_M.’:’.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS,’你的应用名’);2.XML的处理。微信发送的消息格式都是XML格式,你返回的消息也必须是XML格式。从XML里提取数据,用SimpleXML,强大…

  • navicat premium 激活码【永久激活】[通俗易懂]

    (navicat premium 激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.cn/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~MLZP…

  • Pycharm社区版创建Flask项目详解「建议收藏」

    Pycharm社区版创建Flask项目详解「建议收藏」一、在原有工程上修改1、创建工程选择newproject创建工程输入项目名,选择配置好的虚拟环境项目创建好之后是一个空的项目,里面没有任何文件,下面我们来新建工程目录2、配置工程目录在工程根目录新建app.py文件在app.py中的代码如下:fromflaskimportFlask,render_templateapp=Flask(__name__)app.config[‘SECRET_KEY’]=’1456719640@qq.com’@app.rou

  • 日记本[通俗易懂]

    日记本[通俗易懂]1、懒人版安装教程:http://zengwu3915.blog.163.com/blog/static/278348972013448020461/

  • AdventureWorks2008 数据库安装

    AdventureWorks2008 数据库安装我使用的操作系统是win8.1,由于对早前安装的sqlserver2008的兼容性不太好,要安装对应的servicepack来解决一下这个问题。如何使用SQLServer在Windo

  • 关于python中format占位符中的 {!} 参数[通俗易懂]

    关于python中format占位符中的 {!} 参数[通俗易懂]在看celery的时候,发现里面有这么一句print('Request:{0!r}'.format(self.request))关于里面的是什么意思翻了一下文档。文档里是这么

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号