Android面试相关

Android 的四⼤组件有哪些?

Activity、Service、ContentProvider、BroadcastReceiver。


请描述下 Activity 的⽣命周期?

onCreate、onStart、onResume、onPause、onStop、onDestroy、onRestart。

程序横竖屏切换,Activity的生命周期:

1.AndroidManifest没有设置configChanges属性

竖屏启动:

onCreate -->onStart-->onResume

切换横屏:

onPause -->onSaveInstanceState -->onStop -->onDestroy -->onCreate-->onStart -->

onRestoreInstanceState-->onResume -->onPause -->onStop -->onDestroy       

(Android 6.0 Android 7.0 Android 8.0)

横屏启动:

onCreate -->onStart-->onResume

切换竖屏:

onPause -->onSaveInstanceState -->onStop -->onDestroy -->onCreate-->onStart -->

onRestoreInstanceState-->onResume -->onPause -->onStop -->onDestroy 

总结:没有设置configChanges属性Android 6.0 7.0 8.0 系统手机 表现都是一样的,当前的界面调用onSaveInstanceState走一遍流程,然后重启调用onRestoreInstanceState再走一遍完整流程,最终destory。

2.AndroidManifest设置了configChanges   android:configChanges="orientation"

竖屏启动

onCreate -->onStart-->onResume

切换横屏

onPause -->onSaveInstanceState -->onStop -->onDestroy -->onCreate-->onStart -->

onRestoreInstanceState-->onResume -->onPause -->onStop -->onDestroy        

(Android 6.0)

onConfigurationChanged-->onPause -->onSaveInstanceState -->onStop -->onDestroy -->

onCreate-->onStart -->onRestoreInstanceState-->onResume -->onPause -->onStop -->onDestroy        

(Android 7.0)

 onConfigurationChanged    

(Android 8.0)

 横屏启动

onCreate -->onStart-->onResume

切换竖屏:

onPause -->onSaveInstanceState -->onStop -->onDestroy -->onCreate-->onStart -->

onRestoreInstanceState--> onResume -->onPause -->onStop -->onDestroy        

(Android 6.0 )  

onConfigurationChanged-->onPause -->onSaveInstanceState -->onStop -->onDestroy -->

onCreate-->onStart -->onRestoreInstanceState-->onResume -->onPause -->onStop -->onDestroy        

(Android 7.0)

onConfigurationChanged    

(Android 8.0)

总结:设置了configChanges属性为orientation之后,Android6.0 同没有设置configChanges情况相同,完整的走完了两个生命周期,调用了onSaveInstanceState和onRestoreInstanceState方法;Android 7.0则会先回调onConfigurationChanged方法,剩下的流程跟Android 6.0 保持一致;Android 8.0 系统更是简单,
只是回调了onConfigurationChanged方法,并没有走Activity的生命周期方法。

3.AndroidManifest设置了configChanges   

android:configChanges="orientation|keyboardHidden|screenSize" 

竖(横)屏启动:onCreate -->onStart-->onResume
切换横(竖)屏:onConfigurationChanged   (Android 6.0 Android 7.0 Android 8.0)

总结:设置android:configChanges="orientation|keyboardHidden|screenSize"  则都不会调用Activity的其他生命周期方法,只会调用onConfigurationChanged方法。

     

如何退出 Activity?如何安全退出已调⽤多个 Activity 的 Application?

调⽤ Activity 的 finish ⽅法可以退出当前 Activity。可以⾃定义⼀个Application,在 Application 中声明⼀个成员变量 ArrayList ⽤于存放打开的 Activity,当退出时遍历 ArrayList,依 次调⽤ Activity 的 finish⽅法。

Android 的五大布局

LinearLayout、RelativeLayout、FrameLayout、AbsoluteLayout、TableLayout

 Android 的数据存储⽅式

SharedPreference、XML、SQLite、⽂件存储

Intent的概念:

Intent是一种运行时绑定(run-time binding)机制,它是一种基于某种想要被表露的意图的被动式数据结构,它能在程序运行过程中连接两个不同的组件

Intent的传递方式

四大基本组件中,Activity、Service、BroadcastReceiver 都需要通过Intent机制来激活,不同的组件需要不同的Intent传递方式

Intent一旦发出,Android都会准确找到相匹配的一个或多个Activity,Service或者BroadcastReceiver作响应。所以,不同类型的 Intent 消息不会出现重叠,即Broadcast的Intent消息只会发送给BroadcastReceiver,而决不会发送给Activity或者Service。由startActivity()传递的消息也只会发给Activity,由startService()传递的Intent只会发送给Service。

