安卓Java面试题41-50

🔥41、 综合阐述Activity的生命周期?🔥

在正常情况下,Activity 会经历以下 7 个生命周期。

onCreate:

表示 Activity 正在被创建, 是生命周期的第一个方法.。

这个方法的作用是做一些初始化工作,比如在这里使用 setContentView 加载页面布局资源,做一些控件和变量的初始化工作和所需数据等。
onRestart:

表示 Activity 正在重新重启。

一般情况下,当前 Activity 从不可见重新变为可见状态时,都会调用这个方法。

这种情形一般都是用户的行为导致的,比如用户按下 Home 键或者打开了一个新的 Activity,当前的 Activity 就会暂停,也就是 onPause 和 onStop 被执行了,接下来用户又回到了这个 Activity,这个方法就会被调用。

一般情况下,这个方法我们不做任务操作。
onStart :

表示 Activity 正在被启动,这个时候 activity 已经可见,但是还没到前台,用户还无法进行交互。

在这里也可以做一些初始化工作,但官方推荐在 OnCreate 中做。
onResume:

表示 Activity 已经可见了,并且已经出现在前台可以进行交互活动了 。
onPause:

表示 Activity 正在停止,正常情况下,紧接着,onStop 方法就会被调用。

在特殊情况下,如果这个时候快速回到当前 Activity,那么 onResume 方法就会被调用。

这个时候 我们可以做一些数据存储、动画停止等工作,但是不能太耗时。

因为在跳转 Activity 时只有当一个 Activity 执行完了 onPause 方法后另一个 Activity 才会启动,而且 android 中指定如果 onPause 在 500ms 即 0.5 秒内没有执行完毕的话就会强制关闭 Activity。
onStop:

表示 Activity 即将停止,此时Activity已经不可见了,但是Activity对象还在内存中,没有被销毁。可以做一些资源的回收工作,也不能太耗时。
onDestroy:

表示 Activity 即将被销毁,这是 Activity 生命周期的最后一个回调方法,我们可以将最终的资源释放,以及进行一些回收工作。

🔥 42、 Activity的启动模式有几种?🔥

1.默认启动模式------standard

Activity的默认模式就是standard。在该模式下,启动的Activity会依照启动顺序被依次压入Task中:
2.栈顶复用模式------singleTop

在该模式下,如果栈顶Activity为我们要新建的Activity(目标Activity),那么就不会重复创建新的Activity。
3.栈内复用模式------singleTask

与singleTop模式相似,只不过singleTop模式是只是针对栈顶的元素,而singleTask模式下,如果task栈内存在目标Activity实例,将task内的对应Activity实例之上的所有Activity弹出栈, 将对应Activity置于栈顶,获得焦点。
4.全局唯一模式------singleInstance

在该模式下,我们会为目标Activity分配一个新的affinity,并创建一个新的Task栈,将目标Activity放入新的Task,并让目标Activity获得焦点。

新的Task有且只有这一个Activity实例。

如果已经创建过目标Activity实例,则不会创建新的Task,而是将以前创建过的Activity唤醒(对应Task设为Foreground状态)

🔥 43、 简述Activity的缓存方法?🔥

我们知道在Activity 的onCreate方法有都有一个Bundle savedInstanceState对象,而Bundle 这个在API里的定义是:A mapping from String keys to various {@link Parcelable} values. 是一个map对象。
所以Activity里缓存的方法要从Bundle 入手,在Activity 提供两个方法,用于缓存和取缓存。

onSaveInstanceState(Bundle outState),onRestoreInstanceState(Bundle savedInstanceState)。
作用

Activity 的onSaveInstanceState和onRestoreInstanceState 并不是和onCreate()、onStart()等生命周期方法一样,按一定顺序执行。

这两个方法不一定每次都会执行,它们只有在特定情况下才会触发。

比如当应用可能发生意外情况(如:内存不足,旋转屏幕,按下Home,长按Home启动其他应用等)被系统销毁Activity时会触发onSaveInstanceState。

如果当用户主动去销毁Activity时,是不会被调用的。

所以通常情况下onSaveInstanceState只适合保存一些临时的状态,而onPause()适合用于数据的持久化保存。
onSaveInstanceState

