安卓面试

1.安卓启动模式--------------------------------------------------------------------------------

任务栈的特点是:后进先出,

(1).Standard模式:

         每次进入一个activity,就放到栈中顶部,退出的时候依次从栈顶取到栈底

(2)SingleTop模式:

         就是哪个activity在栈顶,再启动它就不能启动了,用于网页的书签,防止多次打

         开同一个activity

(3)SingleTask模式:

          就是某个activity你之前启动过了,就不会启动新的了,会直接返回你之前启动

          的那个activity,而且在栈中把它上面的activity全部销毁

(4)SingleInstance模式:

          会启动一个新的栈,并把你启动的栈作为前台任务栈,随着activity的切换而不

          断切换前台任务栈。

2.Fragment生命周期,与activity的区别--------------------------------------------------------------

可以看出,对与中间的onStart()-onResume()-onPausse()-onStop()方法,是没有区别的

只有Activity的onCreate()方法对应Fragment的onAttach()+onCreate()+onCreateView()+onActivityCreate()四个方法,

onDestroy()方法对应Fragment的onDestroyView()+onDestroy()+onDetach()方法

3.横屏对activity的影响-------------------------------------------------------------------------------------

横屏后会重启一个新的activity,这时系统会重新触发activity的生命周期,我们的数据会变,很多时候我们不希望系统重新触发新的生命周期,所以可以在清单文件中<activity>中配置:

Android:configChanges=”orientation | keyboardHidden | screenSize”

其中orientation 表示横竖屏切换不要触发activity

keyboardHidden 表示隐藏输入法软键盘

screenSize 表示屏幕宽高改变时,系统不要理会

4.安卓框架-------------------------------------------------------------------------------------------------------

(1)drawerLayout侧边栏

    “抽屉布局”,它其实是一个布局控件,但是它带有滑动的功能

(2)Material Design  

     谷歌退出的全新设计语言Material,可以理解为一个规范,支持各种新动画效果,具

     有内置的实时UI阴影,以及可在不同屏幕之间切换的hero元素。

(3)NavigationView框架

 配合之前v4包的DrawerLayout,作为其中的drawer部分,即导航菜单的本体部分

(4).SlidingMenu框架

     侧边栏框架,结合fragment使用

(5)xUtils框架:

      xUtils 最初源于Afinal框架,进行了大量重构,使得xUtils支持大文件上传,更全面

      的http请求协议支持(10种谓词),拥有更加灵活的ORM(对象关系映射),更多的事件注解支持且不

      受混淆影响.

      支持DBUtils模块、ViewUtils模块、HttpUtils模块、BitmapUtils模块

目前xUtils主要有四大模块:

DbUtils模块:

android中的orm框架,一行代码就可以进行增删改查;

支持事务,默认关闭;

可通过注解自定义表名,列名,外键,唯一性约束,NOT NULL约束,CHECK约束等(需要混淆的时候请注解表名和列名);

支持绑定外键,保存实体时外键关联实体自动保存或更新;

自动加载外键关联实体,支持延时加载;

支持链式表达查询,更直观的查询语义,参考下面的介绍或sample中的例子。

 

ViewUtils模块:

android中的ioc框架,完全注解方式就可以进行UI,资源和事件绑定;

新的事件绑定方式,使用混淆工具混淆后仍可正常工作;

目前支持常用的20种事件绑定,参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event

 

HttpUtils模块:

支持同步,异步方式的请求;

支持大文件上传,上传大文件不会oom

支持GETPOSTPUTMOVECOPYDELETEHEADOPTIONSTRACECONNECT请求;

下载支持301/302重定向,支持设置是否根据Content-Disposition重命名下载的文件;

返回文本内容的请求(默认只启用了GET请求)支持缓存,可设置默认过期时间和针对当前请求的过期时间。

 

BitmapUtils模块:

加载bitmap的时候无需考虑bitmap加载过程中出现的oom(OOM就是内存溢出,即Out Of Memory)android容器快速滑动时候出现的图片错位等现象;