Activity、Intent、Service 以及他们之间的关系

Activity 负责界⾯的显⽰和⽤户的交互,Intent 封装了数据,可以实现 Activity 之间以及 Activity 和 Service 之间数据的传递。Service 运⾏在后台进程,⼀般我们会让给其运⾏⼀些后台任务,Activity 通过StartService(Intent)或者 BindService(  Intent)可以启动 Service。

Service是什么?

Service(服务)是一个一种可以在后台执行长时间运行操作而没有用户界面的应用组件。

  • 定义:服务,是Android四大组件之一, 属于 计算型组件
  • 作用:提供 需在后台长期运行的服务

如:复杂计算、音乐播放、下载等

  • 特点:无用户界面、在后台运行、生命周期长

Service的生命周期里,常用的有:

手动调用方法 作用
startService() 启动服务
stopService() 关闭服务
bindService() 绑定服务
unbindService() 解绑服务
  • 5个自动调用的方法
内部自动调用的方法 作用
onCreat() 创建服务
onStartCommand() 开始服务
onDestroy() 销毁服务
onBind() 绑定服务
onUnbind() 解绑服务

 ContentProvider 是如何实现数据共享的

我们可以定义⼀个类继承 ContentProvider,然后覆写该类的insert、delete、update 等⽅法,在 这些⽅法⾥访问数据库等资源。同时将我们 ContentProvider 注册在 AndroidManifest ⽂件中,其他应 ⽤需要使⽤的时候只需获取 ContentResolver,然后通过 ContentResolver进行对数据库的增删改查

Fragment的概念:

简单来说,Fragment其实可以理解为一个具有自己生命周期的控件,只不过这个控件又有点特殊,它有自己的处理输入事件的能力,有自己的生命周期,又必须依赖于Activity,能互相通信和托管。

Fragment的生命周期:

onAttach,onCreate,onCreateView,onActivityCreated,onStart,onResume,onPause,onStop,onDestroyView,onDestroy,onDetach

Fragment  Activity 之间是如何实现值传递的?

Activity 可以先获取 FragmentSupportManager 或者FragmentManager,前者是
 v4 包下的,向下兼容因此⽤的⽐较多。然后这些 Manager 通过Fragment 的 tag 或者 id 调⽤ findFragmentByTag("tag"),findFragmentById("id")找到我们需要的 Fragment 对象,然后通过 调⽤ Fragment 对象的⽅法来进⾏值的传递。

弱引⽤是怎么使⽤的?

WeakRefrence 是⼀个类,在 ArrayList 中我们把这个类作为对象传递进去,把我们的图⽚放在 WeakRefrence ⾥⾯,这样当 davlik 虚拟机内存不够⽤的时候,就会把 WeakRefrence 对象回收掉,这 样我们在 WeakRefrence ⾥⾯保存的数据也被回收了。

MD5 的原理?

MD5 算以 512 位分组来处理输⼊的信息,且每⼀分组又被划分为 16  32 位⼦分组, 经过了复杂处理后,输出由四个 32 位分组组成,将这四个 32 位分组级联后将⽣成⼀个 128 位散列值。这个过程是不 可逆的,我们也把他叫做数据指纹,但是我们依然对⽤户的输⼊进⾏安全校验,如果是纯数字类型密码,是不 允许注册的,因此就算你 MD5 加密了,⿊客也可以通过彩虹碰撞的形式进⾏暴⼒破解。

BroadCastReceiver的理解?

BroadCastReceiver为广播接收器,它用于接收广播intent。

广播是一种广泛运用在应用程序之间传输信息的机制。而 BroadcastReceiver 是对发送出来的广播进行过滤接收并响应的一类组件;BroadcastReceiver 自身并不实现图形用户界面,但是当它收到某个通知后,BroadcastReceiver可以启动Activity作为响应, 或者通过 NotificationMananger提醒用户,或者启动 Service 等等。

Android 中都有哪些组件需要在清单⽂件中注册?

⼀般来说四⼤组件都需要在 AndroidManifest.xml 中进⾏注册,不过其中 Activity、 Service、ContentResolver 是必须注册的,⽽BroadCastReceiver 可以在清单⽂件中注册,也可以不 注册,这也分别叫做静态注册和动态注册。

View 的绘制过程?

View 绘制是从根节点(Activity  DecorView)开始,他是⼀个⾃上⽽下的过程。View 的绘制经历 三个过程:MeasureLayoutDraw

ListView 的优化