先看Application Fundamentals上的一段话:

​ Android calls onSaveInstanceState() before the activitybecomes vulnerable to being destroyed by the system, but does not bothercalling it when the instance is actually being destroyed by a user action (suchas pressing the BACK key).

从这句话可以知道,当某个activity变得"容易"被系统销毁时,该activity的onSaveInstanceState()就会被执行,除非该activity是被用户主动销毁的,例如当用户按BACK键的时候。
注意上面的双引号,何为"容易"?意思就是说该activity还没有被销毁,而仅仅是一种可能性。

这种可能性有哪些?

通过重写一个activity的所有生命周期的onXXX方法,包括onSaveInstanceState()和onRestoreInstanceState() 方法,我们可以清楚地知道当某个activity(假定为activity A)显示在当前task的最上层时,其onSaveInstanceState()方法会在什么时候被执行,有这么几种情况:

当用户按下HOME键时。

这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,因此系统会调用onSaveInstanceState(),让用户有机会保存某些非永久性的数据。

长按HOME键,选择运行其他的程序时。

按下电源按键(关闭屏幕显示)时。

从activity A中启动一个新的activity时。

屏幕方向切换时,例如从竖屏切换到横屏时。
注意:

在onSaveInstanceState 方法里面一般我们默认实现super.onSaveInstanceState(outState);

此方法会默认自动保存Activity的UI状态,比如Edittext输入的值会恢复,而CheckBox控件会自动保存复选状态。

这里有一个条件,就是要为这些控件指定唯一的Id,即通过设置android:id属性即可。

剩余的事就交给onSaveInstanceState 自动完成。

由于onSaveInstanceState 只会保存跟UI有关的状态数据,那我们什么时候需要复写这个方法?我们在需要保存额外的数据时, 就需要覆写onSaveInstanceState()方法。****

onSaveInstanceState()方法调用不确定性,所以只适合保存瞬态数据, 比如UI控件的状态, 成员变量的值等,不能用来保存持久化的数据。持久化数据应该当用户离开当前的 activity时,在 onPause() 中保存(比如将数据保存到数据库或文件中)

onRestoreInstanceState

onRestoreInstanceState 和 onSaveInstanceState 并不是成对出现的,有时候在调用onSaveInstanceState 并没有出现onRestoreInstanceState的调用。比如我们按下home键返回到桌面时,此时马上又回到原来的应用Activity,onRestoreInstanceState就没有被调用,因为此时的Activity并没有被销毁,所以onRestoreInstanceState就没有被调用。

onRestoreInstanceState()在onStart() 和 onPostCreate(Bundle)之间调用。这个调用顺序要注意

🔥44、简述Fragment的生命周期,跟Activity有什么关系?🔥

Fragment是Activity的一个组件片段,也就是说他的生命周期是依赖于Activity的,但是它比Activity多了几个生命步骤
1,onAttach:

fragment 和 activity 关联时调用,且调用一次。在回调中可以将参数 content 转换为 Activity保存下来,避免后期频繁获取 activity。
2,onCreate:

和 activity 的 onCreate 类似
3,onCreateView:

准备绘制 fragment 界面时调用,返回值为根视图,注意使用 inflater 构建 View时 一定要将attachToRoot 指明为 false。
4,onActivityCreated:

activity 的onCreated 执行完时调用
**5,onStart:**可见时调用,前提是 activity 已经 started
**6,onResume:**交互式调用,前提是 activity 已经resumed
7,onPause:不可交互时调用
**8,onStop:**不可见时调用
9,onDestroyView:移除 fragment 相关视图时调用
**10,onDestroy:**清除 fragmetn 状态是调用
11,onDetach:

和 activity 解除关联时调用从生命周期可以看出,他们是两两对应的,如 onAttach和 onDetach ,onCreate 和 onDestory , onCreateView 和 onDestroyView等

🔥 45、 解释为什么在Service中创建子线程而不是Activity?🔥

因为假如在Activity中创建子线程的话,当Activity销毁的时候,这个时候重新再调用该Activity就会重新走新的生命周期,这个时候就无法再重新获取到刚才的子线程,而且如果在一个Activity中创建子线程,另一个Activity也无法操作该子线程,但是Service就不一样,所有的Activity都可以和Service关联,即使是Activity被销毁了,只要再重新建立联系就好了,所以,一般后台任务都是通过Service去控制的。