支持加载网络图片和本地图片;

内存管理使用lru算法,更好的管理bitmap内存;

可配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等...

(6)

   ViewPagerIndicator框架不赘述了

5.Intent 带参跳转--------------------------------------------------

(1)传值:

Intent intent=new Intent();
<p>intent.putExtra("extra", "<span style="font-family:宋体;">这是页面一传来的值!</span><span style="font-family:Calibri;">");</span>
intent.setClass(Test_for_intentActivity.this, actpage2.class);
startActivity(intent);</p>

取值:

Intent intent=getIntent();
<p>String StringE=intent.getStringExtra("extra");
TextView text2=(TextView)findViewById(R.id.textView2);
text2.setText(StringE);</p>

两者本质上没有任何区别。
Bundle只是一个信息的载体 将内部的内容以键值对组织
Intent负责Activity之间的交互 自己是带有一个Bundle的
Intent.putExtras(Bundle bundle)直接将Intent的内部Bundle设置为参数里的bundle
Intent.getExtras()直接可以获取Intent带有的Bundle

6.安卓中线程的使用,同步,异步加载----------------------------------------------------------------------------------------------------



安卓中主线程也是ui线程,任何耗时操作都不能放在主线程中,可以放在子线程中完成,但是注意子线程不能刷新ui,还是要靠主线程来刷新,这里就用了一个轮询器looper,用来监督主线程的消息队列,一旦发现消息队列中有消息,就把消息发送给主线程的Handler处理,Handler使用它的handlerMessage()方法来处理。

Android1.5提供了一个公共类叫做AsyncTask(恩森可),它简化了任务线程和主线程之间的通信。

AsyncTask通过它的子类才能使用。要记住,一个AsyncTask实例必须在主线程创建并且只能被执行一次。完全理解和使用这个类,你可以阅读AsyncTask文档。这里快速的说一下AsyncTask是怎么工作的:

1>可以通过泛型指定它的类型:参数,进度值,任务的结果值。

2>doInBackGround()方法自动在工作线程中只想能够。

3>onPreExecute()onPostExecute()onProgressUpdate()方法都在UI线程中执行。

4>doInBackground()方法返回的值被当作参数传递给onPostExecute()方法。

5>你能够在doInBackground()方法里任何时候调用publishProgress()方法在UI线程中去执行onProgressUpdate()方法。

------------------------------------------------Android异步加载------------------------------------------------

目的:

     1.让用户在加载数据的时候不会感到明显的卡顿,

     2.安卓要求我们这样做

常用方式:

     1.多线程、线程池

     2.AsyncTask(底层也是基于线程池实现的)

对于加载图片,每次上下划动都重新加载,耗费流量巨大,安卓提供Lru算法,通过lruCache类来实现缓存算法:

   Lru:Least Recently Used 近期最少使用 算法,将内容保存在内存中,并以一定的方法去管理这些内容,从而做到在一定的范围之内,保证能够缓存所有的内容数据,而超出一定的范围之后,将近期最少使用的内容剔除出去,从而实现一个非常优秀的缓存管理

7.访问网络-----------------------------------------------------------------------------------------

两种网络访问客户端:HttpClientHttpURLConnection

异步asyncHttpClient框架:

  从这个框架中直接把com文件夹全部copy到项目中

  先去new一个AsyncHttpClient,然后如果要发送get请求,直接发送get方法就可以了,在两个参数中传入一个网址,第二个参数是实现一个AsyncHttpResponseHandler的接口。实现接口后重写onsuccessonfailure,就是成功(响应码200)时和失败时调用,我们根本都不需要从服务器拿输入流,onSuccess方法中有个字节数组responsebody,这里面的内容就已经是服务器输入流的内容,我们用的时候直接把它newstring就行了.

<span style="font-family:Calibri;">//创建异步httpClient
     AsyncHttpClient  ahc = new AsyncHttpClient();

