Android基础知识巩固

一下是自己总结和收集的Android 基础知识,供自己学习,也希望能帮助大家:

  1. android中的动画有哪几类,它们的特点和区别是什么?
    两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。
  2. handler机制的原理
    andriod提供了 Handler 和 Looper 来满足线程间的通信。Handler 先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。
    1) Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。
    2) Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息。一个Handler类与唯一的一个线程关联,并且该线程是生成该Handler的线程,它把消息发送到生成它的线程里的MessageQueue里,然后当Message出队列的时候,就执行该消息。
    3) Message Queue(消息队列):用来存放线程放入的消息。
    4) 线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。
    补充:
    Looper即一个循环,必须绑定到一个固定的线程里,通过getThread()方法可以获得该looper绑定的Thread对象,通过getMainLooper()获得主线程里的looper对象,myLooper()可以获得当前线程里的looper对象,通过myQueue()方法可以获得当前线程里的messageQueue对象。一般声明一个thread是没有带looper循环的,但是可以通过Looper.prepare()方法给一个线程加上looper;Looper.loop()执行该looper绑定的线程里的messageQueue,直到该loopger结束;Loop.quit()结束该循环。
    android为我们提供了一个直接生成带有looper线程的方法,即实例化一个HandlerThread对象,通过HandlerThread.getLooper()方法即可获得该HandlerThread的looper对象。

  3. 说说mvc模式的原理,它在android中的运用
    android的官方建议应用程序的开发采用mvc模式。何谓mvc?
    mvc是model,view,controller的缩写,mvc包含三个部分:
    l模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。
    l视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
    l控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,将用户发出的相关事件,交给model处理。
    android鼓励弱耦合和组件的重用,在android中mvc的具体体现如下:
    1) 视图层(view):一般采用xml文件进行界面的描述,使用的时候可以非常方便的引入,当然,如何你对android了解的比较的多了话,就一定 可以想到在android中也可以使用javascript+html等的方式作为view层,当然这里需要进行java和javascript之间的通 信,幸运的是,android提供了它们之间非常方便的通信实现。
    2) 控制层(controller):android的控制层的重 任通常落在了众多的acitvity的肩上,这句话也就暗含了不要在acitivity中写代码,要通过activity交割model业务逻辑层处理, 这样做的另外一个原因是android中的acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。
    3) 模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的。
  4. Activity生命周期方法详解:
    onCreate: 在这里创建界面 ,做一些数据 的初始化工作。
    onStart: 到这一步变成用户可见不可交互 的。
    onResume: 变成和用户可交互 的,(在activity 栈系统通过栈的方式管理这些个Activity的最上面,运行完弹出栈,则回到上一个Activity)。
    onPause: 到这一步是可见但不可交互 的,系统会停止动画 等消耗CPU 的事情。
    从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在
    onResume里读出来,注意:这个方法里做的事情时间要短,因为下一个activity不会等到这个方法完成才启动。
    onstop: 变得不可见 ,被下一个activity覆盖了
    onDestroy: 这是activity被干掉前最后一个被调用方法了,可能是外面类调用finish方法或者是系统为了节省空间将它暂时性的干掉,可以用isFinishing()来判断它,如果你有一个Progress Dialog在线程中转动,请在onDestroy里把他cancel掉,不然等线程结束的时候,调用Dialog的cancel方法会抛异常的。
    onPause,onstop, onDestroy,三种状态 下 activity都有可能被系统干掉,为了保证程序的正确性,你要在onPause()里写上持久层操作的代码,将用户编辑的内容都保存到存储介质上(一般都是数据库 )。对于多线程与界面的交互问题,Android使用消息机制(handler,message)来处理。
  5. 你后台的Activity被系统回收怎么办?(onSaveInstanceState
    当你的程序中某一个Activity A 在运行时中,主动或被动地运行另一个新的Activity B 这个时候A会执行Java代码:
    public
    void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putLong("id", 1234567890);
    }
    B 完成以后又会来找A, 这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回
    收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数
    savedInstanceState,没被收回的就还是onResume就好了。
    savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。Java代码:
    if(savedInstanceState != null){
    long id = savedInstanceState.getLong("id");
    }
  6. 关于通信使者intent:
    intent是Android架构的松耦合的精髓部分,大大提高了组件的复用性。
  7. 如何退出Activity?如何安全退出已调用多个Activity的Application?
    对于单一Activity的应用来说,退出很简单,直接finish()即可(当然,也可以用killProcess()和System.exit()这样的方法)。
    1、记录打开的Activity(一种用的比较多的而且比较好的方法是:自定义一个activity栈,在退出Application时全部出栈):
    每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。
    2、发送特定广播:
    在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。
    3、递归退出
    在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。
  8. 请介绍下ContentProvider是如何实现数据共享的。
    一个程序可以通过实现一个Content provider的抽象接口将自己的数据完全暴露出去,而且Content providers是以类似数据库中表的方式将数据暴露。Content providers存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。要想使应用程序的数据公开化,可通过2种方法:创建一个属于你自己的Content provider或者将你的数据添加到一个已经存在的Content provider中,前提是有相同数据类型并且有写入Content provider的权限。如何通过一套标准及统一的接口获取其他应用程序暴露的数据?Android提供了ContentResolver,外界的程序可以通过ContentResolver接口访问ContentProvider提供的数据。
  9. 如何启用Service,如何停用Service。
    1.第一种是通过调用Context.startService()启动,调用Context.stopService()结束,startService()可以传递参数给Service
    2.第二种方式是通过调用Context.bindService()启动,调用Context.unbindservice()结束,还可以通过ServiceConnection访问Service。
    在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。
  10. 注册广播有几种方式,这些方式有何优缺点?请谈谈Android引入广播机制的用意。
    android中,不同进程之间传递信息要用到广播,广播是广泛用于应用程序之间通信的一种手段,可以有两种方式来实现。
    第一种方式:在Manifest.xml中注册广播,是一种比较推荐的方法,因为它不需要手动注销广播(如果广播未注销,程序退出时可能会出错)。
    第二种方式,直接在代码中实现,但需要手动注册注销,实现如下:
    IntentFilter filter = new IntentFilter();
    filter.addAction(“android.intent.action.BOOT_COMPLETED”);
    registerReceiver(mEvtReceiver, filter); //这时注册了一个recevier ,名为mEvtReceiver,然后同样用上面的方法以重写onReceiver,
    最后在程序的onDestroy中要注销广播,实现如下:
    @Override
    public void onDestroy() {
    super.onDestroy();
    unregisterReceiver(mPlayerEvtReceiver);
    }
    在Android 中如果要发送一个广播必须使用sendBroadCast 向系统发送对其感兴趣的广播接收器中。
    使用广播必须要有一个intent 对象必设置其action动作对象
    使用广播必须在配置文件中显式的指明该广播对象
    每次接收广播都会重新生成一个接收广播的对象
  11. 请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。
    简单的说,Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再由Handler进行Message的分发和处理。  http://blog.csdn.net/xuxinyl/article/details/6097560
  12. AIDL的全称是什么?如何工作?能处理哪些类型的数据?
    AIDL全称Android Interface Definition Language(Android接口描述语言) 是一种接口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程跨界对象访问的目的.AIDL的IPC的机制和COM或CORBA类似, 是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相关类.; 2. 调用aidl产生的class.理论上, 参数可以传递基本数据类型和String, 还有就是Bundle的派生类。具体实现步骤如下:
    1、创建AIDL文件, 在这个文件里面定义接口, 该接口定义了可供客户端访问的方法和属性。
    2、编译AIDL文件, 用Ant的话, 可能需要手动, 使用Eclipse plugin的话,可以根据adil文件自动生产java文件并编译, 不需要人为介入。
    3、在Java文件中, 实现AIDL中定义的接口. 编译器会根据AIDL接口, 产生一个JAVA接口。这个接口有一个名为Stub的内部抽象类,它继承扩展了接口并实现了远程调用需要的几个方法。接下来就需要自己去实现自定义的几个接口了。
    4、向客户端提供接口ITaskBinder, 如果写的是service,扩展该Service并重载onBind ()方法来返回一个实现上述接口的类的实例。
    5、在服务器端回调客户端的函数. 前提是当客户端获取的IBinder接口的时候,要去注册回调函数, 只有这样, 服务器端才知道该调用那些函数。
    AIDL语法很简单,可以用来声明一个带一个或多个方法的接口,也可以传递参数和返回值。 由于远程调用的需要, 这些参数和返回值并不是任何类型.下面是些AIDL支持的数据类型:
    1. 不需要import声明的简单Java编程语言类型(int,boolean等)。
    2. String, CharSequence不需要特殊声明 。
    3. List, Map和Parcelables类型, 这些类型内所包含的数据成员也只能是简单数据类型, String等其他支持的类型.。
  13. 系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由。
    通过直接发送Uri把参数带过去,或者通过manifest里的intentfilter里的data属性。
  14. 什么是ANR 如何避免它?
    ANR:Application Not Responding,五秒在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应。当出现下列情况时,Android就会显示ANR对话框了:
    对输入事件(如按键、触摸屏事件)的响应超过5秒
    意向接受器(intentReceiver)超过10秒钟仍未执行完毕
    Android应用程序完全运行在一个独立的线程中(例如main)。这就意味着,任何在主线程中运行的,需要消耗大量时间的操作都会引发ANR。因为此时,你的应用程序已经没有机会去响应输入事件和意向广播(Intent broadcast)。
    因此,任何运行在主线程中的方法,都要尽可能的只做少量的工作。特别是活动生命周期中的重要方法如onCreate()和 onResume()等更应如此。潜在的比较耗时的操作,如访问网络和数据库;或者是开销很大的计算,比如改变位图的大小,需要在一个单独的子线程中完成 (或者是使用异步请求,如数据库操作)。但这并不意味着你的主线程需要进入阻塞状态已等待子线程结束 — 也不需要调用Therad.wait()或者Thread.sleep()方法。取而代之的是,主线程为子线程提供一个句柄(Handler),让子线程 在即将结束的时候调用主线程来完成一些简单操作。
  15. 简要解释一下activity、 intent 、intent filter、service、Broadcase、BroadcaseReceiver
    一个activity呈现了一个用户可以操作的可视化用户界面
    一个service不包含可见的用户界面,而是在后台无限地运行,也可以连接到一个正在运行的服务中,连接后,可以通过服务中暴露出来的接口与其进行通信。
    一个broadcast receiver是一个接收广播消息并作出回应的component,broadcast receiver没有界面
    intent:content provider在接收到ContentResolver的请求时被激活。
    activity, service和broadcast receiver是被称为intents的异步消息激活的。
    一个intent是一个Intent对象,它保存了消息的内容。对于activity和service来说,它指定了请求的操作名称和待操作数据的URI
    Intent对象可以显式的指定一个目标component。如果这样的话,android会找到这个component(基于 manifest文件中的声明)并激活它。但如果一个目标不是显式指定的,android必须找到响应intent的最佳component。
    它是通过将Intent对象和目标的intent filter相比较来完成这一工作的。一个component的intent filter告诉android该component能处理的intent。intent filter也是在manifest文件中声明的。
  16. 横竖屏切换时候activity的生命周期?

  17. 如何将SQLite数据库文件(dictionary.db文件)与apk文件一起发布?
    可以将dictionary.db文件复制到Eclipse Android工程中的res-> raw目录中。所有在res-> raw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。
  18. 如何将打开res raw目录中的数据库文件?
    在Android中不能直接打开res raw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得res aw目录中资源的 InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。
  19. android为什么要有4大组件?
    android的四大组件本质上就是为了实现移动或者说嵌入式设备上的MVC架构,降低模块之间的耦合度,提高组建的重用性,它们之间有时候是一种相互依存的关系,有时候又是一 种补充关系。
  20. DDMS和TraceView的区别?
    DDMS是一个程序执行查看器,在里面可以看见线程和堆栈等信息,TraceView是程序性能分析器。
  21. 谈谈Android的IPC机制?
    IPC是内部进程通信的简称, 是共享”命名管道”的资源。Android中的IPC机制是为了让Activity和Service之间可以随时的进行交互,故在Android中该机制,只适用于Activity和Service之间的通信,类似于远程方法调用,类似于C/S模式的访问。通过定义AIDL接口文件来定义IPC接口。Servier端实现IPC接口,Client端调用IPC接口本地代理。
  22. 什么NDK?
    NDK是一些列工具的集合,
    NDK提供了一系列的工具,帮助开发者迅速的开发C/C++的动态库,并能自动将so和java 应用打成apk包。
    NDK集成了交叉编译器,并提供了相应的mk文件和隔离cpu、平台等的差异,开发人员只需简单的修改mk文件就可以创建出so。
  23. 描述一下android的系统架构
    android系统架构分从下往上为linux 内核层、运行库、应用程序框架层、和应用程序层
    linuxkernel:负责硬件的驱动程序、网络、电源、系统安全以及内存管理等功能。
    libraries和 androidruntime:libraries:即c/c++函数库部分,大多数都是开放源代码的函数库,例如webkit,该函数库负责 android网页浏览器的运行,例如标准的c函数库libc、openssl、sqlite等,当然也包括支持游戏开发2dsgl和 3dopengles,在多媒体方面有mediaframework框架来支持各种影音和图形文件的播放与显示,例如mpeg4、h.264、mp3、 aac、amr、jpg和png等众多的多媒体文件格式。android的runtime负责解释和执行生成的dalvik格式的字节码。
    applicationframework(应用软件架构),java应用程序开发人员主要是使用该层封装好的api进行快速开发。
    applications:该层是java的应用程序层,android内置的googlemaps、e-mail、即时通信工具、浏览器、mp3播放 器等处于该层,java开发人员开发的程序也处于该层,而且和内置的应用程序具有平等的位置,可以调用内置的应用程序,也可以替换内置的应用程序。
    上面的四个层次,下层为上层服务,上层需要下层的支持,调用下层的服务,这种严格分层的方式带来的极大的稳定性、灵活性和可扩展性,使得不同层的开发人员可以按照规范专心特定层的开发。
    android应用程序使用框架的api并在框架下运行,这就带来了程序开发的高度一致性,另一方面也告诉我们,要想写出优质高效的程序就必须对整个 applicationframework进行非常深入的理解。精通applicationframework,你就可以真正的理解android的设计 和运行机制,也就更能够驾驭整个应用层的开发。
  24. Adapter有什么作用?常见的Adapter有哪些?
    Adapter是连接后端数据和前端显示的适配器接口。常见的Adapter有ArrayAdapter, BaseAdapter, CursorAdapter, HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, SpinnerAdapter, WrapperListAdapter等。
  25. 根据自己的理解描述下Android数字签名。
    (1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
    (2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证
    (3)如果要正式发布一个Android ,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。
    (4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。
  26. Activity启动模式
    ①:standard
    默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。
    ②:singleTop
    可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。
    ③:singleTask
    只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。
    如果是在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,singleTask允许别的Activity与其在一个task中共存,也就是说,如果我在这个singleTask的实例中再打开新的Activity,这个新的Activity还是会在singleTask的实例的task中。
    ④:singleInstance
    只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。
  27. Android中的 layout_gravity 和 gravity :

    android:gravity 属性是对该view中内容的限定.比如一个button 上面的text. 你可以设置该text 相对于view的靠左,靠右等位置.
    android:layout_gravity是用来设置该view相对与父view 的位置.比如一个button 在linearlayout里,你想把该button放在linearlayout里靠左、靠右等位置就可以通过该属性设置. 

    即android:gravity用于设置View中内容相对于View组件的对齐方式,而android:layout_gravity用于设置View组件相对于Container的对齐方式。


后面会持续更新。。。












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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值