ListView 的优化有多种多样的策略。在我们的项⽬中主要做了如下优化。1、重⽤ ConvertView2、给 ConvertView 绑定ViewHolder,3、分页加载数据,4、使⽤缓存。前两个是通⽤的解决⽅案,后两个是针对我们业务的个性化解决⽅案。我们的数据来⾃服务端,如果服务端有 1000 条数据 的话,我们客户端不可能傻⽠式的⼀次性⽤ ListView 把这些数据全部加载进来,因此我们就⽤分页加载 数据,每次加载 20 页,当⽤户请求更多的时候再获取更多数据,⽹络的访问就算⽹速再快也多多少少会有 ⼀定的延迟,因此我们的⽹络请求是异步处理的,同时从⽹络加载来的数据使⽤了 2 级缓存来处理,第⼀级 是内存级别的缓存,第⼆级是本地⽂件的缓存。当 ListView 加载数据的时候⾸先从内存中找,如果找不 到再去本地⽂件中找,只有都找不到的情况下才去请求⽹络。

 Github 上都⽤到过什么控件?

Github 上的开源项⽬⾮常的多,基本上你想⽤的东西都有,⽐如xUtilsHelloCharts ClanderSlideMenuSeatTableLDrawerSmoothProgressTouch GalleryViewPagerIndicator

介绍⼀下 handler 机制?

Android  handler 多⽤于主线程和⼦线程之间的通信,⽐如在 Android 中⼦线程是不允许修改 UI 的,如果修改只能让⼦线程给主线程通过 handler 发送 message,然后主线程进⾏修改。Handler 整个机制的实现,还依赖 LooperMessage 两个核⼼内容。在主线程中Android 默认给我们创建了 Looper

Looper的概念:

Looper是android为线程间异步消息通信提供的一种机制,利用Looper机制可以方便我们实现多线程编程时线程间的相互沟通。

Looper相当于是一个死循环,当有任务执行时会循环执行任务,当任务执行完毕,将会进入休眠状态。

finalfinallyfinalize 的区别?

第⼀个是关键字最终,⽤ final 修饰的类为最终类,不能被继承,修饰的⽅法不能被覆写,修饰的变量 不能被改变。finally 是异常体系中的关键字,当系统遇到异常是,在进⾏ trycatch 的时候,finally 代码块⾥的代码是必须被执⾏的。finalize 是 Object 类中的⽅法,当 GC 回收对象时回调的⽅法。

heap  stack 的区别?

堆和栈。栈存放对象的引⽤,堆存放对象实体。堆中的对象是有 jvm 的垃圾回收器负责回收。

java 基础部分

static final

static有三种形式,静态方法,静态变量,静态代码块。
静态在随着类加载的时候就一起加载。
静态只能调用静态变量;
静态方法只能调用静态方法;
不能以任何形式引用this,super;
静态方法的调用不依附于实例对象
final
在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。
当修饰类的时候,该类不能被继承。
当修饰方法的时候,该方法不能被重写。
当修饰变量的时候,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

list

ArrayList 数组结构,线程不安全的,查询速度快。
LinkedList 链表结构,线程不安全,插入和删除的速度快。
vector 数组结构,线程安全。无论增删或者查询效率都很低。被ArrayList替代。

set

存入set的每个元素都必须是唯一的,因为set不保存重复元素。

HashSet 哈希表结构,为快速查找而设计,效率高
TreeSet 二叉树结构,使用它可以从set中提取有序的序列。 

map

HashMap基于散列表的实现,可以存储键值对形式的数据,可以null键值,效率高,线程不安全。
LinkedHashmap 基于hashmap的结构之上,其默认获取数据的顺序是插入顺序。也可以通过构造方法设置为最近最少使用的次序(LRU)。
TreeMap基于红黑树的实现,查看数据的时候,会被排序。

线程

1.继承Thread
2.实现Runable接口
3.实现Callable,和Runable的区别是有回调方法。
区别 :实现Runable接口扩展性更好,因为继承只能单向继承

面向对象,封装、继承、多态

封装:隐藏实现细节,提高程序的复用性和维护性
继承:子类继承父类,表明子类拥有父类的属性和方法(注意是public protected修饰符的)
多态:父类引用指向子类对象
抽象类和接口的区别
抽象类是abstract修饰的类,表示该类不足以描述一个具体的事物或者对象,就叫抽象类。
接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为或者功能。

抽象类可以存在非抽象的方法和变量。接口中除了static、final变量,不能有其他变量
抽象类可以有构造器,但接口不能有。
抽象类的方法可以用public、protected和default这些修饰符,但接口只能用public修饰。

抽象类是继承关系,而接口是实现关系。

猜你喜欢

转载自blog.csdn.net/qq_41898048/article/details/82854118