//发送post请求提交数据
      RequestParams params = new RequestParams();
      params.add("name",name);
      params.add("pass",pass);
      ahc.post(url,params,new MyResponseHandler());
}
class MyResponseHandler extends AsyncHttpResponseHandler{
}
</span>

使用post请求原理一样,但是参数多一个params,用来封装我们要提交的数据的,需要new一个 RequestParams(表示请求参数),这样就完整了

接着看看OSI网络层

以及tcp网络层



8.SAX解析xml------------------------------------------------------------------------------------------------------------------------------------

SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。 SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML 语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接 口。下面是一些ContentHandler接口常用的方法:

startDocument():当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作

endDocument()和上面的方法相对应,当文档结束的时候,调用这个方法,可以在其中做一些善后的工作

startElement(String namespaceURI, String localName, String qName, Attributes atts)

当读到一个开始标签的时候,会触发这个方法。 namespaceURI就是命名空间,localName是不带命名空间前缀的标签名,qName是带命名空间前缀的标签名。通过atts可以得到所有 的属性名和相应的值。要注意的是SAX中一个重要的特点就是它的流式处理,当遇到一个标签的时候,它并不会纪录下以前所碰到的标签,也就是说,在 startElement()方法中,所有你所知道的信息,就是标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元属等等其它与结构相关 的信息,都是不得而知的,都需要你的程序来完成。这使得SAX在编程处理上没有DOM来得那么方便。

endElement(String uri, String localName, String name):这个方法和上面的方法相对应,在遇到结束标签的时候,调用这个方法。

characters(char[] ch, int start, int length) :这个方法用来处理在XML文件中读到的内容,第一个参数为文件的字符串内容,后面两个参数是读到的字符串在这个数组中的起始位置和长度,使用new String(ch,start,length)就可以获取内容。

9.数组和链表的区别----------------------------------------------------------------------------------

首先,我们使用数组处理一些数据类型相同的数据,但是数据的长度必须固定,就是说数组不能动态增减数据个数,所以只能说我们给提供数组的长度比较大,但是这样很容易造成内存的浪费,就好像说你定酒店,你估计50个房间,结果你的朋友只去了30个,酒店不给退,只好浪费钱;而链表是另一个数据组织形式,它可以动态分配内存,就好比说酒店经理是你舅舅,你舅舅说,你们尽管来,来多少人,开多少房间,不会浪费钱的。

1.从逻辑结构上说,数组必须事先定义好长度,不适应动态数据的动态增减,链表动态分配存储空间,适应动态数据增减。

2.从内存存储来说,数组从栈中分配空间,new的时候在堆中,对程序员方便快速,好比你打电话给酒店前台,随时有人接听。链表直接从堆分配空间,自由度大但是申请管理比较麻烦,就好像你想找经理走后门,没那么容易。

从访问方式看,数组在内存中连续存储的,可以利用索引随机访问,就好比说你住的每间房都登记了房号,找谁都能直接对上。链表是链式存储,只能通过线性的方式由前到后访问,就好比说,你走后门住的房间,你舅舅给你安排的是20-50号房,但是没有登记房客,你要找谁只能挨着房门问了,找到为止

10安卓多点触摸,手势识别---------------------------------------------------------

MotionEvent event即一个触摸事件。对屏幕的几乎所有操作都会触发事件,如点击、放开、滑动等。不同的事件在MotionEvent中有不同的id,我们可以根据event.getAction() & MotionEvent.ACTION_MASK的结果来判断是何种事件。

当 我们放一个食指到屏幕上时,触发ACTION_DOWN事件;再放一个中指到屏幕上,触发ACTION_POINTER_DOWN事件;此时再把食指或中 指放开,都会触发ACTION_POINTER_UP事件;再放开最后一个手指,触发ACTION_UP事件;而同时在整个过程 中,ACTION_MOVE事件会一直不停地被触发。

Android 屏幕手势滑动

Activity 中实现 OnGestureListener 的接口 onFling() 手势事件,通过自定义的 View 绘制draw() 图片










  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值