面试题
1.五大布局包含哪些
LinearLayout线性布局
android:layout_weight 权重,占比
android:padding 上下左右四个方向的内边距
RelativeLayout相对布局
android:layout_centerInParent 中间
android:layout_centerHorizontal 水平居中
android:layout_alignParentBottom 底部
TableLayout表格布局
里面每一行TableRow,TableRow继承自LinearLayout
FrameLayout所有的子元素都不能被指定放置的位置,它们统统放于这块区域的左上角,并且后面的子元素直接覆盖在前面的子元素之上,将前面的子元素部分和全部遮挡。
AbsoluteLayout绝对布局,在此布局中的子元素的android:layout_x和android:layout_y属性将生效,用于描述该子元素的坐标位置。屏幕左上角为坐标原点(0,0),第一个0代表横坐标,向右移动此值增大,第二个0代表纵坐标,向下移动,此值增大。在此布局中的子元素可以相互重叠。在实际开发中,通常不采用此布局格式,因为它的界面代码过于刚性,以至于有可能不能很好的适配各种终端
3.fragment生命周期和传值
oncreate,onstart,onstop,onresume,ondestroy,onpause,onAttach,onCreateView,onDettach,onDestroyView
Serializable接口、Bundle传递
4.ListView适配器有哪些
1.ArrayAdapter 使用最为简单,以数据集合为基础,只显示一行文本。
2.SimpleAdapter 具有很好的扩种性,可以自定义出各种各样的布局
3.SimpleCursorAdapter 就是方便把从游标得到的数据进行列表显示,并可以把指定的列映射到对应的组件中
4..BaseAdapter 继承于BaseAdapter,自定义的Adapter,在getView()方法进行数据优化。
5.ListView为什么要优化,优化原理
1)convertView复用,对convetView进行判空,当convertView不为空时重复使用,为空则初始化,从而减少了很多不必要的View的创建
2)定义一个ViewHolder,封装Listview Item条目中所有的组件,将convetView的tag设置为ViewHolder,不为空时通过ViewHolder的属性获取对应组件即可
3)当ListView加载数据量较大时可以采用分页加载和图片异步加载
handler的原理?
一个Handler允许发送和处理Message和Runable对象,UI主线程会自动分配一个Looper(消息轮询器),每个Looper中封装着MessageQueue(消息队列),遵循先进先出原则。Looper负责不断的从自己的消息队列里取出队头的任务或消息执行。一般是在子线程执行完耗时操作之后,通过Handler的sendMessage或post方法将Message和Runable对象传递给MessageQueue,而且在这些对象离开MessageQueue时,Handler负责执行他们(用到handleMessage方法,主要执行刷新UI的代码)。
7.下拉刷新,上拉加载,
用第三方pulltorefresh类库,布局文件里调用它的包名,绑定要刷新的控件,实现监听方法进行刷新数据,松开停止刷新。
6.android四大组件包括哪些,及用法
Android四大组件分别为activity、service、content provider、broadcast receiver。
一、android四大组件详解
1、activity
(1)一个Activity通常就是一个单独的屏幕(窗口)。
(2)Activity之间通过Intent进行通信。
(3)android应用中每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity。
2、service
(1)service用于在后台完成用户指定的操作。service分为两种:
(a)started(启动):当应用程序组件(如activity)调用startService()方法启动服务时,服务处于started状态。
(b)bound(绑定):当应用程序组件调用bindService()方法绑定到服务时,服务处于bound状态。
(3)开发人员需要在应用程序配置文件中声明全部的service,使用<service></service>标签。
(4)Service通常位于后台运行,它一般不需要与用户交互,因此Service组件没有图形用户界面。Service组件需要继承Service基类。Service组件通常用于为其他组件提供后台服务或监控其他组件的运行状态。
3、content provider
(1)android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序。其他应用可以通过ContentResolver类从该内容提供者中获取或存入数据。
(2)只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处是统一数据访问方式。
3)ContentProvider使用URI来唯一标识其数据集,这里的URI以content://作为前缀,表示该数据由ContentProvider来管理。
4、broadcast receiver
(1)你的应用可以使用它对外部事件进行过滤,只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或serice来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力,例如闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
(2)广播接收者的注册有两种方法,分别是程序动态注册和AndroidManifest文件中进行静态注册。
(3)动态注册广播接收器特点是当用来注册的Activity关掉后,广播也就失效了。
静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。也就是说哪怕app本身未启动,该app订阅的广播在
7.mvc,单例,工厂,观察者设计模式
mvc包含三个部分:
l模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。
l视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
l控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分。
单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式
观察者模式一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
ViewPager的缓存原理,图片无线轮播
[1]: 缓存原理
viewpager每个页面占用的资源并不多并且需要经常使用,这是可以考虑将其常驻ViewPager而不去销毁,切换页面时默认情况下非相邻的页面会被销毁掉(ViewPager默认缓存或预加载相邻的页面以便快速切换),如果想要保持页面之前的状态,这是可以考虑将之前的页面缓存下来而不销毁掉
[2]: ViewPager无限轮播:
设置一个Integer的最大值的一半,然后根据position和图片的数量去计算,来实现向左向右无限滑动这个功能.
自定义ViewPager之后,把相关的图片和跟随图片滑动时的小圆点传递到ViewPager当中,然后设置相关的滑动监听,Adapter就可以完美的实现图片的无限轮播了.
MediaPlayer播放视频的方式
MediaPlayer:主要用于播放音频,可以播放视频,但是一般不用其进行视频播放。
基础算法:冒泡,递归,二分查找法
冒泡排序
基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换
递归
判断目录下是不是空的
判断是否文件夹
调用自身,查找子目录
·执行递归二分查找,返回第一次出现该值的位置 ·已排序的数组 、开始位置 、结束位置 、需要找的值 、值在数组中的位置,从0开始。找不到返回-1
xml解析方法,json解析方法,两种数据格式的区别
dom解析:解析器读入整个文档,对文档增删改查比较方便,缺点占用内存比较大。
sax解析:基于事件驱动型,优点占用内存少,解析速度快,缺点是只适合做文档的读取,不适合做文档的增删改,不能中途停止。
pull解析:同样基于事件驱动型,可随时终止,调用next() 方法提取它们(主动提取事件)
1.JSON和XML的数据可读性基本相同
2.JSON和XML同样拥有丰富的解析手段
3.JSON相对于XML来讲,数据的体积小
4.JSON与JavaScript的交互更加方便
5.JSON对数据的描述性比XML较差
6.JSON的速度要远远快于XML
http,tcp/ip udp协议原理
TCP---传输控制协议,提供的是面向连接、可靠的字节流服务,传输数据前经过“三次握手”建立连接,保证数据传输的可靠性,但效率比较低。一般用于对于数据传输安全性较高的场合。
UDP---用户数据包协议,是一个简单的面向数据包的运输层协议,面向无连接。UDP不提供可靠性,数据传输可能发生错序,丢包,但效率较高。一般用于对于实时性要求较高的场合。
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法
网络请求的两种方式(get、post)的区别,,和技术实现方法有哪些
get是从服务器上获取数据,post是向服务器传送数据。
get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制
get安全性非常低,post安全性较高。
webview,js的互相调用
webView 是一个可以显示网页的控件,他是一个开源的浏览器引擎。
优势:1、搭建Java和Javascript之间交互的桥梁2、跨平台,资源利用最大化.
Webview调js:
Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true,然后通过loadUrl就可以直接进行调用
Js调webview:
webView.addJavascriptInterface(Object obj, String interfaceName)//
把java类注册成javacript对象,以便调用;参数一:要调用的对象,参数二:x需要被js调用的对外接口名
侧滑菜单的实现方式,推送,验证码
SlidingMenu
网络判断
在开发android应用时,涉及到要进行网络访问,时常需要进行网络状态的检查,以提供给用户必要的提醒。一般可以通过ConnectivityManager来完成该工作。
ConnectivityManager有四个主要任务:
1、监听手机网络状态(包括GPRS,WIFI, UMTS等)
2、手机状态发生改变时,发送广播
3、当一个网络连接失败时进行故障切换
4、为应用程序提供可以获取可用网络的高精度和粗糙的状态
图片缓存框架ImageLoader,及原理
是具体下载图片,缓存图片,显示图片的具体执行类,它有两个具体的方法displayImage(...)、loadImage(...),
自定义view的原理,和主要案例
View的工作流程主要是指measure,layout,draw这三大流程,即测量,布局和绘制,其中measure确定了View测量的宽和高,layout确定了View的位置,而draw则将View绘制到屏幕上。
(1).继承View重写onDraw方法
这种方法主要用于实现一些不规则的效果,即折后在那个效果不方便通过布局的组合方式来达到,往往需要静态或者动态的显示一些不规则的图形,这需要通过绘制的方法来实现,即重写onDraw方法。采用这种方法需要自己支持wrap_content,并且padding也需要自己处理。
(2). 继承ViewGroup派生特殊的Layout
这种方法主要用于实现自定义布局,即除了LinearLayout,RelativeLayout,FrameLayout这几种系统布局之外,我们重新定义一种新的布局,需要核实的处理ViewGroup的测量,布局这两个过程,并同时处理子元素的测量和布局过程。
(3). 继承特定的View(比如TextView)
这种方法比较常见,一般是用于扩展那某种已有的View的功能,比如TextVeiw,这种方法比较容易实现,不需要自己支持wrap_content和padding。
(4). 继承特定的ViewGroup(比如LinearLayout)
这种方法比较常见,效果看起来就像集中View组合在一起的时候,可以采用这种方法实现,不需要自己处理ViewGroup的测量和布局过程。
事件分发原理,ListView和ScrollView的冲突:显示不全,滚动冲突
事件分发:public boolean dispatchTouchEvent(MotionEvent ev)
Touch 事件发生时 Activity 的 dispatchTouchEvent(MotionEvent ev) 方法会以隧道方式(从根元素依次往下传递直到最内层子元素或在中间某一元素中由于某一条件停止传递)将事件传递给最外层 View 的 dispatchTouchEvent(MotionEvent ev) 方法,并由该 View 的 dispatchTouchEvent(MotionEvent ev) 方法对事件进行分发。dispatchTouchEvent 的事件分发逻辑如下:
如果 return true,事件会分发给当前 View 并由 dispatchTouchEvent 方法进行消费,同时事件会停止向下传递;
如果 return false,事件分发分为两种情况:
如果当前 View 获取的事件直接来自 Activity,则会将事件返回给 Activity 的 onTouchEvent 进行消费;
如果当前 View 获取的事件来自外层父控件,则会将事件返回给父 View 的 onTouchEvent 进行消费。
如果返回系统默认的 super.dispatchTouchEvent(ev),事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法。
系统提供的ListView嵌套在ScrollView中会出现无法正确计算ListView的高度,导致ListView中item显示不全,解决这个问题的方法很简单,重写一下ListView的onMeasure方法
百度地图的集成过程
· 进入到百度地图API首页http://lbsyun.baidu.com/
· 点击开发,进入到Android地图SDK
一、申请密钥
二、导入库文件
三、配置AndroidManifest.xml文件
声明使用权限
在application标签中声明service组件,每个app拥有自己单独的定位service
设置AcessKey
四、在Application中初始化SDK
五、定位功能封装
(1)、声明定位结果回调
(2)、在onCreate()
中绑定服务
(3)、在onDestroy()
中取消服务
Activity的启动模式有哪些?
答案:①、standard,每次激活activity时,都创建activity实例,并放入任务栈。
②、singleTop,如果activity自己激活自己,即任务栈栈顶就是该activity,则不需要创建,其余情况都要创建activity实例。
③、singleTask,如果要激活的那个activity在任务栈中存在该实例,则不需要创建,只需要把此activity放入栈顶,并把该activity以上的activity实例都pop;
④、singleInstance,如果应用1的任务栈中创建了MainActivity实例,如果应用2也要激活MainActivity,则不需要创建,两应用共享该Activity实例;
JNI的作用,NDK编译过程
JNI 它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)它允许Java代码和其他语言写的代码进行交互
NDK 是 Native Development Kit 的简称。它是一个工具集,集成了 Android 的交叉编译环境,并提供了一套比较方便的 Makefile ,可以帮助开发者快速开发 C 或是 C++ 的动态库,并自动的将 so 和 java 程序打包成 apk ,在 Android 上运行。Android 上,应用程序的开发,大部分基于 Java 语言来实现。要使用 c 或是 c++ 的程序或库,就需要使用 NDK 来实现。
UI优化
在Android应用开发过程中,屏幕上控件的布局代码和程序的逻辑代码通常是分开的。界面的布局代码是放在一个独立的xml文件中的,这个文件里面是树型组织的,控制着页面的布局。通常,在这个页面中会用到很多控件,控件会用到很多的资源。Android系统本身有很多的资源,包括各种各样的字符串、图片、动画、样式和布局等等,这些都可以在应用程序中直接使用。这样做的好处很多,既可以减少内存的使用,又可以减少部分工作量,也可以缩减程序安装包的大小。
支付宝支付:
1)首先从支付宝平台下载SDK,使用其中的alipay.jar包。
2)当用户确定购买商品之后,首先生成订单,我们订单生成的规则就是用两个2-9的随机数+当前时间的毫秒值作为订单号。
3)调用支付宝的接口:调用支付宝的支付方法(方法Alipay.pay(String info)),支付方法需要传入支付相关信息,相关信息以KEY-VALUE键值对方式用&拼接组成。订单信息(订单号,交易付款时间,购买数量等),商品信息(商品名称,商品单价,商品描述等),支付信息(买方,卖方支付宝账号信息,支付金额等)和notify_url(这个是通知地址,也就是支付宝的服务器把支付后成功与否等结果信息同步给我们公司服务器时候使用的地址)等。还需要拼接一个重要的签名参数sign,sign的值是上述这些交易信息RSA签名后的结果。
4)支付信息提交后会提交到支付宝的服务器,支付宝的服务器完成整个支付功能后会给用户成功或者失败的提示界面。这个过程都是支付宝的功能。支付宝支付完成后,也会把信息同步给我们的服务器(也就是通过前面的notify_url这个地址)。
5)我们的服务器处理完毕之后,调用pay方法的时候其实也会接到返回值。返回值是json格式里面有很多信息,我们主要从中取结果状态码(resultStatus),根据状态码的数值判断支付是否成功,除了支付宝本身的提示界面以外,我们也会给用户一个我们自己的提示
8.屏幕适配
1)比重适配,控件在其父布局中的显示权重,一般用于线性布局中,如果控件过多,且显示比例也不相同的时候,控制起来就比较麻烦了,毕竟反比不是那么好确定的。
2)多个布局文件适配,就是对不同大小的屏幕提供不同的layout。比如横竖屏的切换,可以在res目录下建立layout-port和layout-land两个目录,里面分别放置竖屏和横屏两种布局文件,以适应对横屏竖屏自动切换。
3)多个drawable适配(图片的适配),就是对不同密度的屏幕提供不同的图片。在进行开发的时候,我们需要把合适大小的图片放在合适的文件夹里面。应尽量使用.9格式的图片,如需对密度为low的屏幕提供合适的图片,需新建文件夹drawable-ldpi/,并放入合适大小的图片。相应的,medium对应drawable-mdpi/,high对应drawable-hdpi/,extra high对应drawable-xhdpi/。
4)多个values适配,为了优质的用户体验,需要去针对不同的dpi设置,编写多套数值文件,要把生成的所有values文件夹放到res目录下,当设计师把UI高清设计图给你之后,你就可以根据设计图上的尺寸,以某一个分辨率的机型为基础,找到对应像素数的单位,然后设置给控件。
内存优化
1)静态变量引起内存泄露
静态变量是类相关的变量,它的生命周期是从这个类被声明,到这个类彻底被垃圾回收器回收才会被销毁。所以,一般情况下,静态变量从所在的类被使用开始就要一直占用着内存空间,直到程序退出。如果不注意,静态变量引用了占用大量内存的资源,造成垃圾回收器无法对内存进行回收,就可能造成内存的浪费。
2)使用Application的Context
在Android中,Application Context的生命周期和应用的生命周期一样长,而不是取决于某个Activity的生命周期。如果想保持一个长期生命的对象,并且这个对象需要一个 Context,就可以使用Application对象。可以通过调用Context.getApplicationContext()方法或者 Activity.getApplication()方法来获得Application对象。
3)及时关闭资源
Cursor是Android查询数据后得到的一个管理数据集合的类。正常情况下,如果我们没有关闭它,系统会在回收它时进行关闭,但是这样的效率特别低。如果查询得到的数据量较小时还好,如果Cursor的数据量非常大,特别是如果里面有Blob信息时,就可能出现内存问题。所以一定要及时关闭Cursor。
java的三大特征:
封装、继承、多态
封装:客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
继承:面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
多态:重写是子类的方法覆盖父类的方法,要求方法名和参数都相同。重载是在同一个类中的两个或两个以上的方法,拥有相同的方法名,但是参数却不相同,方法体也不相同,最常见的重载的例子就是类的构造函数。
如何人解决anr?forceclose(强制关闭)
(1) AsyncTask,其中doInBackground()和onPostExecute(Result)两个方法非常重要
doInBackground() 这个方法运行在后台线程中,主要负责执行那些很耗时的操作,如访问网络。该方法必须重写。
onPostExecute(Result) 这个方法运行于UI主线程,在doInBackground(Params…)方法执行后调用,该方法用于接收后台任务执行后返回的结果,刷新UI显示。
(2.)子线程 + handler
在子线程中执行完耗时操作需要刷新UI时,通过handler.sendMessage()发消息给主线程,然后在主线程Handler中的handleMessage()方法中执行刷新UI操作