安卓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语句。

你可能感兴趣的:(Android面试题,面试,Android,java)