文章标题

来源:互联网 发布:js如何让下拉菜单 编辑:程序博客网 时间:2024/06/02 04:29

面试总结

Android四大组件:

Activity :
1).生命周期 Oncreate(正在被创建);OnRestate(启动);OnStatic(正在被启动);OnResume(已经可见);OnPause(正在停止);OnStop(停止);OnDestroy(销毁)。
2). 作用:是Activity 应用程序的一个用户接口;用户和应用程序直接进行交互的接口;
3).启动模式 在android里,有4种activity的启动模式,分别为:
“standard” (默认)
“singleTop”
“singleTask”
“singleInstance”
4).Activity 开始触发 由Home键 ,重写OnStaveinstanceState 方法,后销毁;SetOnTouchListener(触摸屏实现类);
触发事件:DispatchTouchEvent; OnUserInteraction; OnTouchEvent;

.Service:
后台服务于Activity,封装有一个完整的功能逻辑实现,接受上层指令,完成相关的食物,定义好需要接受的Intent提供同步和异步的接口;
常用到两个方法:1)StartService() 方法启用服务,调用者与服务没有关连;调用者退出,服务仍然运行;2).bindService() 方法启动时,调用者与服务绑定在一起,调用者一但退出,服务也就退出;

.ContentProvider
当应用继承.ContentProvider类时,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。

BroadCastReceiver
1)第一种不是常驻型,广播跟随着程序的生命周期;
2)第二种常驻型,当应用程序关闭后,如果用信息广播来,程序也会被系统调用自动运行。

Android常用五种布局
FragmentLayout(框架布局),LinearLayout(线性布局); Relativelayout(相对布局);Tablelayout(表格布局);Absolutelayout(绝对布局)

Android 动画
一种是Tween动画,这种实现组件可以移动、放大、缩小以及产生透明度的变化;
一种是Fraem动画,传统的动画,通过顺序播放排列的图片来实现;

android 内存溢出:指的是内存中没有足够的空间使用;例如在ListView中不断的滚动加载图片或者数据的时候会出现,如果不用LurCacher 管理缓存图片的加载的话,就会不断地加载app内存的上线;出现OOM;
Android 内存泄漏:Android内存泄漏指的是进程中某些对象(垃圾对象)已经没有使用价值了,但是它们却可以直接或
间接地引用到gc roots导致无法被GC回收。无用的对象占据着内存空间,使得实际可使用内存变小,
形象地说法就是内存泄漏了。
场景
1、类的静态变量持有大数据对象;
2、静态变量长期维持到大数据对象的引用,阻止垃圾回收。
3、非静态内部类的静态实例
4、非静态内部类会维持一个到外部类实例的引用,如果非静态内部类的实例是静态的,就会间接长期
维持着外部类的引用,阻止被回收掉。
5、资源对象未关闭,资源性对象如Cursor、File、Socket,应该在使用后及时关闭。未在finall
y中关闭,会导致异常情况下资源对象未被释放的隐患。
6、注册对象未取消注册会导致观察者列表里维持着对象的引用,阻止垃圾回收。
7、Handler临时性内存泄露,Handler通过发送Message与主线程交互,Message发出之后是存储
在MessageQueue中的,有些Message也不是马上就被处理的。在Message中存在一个target,是H
andler的一个引用,如果Message在Queue中存在的时间越长,就会导致Handler无法被回收。如果
Handler是非静态的,则会导致Activity或者Service不会被回收。
8、AsyncTask内部也是Handler机制,同样存在内存泄漏的风险。
此种内存泄露,一般是临时性的。

Fragment 的生命周期是: OnAttache(); OnCreate(); OnCreateView(); OnActivityCreated(); OnStart(); OnResume(); OnDestoryView();
1Fragment与Activity 之间的区别是:1)Activity 停止时被系统自动停止栈;
2)Fragent 是被压入Activity 管理的一个退栈,删除Fragment;调用的是,DdToBackStarck()方法;

MVC 和MVP
1.MVC指的是:模型;视图;控制器;
1)M-Model :业务逻辑,实体模型;2)V:布局文件UI ;3)C-控制器;
2.MVP指的是:模型;视图;控制器;
1)M-Model:模型中的业务逻辑;2)V: View ,布局和Activity ; 3)C-完成View 和Model 之间的交互 presenter;