🔥46、 简述Intent可以传递哪些数据?如何传递?🔥

Intent可以传递String类型的,基本类型,还有对象,如果是基本类型,可以通过Intent的方法直接传递就好了,如果是对象的话,一般可以通过Bundle进行传递,有些对象需要进行序列化和包裹化。

🔥 47、 简述Android如何启动Service?🔥

有两种启动方式:

  1. 通过StartService启动Service

通过startService启动后,service会一直无限期运行下去,

当外部调用了stopService()或stopSelf()方法时,该Service才会停止运行并销毁

当系统资源不足时, 会回收一些不重要的service,service被系统回收也会停止运行并被销毁
2. 通过bindService启动Service

bindService启动服务特点:

bindService启动的服务和调用者之间是典型的client-server模式。

调用者是client,service则是server端。

service只有一个,但绑定到service上面的client可以有一个或很多个。

这里所提到的client指的是组件,比如某个Activity。

client可以通过IBinder接口获取Service实例,从而实现在client端直接调用Service中的方法以实现灵活交互,这在通过startService方法启动中是无法实现的。

bindService启动服务的生命周期与其绑定的client息息相关。

当client销毁时,client会自动与Service解除绑定。

当然,client也可以明确调用Context的unbindService()方法与Service解除绑定。

当没有任何client与Service绑定时,Service会自行销毁

🔥 48、广播的动态注册和静态注册有什么区别?🔥

动态注册和静态注册的区别:

动态注册的广播接收器可以自由的控制注册和取消,有很大的灵活性。

但是只能在程序启动之后才能收到广播,此外,不知道你注意到了没,广播接收器的注销是在onDestroy()方法中的。

所以广播接收器的生命周期是和当前活动的生命周期一样。

静态注册的广播不受程序是否启动的约束,当应用程序关闭之后,还是可以接收到广播。

标准广播和有序广播的接收和发送都是全局性的,这样会使得其他程序有可能接收到广播,会造成一定的安全隐患。

为了解决这个问题,Android系统中有一套本地广播的机制。

这个机制是让所有的广播事件(接收与发送)都在程序内部完成。

主要是采用的一个localBroadcastReceiver对广播进行管理。

🔥49、 简述Android存储形式有几种?🔥

1.SQLite方式,SQLite是一个轻量级的数据库, 支持基础的SQL语法,官方提供了一个SQLiteDatabase的类,并提供一些api。

2.SharedPreference:存储简单的参数信息,本质上是xml.

3.File:文件存储,常用来存储大数据量的数据,但是更新麻烦。

4.ContentProvide,一般情况下数据在各个应用中是私密的,但是因为它也是可以用来存储分享数据。

5.网络存储,将数据放到网络云里面,然后通过网络进行访问。

🔥 50、 Android SQLite的基础操作?🔥

首先需要创建库和表,并且需要继承SQLiteOpenHelper类,然后在这个表里面实现增删改查的方法,可以用Android官方封装好的方法进行,也可以调用SQL语句进行操作。

调用SQLiteDatabase中的execSQL方法操作SQL语句。

相关推荐
xcl092524 分钟前
北京24小时自助健身房系统软件开发实战:从架构到部署全流程指南
java·spring boot·架构
一 乐2 小时前
动漫书销售商城|基于springboot + vue动漫书销售商城(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕业设计
卓怡学长2 小时前
w214基于jsp知道特产网
java·intellij-idea
步行cgn2 小时前
Spring 注解使用详解
java·spring
其实防守也摸鱼3 小时前
Fastjson 反序列化漏洞(JNDI注入)
android·数据库·安全·oracle·自动化·fastjson·反序列化
一条小小yu3 小时前
Spring IoC的理解
java·后端·spring
落魄实习生3 小时前
Agent Scope Java 2.x 系列【7】工具使用
java·开发语言·ai
旺仔学长 哈哈3 小时前
springboot钓鱼爱好者交流平台APP设计与实现
java·spring boot·mysql·充电桩管理系统
狗凯之家源码网4 小时前
微博图床 PHP 系统搭建与实战应用指南
android·开发语言·php