Android面试中经常遇到的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010223904/article/details/46824149

Android的四大组件

四大组件的共同点是,要想使用,都要在AndroidManifest.xml里面进行注册。

1. Activity

Activity的生命周期

首先,Activity有七个表示不同阶段的回调函数。
onCreate onStart onResume onPause onStop onDestroy onRestart
下面这张图表示的是Activty完整的生命周期。
这里写图片描述
在pause和stop状态下Activity都有可能被回收
可以分为三个不同的生命周期。分别是:

  • entire lifetime
    onCreate->onStart->onResume->onPause->onStop->onDestroy
  • visible lifetime
    此时Activity是可见的
    onStart->onResume->onPause
  • foreground lifetime
    此时可以Acticity是可见的,并且可以接受用户的交互
    onResume->onPause

Activity的启动模式

通过在AndroidManifest.xml文件里面配置< activity >标签的android:LaunchMode属性来决定Activity的启动模式

standard

默认的启动模式。
每次要启动这个Activity的时候,不管当前的返回栈中是否已经有了这个Activity的实例,都会生成一个把这个Activity的一个新的实例入栈。

singleTop

当要启动的Activity有位于返回栈栈顶的实例的时候,不创建新的实例入栈;否则,创建一个新的实例并入栈。

singleTask

放要启动一个Activity的时候,首先查看整个返回栈中有没有这个Activity的实例,如果有的话(不管在不在栈顶),就把这个实例之前的其他实例出栈,使得这个实例移到栈顶,变成当前Activity;如果没有发现已有的实例,还是创建一个新的实例并入栈。

singleInstance

每个进程维护一个返回栈,表示这个进程启动过的Activity。当Activity是这个启动模式的时候,第一次启动这个Activity的时候这个Activity的实例不会入当前的返回栈,而是创建一个新的返回栈并入栈。

2. Service

Local Service —————-运行在主进程中
Remote Service————– 运行在单独的进程中

service的生命周期

这里写图片描述

Service的两种状态

started

A service is “started” when an application component (such as an activity) starts it by calling startService().

bound

A service is “bound” when an application component binds to it by calling bindService().

既被start又被绑定的service生命周期
这里写图片描述

只有Service, ContentProvider, Activity才能和Service进行bind,Broadcast Receiver不行。
要想实现和Service的交互,可以通过serviceConnection接口。
用一个类实现serviceConnection接口,重写onServiceConnected()方法和onServiceDisconnected方法。然后把这个类的实例作为参数传给bindService()方法;在Service那边要重写onBind()方法,返回一个继承自Binder类MyBinder的类的实例,这个实例会被传递给上面的onServiceConnected方法(如果onBind()返回null,则不会有回调),如果我们在这个MyBinder类中写了可以获得Service实例的public方法(MyBinder可以作为Service的内部类),现在就可以通过这个方法来获得Service实例,然后就可以和Service进行交互了。需要注意的是,调用unbind()是不会回调serviceConnection接口中的onDisConnected()函数的。只有在未预期的情况下(比如service突然被kill)才会调用

当Service被调用startService或者bindService的时候,如果服务是没有在内存中的,那么就会执行onCreate和onStartCommand,如果Service此时是活跃的,只会执行onStartCmmand。started和bound并不冲突。当一个Service既started又bound的时候,当所有绑定的组件都unbindService调用了stopSelf()或者stopService两个条件都满足的时候才会被销毁。

Service的意义以及和Thread的区别

比如音乐播放,或者消息推送等,会用到Service。
Service和Thread是两个完全不同的概念。
除非特别指定,否则Service运行在当前进程的主线程里。Service是说想运行某些长时间的,不需要和用户交互的任务的时候用到。有服务的线程不容易被系统杀死。为了防止ANR,可以在服务中启动新的线程来执行任务。

3. Broadcast Receiver

4. Content Provider

ContentProvider和ContentResolver之间自动管理跨进程通信IPC
特定的查询方式避免了sql注入,



ListView的优化方法

getView方法
因为ListView每一个要绘制的item是用过与之绑定的adapt的getView方法返回的,所以中心思想是要尽量减少在getView方法中所做的事情。
复用getView(int position, view covertView, viewGroup parent)中的covertView,就可以避免每次都要inflate,很费时。省去从xml布局文件映射到内存中各个view的时间。
viewholder
使用一个viewHolder类,里面的属性是listView中的每个item中包含的view。当inflate的时候,使用setTag把赋好值的viewHolder给和item关联起来,当covertView不为null的时候,直接用getTag得到之前的viewHolder,省去findViewByView()的时间
异步加载图片

滑动的时候不去加载item

图片缓存

recycleView(android L)
ListView的替代类,性能更好。


数据持久化存储的几种方法

1. Shared Preference

2. SQLite

3. Content Provider

4. 文件系统


Android的布局有哪几种,分别有什么特点


多线程,以及Handler、Message、Looper的作用和原理

java中的多线程


view的重写

view.post()方法

猜你喜欢

转载自blog.csdn.net/u010223904/article/details/46824149