Android 进程和线程
1.进程:是一个具有独立功能的程序,相互独立;IPC 通信;
1).IPC(垮进程之间的通信) 适用的场景:Bundle 适用于四大组件之间的进程间通信;
文件共享:无并发访问情形,交互简单的数据实时性不高的场景;
AIDL:全称是:Android Interface Define Language;一对多通信且有RPC需求;
Messenger: 低并发的一对多即时通信,无RPC需求;
ContentProvider: 一对多的进程间的数据共享;
Socket: 网络数据交换;
2)进程优先级
从高到低分为:前台进程;可视进程;服务进程;后台进程;空进程;
 前台进程
  前台进程是用户当前正在使用的进程。只有一些前台进程可以在任何时候都存在。他们是最后一个被结束的,当内存低到根本连他们都不能运行的时候。一般来说, 在这种情况下,设备会进行内存调度,中止一些前台进程来保持对用户交互的响应。

  如果有以下的情形的那么就是前台进程:

  这个进程运行着一个正在和用户交互的Activity(这个Activity的onResume()方法被调用)。

  这个进程里有绑定到当前正在和用户交互的确Activity的一个service。

  这个进程里有一个service对象,这个service对象正在执行一个它的生命周期的回调函数(onCreate(), onStart(), onDestroy())

  这个进程里有一个正在的onReceive()方法的BroadCastReiver对象。

  可见进程

  可见进程不包含前台的组件但是会在屏幕上显示一个可见的进程是的重要程度很高,除非前台进程需要获取它的资源,不然不会被中止。

  如果有如下的一种情形就是可见进程:

  这个进程中含有一个不位于前台的Activity,但是仍然对用户是可见的(这个Activity的onPause()方法被调用),这是很可能发生的,例如,如果前台Activity是一个对话框的话,就会允许在它后面看到前一个Activity。

  这个进程里有一个绑定到一个可见的Activity的Service。

  服务进程

  运行着一个通过startService() 方法启动的service,这个service不属于上面提到的2种更高重要性的。service所在的进程虽然对用户不是直接可见的,但是他们执行了用户非常关注的任务(比如播放mp3,从网络下载数据)。只要前台进程和可见进程有足够的内存,系统不会回收他们。

  后台进程

  运行着一个对用户不可见的activity(调用过 onStop() 方法).这些进程对用户体验没有直接的影响,可以在服务进程、可见进程、前台进 程需要内存的时候回收。通常,系统中会有很多不可见进程在运行,他们被保存在LRU (least recently used) 列表中,以便内存不足的时候被第一时间回收。如果一个activity正 确的执行了它的生命周期,关闭这个进程对于用户体验没有太大的影响。

  空进程

  未运行任何程序组件。运行这些进程的唯一原因是作为一个缓存,缩短下次程序需要重新使用的启动时间。系统经常中止这些进程,这样可以调节程序缓存和系统缓存的平衡。

  Android 对进程的重要性评级的时候,选取它最高的级别。例如,如果一个进程含有一个service和一个可视activity,进程将被归入一个可视进程而不是service进程。

  另外,当被另外的一个进程依赖的时候,某个进程的级别可能会增高。一个为其他进程服务的进程永远不会比被服务的进程重要级低。因为服务进程比后台activity进程重要级高,因此一个要进行耗时工作的activity最好启动一个service来做这个工作,而不是开启一个子进程――特别是这个操作需要的时间比activity存在的时间还要长的时候。例如,在后台播放音乐,向网上上传摄像头拍到的图片,使用service可以使进程最少获取到“服务进程”级别的重要级,而不用考虑activity目前是什么状态。broadcast receivers做费时的工作的时候,也应该启用一个服务而不是开一个线程。

2.线程:一个实体,比进程小的基本不用系统单元,直接读写进程;
 线程在代码是使用标准的java Thread对象来建立,那么在Android系统中提供了一系列方便的类来管理线程——Looper用来在一个线程中执行消息循环,Handler用来处理消息,HandlerThread创建带有消息循环的线程。
 简单的说,Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再有Handler进行Message的分发和处理.
Message Queue(消息队列):用来存放通过Handler发布的消息,通常附属于某一个创建它的线程,可以通过Looper.myQueue()得到当前线程的消息队列
Handler:可以发布或者处理一个消息或者操作一个Runnable,通过Handler发布消息,消息将只会发送到与它关联的消息队列,然也只能处理该消息队列中的消息
Looper:是Handler和消息队列之间通讯桥梁,程序组件首先通过Handler把消息传递给Looper,Looper把消息放入队列。Looper也把消息队列里的消息广播给所有的
Handler:Handler接受到消息后调用handleMessage进行处理
Message:消息的类型,在Handler类中的handleMessage方法中得到单个的消息进行处理
在单线程模型下,为了线程通信问题,Android设计了一个Message Queue(消息队列), 线程间可以通过该Message Queue并结合Handler和Looper组件进行信息交换

Android 图片缓存
1).本地:通过异步加载、本地缓存:如Handler机制;AsyncTask;SDcard保存;
2).内存保存:软引用(SoftReference) 保存一定的量,设置过期时间,LRU算法;
3).通过网络:Http ,以集合键值对的形势存储;

ViewPager
1).用到继承PagerAdapter 基类,主要用到destroyItem(删除页卡)和doinstantiateItem(添加页卡);

自定义View
用到OnMeasure()方法;对象是getMeasuredWith和getMeasuredHeight;
View 滑动冲突
1.外部滑动方向和内部滑动的方向不一致;
2.外部滑动方向和内部滑动的方向一致;
3.上面的两种情况的嵌套;
处理:1.是外部拦截法,点击事情都先经过父容器的拦截处理,需要重写onInterceptTouchEvent方法;
2.内部拦截法,指父容器不做任何的拦截事件,所有的事件都传递给子元素;需要重写dispatchTouchEvent方法;

Android 性能优化
一是JAVA语法层次通用的优化,如尽量使用局部变量(栈变量),IO缓冲等。
二是通用的Android性能优化,如同步改异步,各种缓存的使用等
三是应用程序内部的性能优化,如内部逻辑、数据插入及查找、数据结构的安排与组织等

原创粉丝点击