android 环境变量给系统变量和应用变量分配id会不会冲突

应用变量 手机型号伪装 安卓版 2.0.4
下载帮助本站软件均来自互联网, 如有侵犯您的版权, 请与我们联系。
* 为了达到最快的下载速度,推荐使用下载本站软件。
* 请一定升级到最新版才能正常解压本站提供的软件!
* 相关网站事务请留言:
或通知我们!
Copyright &
. All Rights Reserved应用变量电脑版|应用变量电脑版下载v3.1.0.428 最新版-心愿下载
应用变量电脑版 v3.1.0.428 最新版
网友评分:
应用变量电脑版安装方法:
安卓游戏或软件的电脑版基本都是通过安卓模拟器 bluestacks的形式实现的,当你下载下来后,不要轻意的说不能用或骗子等伤人的话。
【关于安卓模拟器 bluestacks的安全使用教程请点击:】
安装步骤如下:
一、下载并安装安卓模拟器bluestacks:
本站下载地址:
【需要注意的是安卓模拟器bluestacks需要的安装组件才能正常运行。XP用户需先安装4.5和 SP2, 否则会提示出错!】
二、相关组件和安卓模拟器都已经安装完毕,下面 进入应用变量电脑版的安装步骤:
1.右击要安装的.apk文件,选择打开方式 - BlueStacks Apk Handler:如图
2.安装过程截图:
3.安装完成你 可以在&我的应用&中找到已经安装好了的应用变量电脑版,点击图标就可以玩了。
关键字:&&&&&&
& &评论摘要()
软件下载说明
* 为了达到最快的下载速度,站长推荐您使用下载本站软件。
* 请升级到最新版的以便正常解压缩下载的软件!
* 本站下载的软件,部分经过压缩加密处理,解压密码为:
* 为方便大家交流,我们开通了QQ群:① ②6656287,请勿重复添加。
* 本站所提供的所有软件均为作者提交或网上搜集,若侵犯您的版权利益,通知我们!
下载应用变量电脑版的人还下载
热门关键词
是一个免费软件下载站,提供绿色软件,免费软件,手机软件,游戏下载,我们的目标是:让电脑软件改变学习和生活. &&
Copyright &
All rights reserved.下次自动登录
现在的位置:
& 综合 & 正文
【面试题】 Android面试题
Android面试题
网上收集的面试题,是一次很好Android理论补充学习!
1.android dvm 的进程和Linux的进程,应用程序的进程是否为同一个概念:
答:dvm是dalivk虚拟机。每一个android应用程序都在自己的进程中运行,都拥有一个dalivk虚拟机实例。而每一个dvm都是在linux的一个进程。所以说可以认为是同一个概念。
2.android的动画有哪几种?他们的特点和区别是什么?
答:两种,一种是tween动画,一种是frame动画。tween动画,这种实现方式可以使视图组件移动,放大或缩小以及产生透明度的变化。frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。
3.handler进制的原理:
答:android提供了handler和looper来满足线程间的通信。Handler先进先出原则。looper用来管理特定线程内对象之间的消息交换(message Exchange).
1)looper:一个线程可以产生一个looper对象,由它来管理此线程里的message queue(消息队列)
2)handler:你可以构造一个handler对象来与looper沟通,以便push新消息到messagequeue里;或者接收looper(从messagequeue里取出)所送来的消息。
3)messagequeue:用来存放线程放入的消息。
4)线程:UI thread 通常就是main thread,而android启动程序时会为它建立一个message queue.
4.android view的刷新:
答:Android中对View的更新有很多种方式,使用时要区分不同的应用场合。我感觉最要紧的是分清:多线程和双缓冲的使用情况。
1).不使用多线程和双缓冲
这种情况最简单了,一般只是希望在View发生改变时对UI进行重绘。你只需在Activity中显式地调用View对象中的invalidate()方法即可。系统会自动调用 View的onDraw()方法。
2).使用多线程和不使用双缓冲
这种情况需要开启新的线程,新开的线程就不好访问View对象了。强行访问的话会报:android.view.ViewRoot$CalledFromWrongThreadException:Only the originalthread that created a view hierarchy can touch its views.
这时候你需要创建一个继承了android.os.Handler的子类,并重写handleMessage(Messagemsg)方法。android.os.Handler是能发送和处理消息的,你需要在Activity中发出更新UI的消息,然后再你的Handler(可以使用匿名内部类)中处理消息(因为匿名内部类可以访问父类变量,你可以直接调用View对象中的invalidate()方法 )。也就是说:在新线程创建并发送一个Message,然后再主线程中捕获、处理该消息。
3).使用多线程和双缓冲
Android中SurfaceView是View的子类,她同时也实现了双缓冲。你可以定义一个她的子类并实现SurfaceHolder.Callback接口。由于实现SurfaceHolder.Callback接口,新线程就不需要android.os.Handler帮忙了。SurfaceHolder中lockCanvas()方法可以锁定画布,绘制玩新的图像后调用unlockCanvasAndPost(canvas)解锁(显示),还是比较方便得。
5.说说mvc模式的原理,它在android中的运用:
答:android的官方建议应用程序的开发采用mvc模式。何谓mvc?
 mvc是model,view,controller的缩写,mvc包含三个部分:
  l模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。
  2视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
  3控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,想用用户出发的相关事件,交给m哦得了处理。
 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里面处理,当然对业务计算等操作也是必须放在的该层的。
6.Activity的生命周期:
答:onCreate: 在这里创建界面,做一些数据 的初始化工作
  onStart: 到这一步变成用户可见不可交互的
onResume:变成和用户可交互 的,(在activity 栈系统通过栈的方式管理这些个Activity的最上面,运行完弹出栈,则回到上一个Activity)
  onPause: 到这一步是可见但不可交互的,系统会停止动画 等消耗CPU 的事情从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在
  onstop: 变得不可见,被下一个activity覆盖了
onDestroy: 这是activity被干掉前最后一个被调用方法了,可能是外面类调用finish方法或者是系统为了节省空间将它暂时性的干掉
7.让Activity变成一个窗口:
答:Activity属性设定:有时候会做个应用程序是漂浮在手机主界面的。这个只需要在设置下Activity的主题theme,即在Manifest.xml定义Activity的地方加一句:
android :theme="@android:style/Theme.Dialog"
如果是作半透明的效果:
android:theme="@android:style/Theme.Translucent"
8.Android中常用的五种布局:
答:LinearLayout线性布局;AbsoluteLayout绝对布局;TableLayout表格布局;RelativeLayout相对布局;FrameLayout帧布局;
9.Android的五种数据存储方式:
答:sharedPreferences;文件;SQLite;contentProvider;网络
10.请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系:
答:Handler获取当前线程中的looper对象,looper用来从存有Message的Message Queue里取出message,再由Handler进行message的分发和处理。
11.AIDL的全称是什么?如何工作?能处理哪些类型的数据?
答:AIDL(AndroidInterface Definition Language)android接口描述语言
?请说明原由:
答:通过直接发送Uri把参数带过去,或者通过manifest里的intentfilter里的data属性。代码如下:
Intent intent = new Intent();
Intent.setAction(“android.intent.action.View”);
Uri uriBrowsers = Uri.parse(“.cn”);
Intent.setData(uriBrowsers);
//包名、要打开的activity
intent.setClassName(“com.android.browser”,”com.android.browser.BrowserActivity”);
startActivity(intent);
13.什么是ANR,如何避免?
答:ANR的定义:
在android上,如果你的应用程序有一段时间响应不移灵敏,系统会向用户提示“应用程序无响应”(ANR:application Not Responding)对话框。因此,在程序里对响应性能的设计很重要,这样,系统不会显示ANR给用户。
如何避免:
首先来研究下为什么它会在android的应用程序里发生和如何最佳构建应用程序来避免ANR.
android应用程序通常是运行在一个单独的线程(例如:main)里,这就意味你的应用程序所做的事情如果在主线程里占用了大长时间的话,就会引发ANR对话框,因为你的应用程序并没有给自己机会来处理输入事件或者Intent广播。
因此,运行在主线程里的任何访求都尽可能少做事情。特别是,activity应该在它的关键生命周期方法(onCreate()和onResume())里尽可能少的去作创建操作。潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程里(或者以数据库操作为例,通过异步请求的方式)来完成。然而,不是说你的主线程阻塞在那里等待子线程的完成---也不是调用Thread.wait()或者Thread.sleep()。替代的方法是:主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。以这种方式设计你的应用程序,将能保证你的主线程保持对输入的响应性并能避免由5秒输入事件的超时引发的ANR对话框。这种做法应该在其它显示UI的线程里效仿,因为它们都受相同的超时影响。
IntentReceiver执行时间的特殊限制意味着它应该做:在后台里做小的、琐碎的工作,如保存设定或注册一个Notification。和在主线程里调用的其它方法一样,应用程序应该避免在BroadcastReceiver里做耗时的操作或计算,但也不是在子线程里做这些任务(因为BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个Service。顺便提及一句,你也应该避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广播时需要向用户展示什么,你应该使用Notification
Manager来实现。
一般来说,在应用程序里,100到200ms是用户能感知阻滞的时间阈值,下面总结了一些技巧来避免ANR,并有助于让你的应用程序看起来有响应性。
如果你的应用程序为响应用户输入正在后台工作的话,可以显示工作的进度(ProgressBar和ProgressDialog对这种情况来说很有用)。特别是游戏,在子线程里做移动的计算。如果你的程序有一个耗时的初始化过程的话,考虑可以显示一个Splash Screen或者快速显示主画面并异步来填充这些信息。在这两种情况下,你都应该显示正在进行的进度,以免用户认为程序被冻结了。
答:如空指针等可以导致ForceC可以看Logcat,然后找到对应的程序代码来解决错误。
15.横竖屏切换时候的activity的生命周期:
1) 新建一个activity,并把各个生命周期打印出来
2) 运行activity,得到如下信息:
onCreate()à
onStart()à
onResume()à
按ctrl+F12切换成横屏时
onSaveInstanceState()à
onPause()à
onStop()à
onDestroy()à
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
再按ctrl+f12切换成竖屏时,发现打印了两次相同的Log
onSaveInstanceState()à
onPause()à
onStop()à
onDestroyà
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
onSaveInstanceState()à
onPause()à
onStop()à
onDestroyà
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
修改AndroidManifest.xml,把该Activity添加android:configChanges=“orientation”,执行步骤3
onSaveInstanceState()à
onPause()à
onStop()à
onDestroy()à
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
修改AndroidManifest.xml,把该Activity添加android:configChanges=“orientation”,执行步骤4,发现不会再打印相同信息,但多打印了一行onConfigChanged
onSaveInstanceState()à
onPause()à
onStop()à
onDestroy()à
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
onConfigurationChanged()à
把步骤5的android:configChanges=“orientation”改成
android:configChanges=“orientation|keyboradHidden”,执行步骤3,就只打印onConfigChanged
onConfigurationChanged()à
把步骤5的android:configChanges=“orientation”改成
android:configChanges=“orientation|keyboradHidden”,执行步骤4
onConfigurationChanged()à
onConfigurationChanged()à
1) 不设置activity的android:configChanges时,切横屏时会执行一次,切竖屏时会执行两次。
2) 设置activity的android:configChanges=“orientation”时, 切屏会重新调用各个生命周期,切横屏、竖屏时都只会执行一次,但是竖屏最后多打印一条onConfigurationChanged()
3) 设置activity的android:configChanges=“orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged(),横屏一次,竖屏两次
再总结下整个activity的生命周期:
当前activity产生事件弹出Toast和AlertDialog的时候Activity的生命周期不会有改变
Activity运行时按下HOME键(跟被完全覆盖一样的)
onSavaInstanceStateà
onRestartà
onResumeà
未被完全覆盖,只是失去焦点:
onResumeà
16.如何将SQLite数据库(.db文件)与apk文件一起发布?
答:可以将.db文件复制到Eclipse Android工程中的res aw目录中。所有在res aw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。可以将.db文件复制到res aw目录中
17.如何将打开res aw目录中的数据库文件?
答:在Android中不能直接打开res aw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得res aw目录中资源的 InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。
18.android 中有哪几种解析xml的类?官方推荐哪种?以及它们的原理和区别:
答:XML解析主要有三种方式,SAX、DOM、PULL。常规在PC上开发我们使用Dom相对轻松些,但一些性能敏感的数据库或手机上还是主要采用SAX方 式,SAX读取是单向的,优点:不占内存空间、解析属性方便,但缺点就是对于套嵌多个分支来说处理不是很方便。而DOM方式会把整个XML文件加载到内存 中去,这里Android开发网提醒大家该方法在查找方面可以和XPath很好的结合如果数据量不是很大推荐使用,而PULL常常用在J2ME对于节点处 理比较好,类似SAX方式,同样很节省内存,在J2ME中我们经常使用的KXML库来解析。
19.DDMS和TraceView的区别?
答:DDMS是一个程序执行查看器,在里面可以看见线程和堆栈等信息,TraceView是程序性能分析器
20.谈谈Android的IPC机制:
答:IPC是内部进程通信的简称,是共享"命名管道"的资源。Android中的IPC机制是为了让Activity和Service之间可以随时的进行交互,故在Android中该机制,只适用于Activity和Service之间的通信,类似于远程方法调用,类似于C/S模式的访问。通过定义AIDL接口文件来定义IPC接口。Servier端实现IPC接口,Client端调用IPC接口本地代理。
21.NDK是什么:
答:NDK是一系列工具的集合
NDK提供了一系列的工具,帮助开发者迅速的开发C/C++的动态库,并能自动将so和java应用打成apk包
NDK集成了交叉编译器,并提供了相应的mk文件和隔离cpu,平台等的差异,开发人员只需简单的修改mk文件就可以创建出so
22.描述一下android的系统架构:
答:android系统架构分从下往上为Linux内核层、运行库、应用程序框架层和应用程序层。
Linux内核层:负责硬件的驱动程序、网络、电源、系统安全以及内存管理等功能。
运行库和androidruntion:运行库:即c/c++函数库部分,大多数都是开放源代码的函数库,例如webkit,该函数库负责android网页浏览器的运行;例如标准的c函数库libc、openssl、sqlite等,当然也包括支持游戏开发的2dsgl和3dopengles,在多媒体方面有mediaframework框架来支持各种影音和图形文件的播放与显示,如mpeg4、h.264、mp3、aac、amr、jpg和png等众多的多媒体文件格式。Androidruntion负责解释和执行生成的dalvik格式的字节码
应用软件架构:java应用程序开发人员主要是使用该层封装好的api进行快速开发的。
应用程序层:该层是java的应用程序层,android内置的googlemaps、email、IM、浏览器等,都处于该层,java开发人员工发的程序也处于该层,而且和内置的应用程序具有平等的地位,可以调用内置的应用程序,也可以替换内置的应用程序
23.Activity 与 Task的启动模式有哪些,它们含义具体是什么?
答:在一个activity中,有多次调用startActivity来启动另一个activity,要想只生成一个activity实例,可以设置启动模式。
一个activity有四种启动模式:standed,signleTop,singleTask,singleInstance
Standed:标准模式,一调用startActivity()方法就会产生一个新的实例。
SingleTop:如果已经有一个实例位于activity栈顶,就不产生新的实例,而只是调用activity中的newInstance()方法。如果不位于栈顶,会产生一个新的实例。
singleTask:会在一个新的task中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。
SingleInstance:这个和singleTask基本一样,只有一个区别:在这个模式下的activity实例所处的task中,只能有这个activity实例,不能有其他实例
24.Application类的作用:
答:API里的第一句是:
Base class for those who need to maintain global application state
如果想在整个应用中使用全局变量,在java中一般是使用静态变量,public类型;而在android中如果使用这样的全局变量就不符合Android的框架架构,但是可以使用一种更优雅的方式就是使用Application context。
首先需要重写Application,主要重写里面的onCreate方法,就是创建的时候,初始化变量的值。然后在整个应用中的各个文件中就可以对该变量进行操作了。
启动Application时,系统会创建一个PID,即进程ID,所有的Activity就会在此进程上运行。那么我们在Application创建的时候初始化全局变量,同一个应用的所有Activity都可以取到这些全局变量的值,换句话说,我们在某一个Activity中改变了这些全局变量的值,那么在同一个应用的其他Activity中值就会改变
25.说明onSaveInstanceState() 和 onRestoreInstanceState()在什么时候被调用:
答:Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate()、onPause()等生命周期方法,它们并不一定会被触发。当应用遇到意外情况(如:内存不足、用户直接按Home键)由系统销毁一个Activity时,onSaveInstanceState()才会被调用。但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。因为在这种情况下,用户的行为决定了不需要保存Activity的状态。通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。
另外,当屏幕的方向发生了改变, Activity会被摧毁并且被重新创建,如果你想在Activity被摧毁前缓存一些数据,并且在Activity被重新创建后恢复缓存的数据。可以重写Activity的 onSaveInstanceState() 和 onRestoreInstanceState()方法。
26.android的service的生命周期?哪个方法可以多次被调用:
答:1)与采用Context.startService()方法启动服务有关的生命周期方法
onCreate() -& onStart() -& onDestroy()
onCreate()该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()或bindService()方法,服务也只被创建一次。
onStart() 只有采用Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用startService()方法尽管不会多次创建服务,但onStart() 方法会被多次调用。
onDestroy()该方法在服务被终止时调用。
2)与采用Context.bindService()方法启动服务有关的生命周期方法
onCreate() -& onBind() -& onUnbind() -& onDestroy()
onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。
onUnbind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用。
如果先采用startService()方法启动服务,然后调用bindService()方法绑定到服务,再调用unbindService()方法解除绑定,最后调用bindService()方法再次绑定到服务,触发的生命周期方法如下:
onCreate() -&onStart() -&onBind() -&onUnbind()[重载后的方法需返回true] -&onRebind()
27.android的broadcast的生命周期:
答:1)Broadcast receiver生命周期中仅有一个回调方法:
void onReceive(Context curContext, Intent broadcastMsg)
当接收器接收到一条broadcast消息,Android就会调用onReceiver(),并传递给它一个Intent对象,这个对象携带着那条broadcast消息。我们认为仅当执行这个方式时,Broadcast receiver是活动的;这个方法返回时,它就终止了。这就是Broadcast receiver的生命周期。
2)由于Broadcast receiver的生命周期很短,一个带有活动的Broadcast receiver的进程是受保护的,以避免被干掉;但是别忘了有一点,Android会在任意时刻干掉那些携带不再活动的组件的进程,所以很可能会造成这个问题。
3)解决上述问题的方案采用一个Service来完成这项工作,Android会认为那个进程中(Service所在的进程)仍然有在活动的组件。
28.android view,surfaceview,glsurfaceview的区别:
答:SurfaceView是从View基类中派生出来的显示类,直接子类有GLSurfaceView和VideoView,可以看出GL和视频播放以及Camera摄像头一般均使用SurfaceViewSurfaceView和View最本质的区别在于,surfaceView是在一个新起的单独线程中可以重新绘制画面而View必须在UI的主线程中更新画面。
那么在UI的主线程中更新画面 可能会引发问题,比如你更新画面的时间过长,那么你的主UI线程会被你正在画的函数阻塞。那么将无法响应按键,触屏等消息。
当使用surfaceView 由于是在新的线程中更新画面所以不会阻塞你的UI主线程。但这也带来了另外一个问题,就是事件同步。比如你触屏了一下,你需要surfaceView中thread处理,一般就需要有一个event queue的设计来保存touch event,这会稍稍复杂一点,因为涉及到线程同步。
所以基于以上,根据游戏特点,一般分成两类。
1)被动更新画面的。比如棋类,这种用view就好了。因为画面的更新是依赖于 onTouch 来更新,可以直接使用 invalidate。 因为这种情况下,这一次Touch和下一次的Touch需要的时间比较长些,不会产生影响。
2)主动更新。比如一个人在一直跑动。这就需要一个单独的thread不停的重绘人的状态,避免阻塞main UI thread。所以显然view不合适,需要surfaceView来控制。
1.android dvm 的进程和Linux的进程,应用程序的进程是否为同一个概念:
答:dvm是dalivk虚拟机。每一个android应用程序都在自己的进程中运行,都拥有一个dalivk虚拟机实例。而每一个dvm都是在linux的一个进程。所以说可以认为是同一个概念。
2.android的动画有哪几种?他们的特点和区别是什么?
答:两种,一种是tween动画,一种是frame动画。tween动画,这种实现方式可以使视图组件移动,放大或缩小以及产生透明度的变化。frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。
3.handler进制的原理:
答:android提供了handler和looper来满足线程间的通信。Handler先进先出原则。looper用来管理特定线程内对象之间的消息交换(message Exchange).
1)looper:一个线程可以产生一个looper对象,由它来管理此线程里的message queue(消息队列)
2)handler:你可以构造一个handler对象来与looper沟通,以便push新消息到messagequeue里;或者接收looper(从messagequeue里取出)所送来的消息。
3)messagequeue:用来存放线程放入的消息。
4)线程:UI thread 通常就是main thread,而android启动程序时会为它建立一个message queue.
4.android view的刷新:
答:Android中对View的更新有很多种方式,使用时要区分不同的应用场合。我感觉最要紧的是分清:多线程和双缓冲的使用情况。
1).不使用多线程和双缓冲
这种情况最简单了,一般只是希望在View发生改变时对UI进行重绘。你只需在Activity中显式地调用View对象中的invalidate()方法即可。系统会自动调用 View的onDraw()方法。
2).使用多线程和不使用双缓冲
这种情况需要开启新的线程,新开的线程就不好访问View对象了。强行访问的话会报:android.view.ViewRoot$CalledFromWrongThreadException:Only the originalthread that created a view hierarchy can touch its views.
这时候你需要创建一个继承了android.os.Handler的子类,并重写handleMessage(Messagemsg)方法。android.os.Handler是能发送和处理消息的,你需要在Activity中发出更新UI的消息,然后再你的Handler(可以使用匿名内部类)中处理消息(因为匿名内部类可以访问父类变量,你可以直接调用View对象中的invalidate()方法
)。也就是说:在新线程创建并发送一个Message,然后再主线程中捕获、处理该消息。
3).使用多线程和双缓冲
Android中SurfaceView是View的子类,她同时也实现了双缓冲。你可以定义一个她的子类并实现SurfaceHolder.Callback接口。由于实现SurfaceHolder.Callback接口,新线程就不需要android.os.Handler帮忙了。SurfaceHolder中lockCanvas()方法可以锁定画布,绘制玩新的图像后调用unlockCanvasAndPost(canvas)解锁(显示),还是比较方便得。
5.说说mvc模式的原理,它在android中的运用:
答:android的官方建议应用程序的开发采用mvc模式。何谓mvc?
 mvc是model,view,controller的缩写,mvc包含三个部分:
  l模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。
  2视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
  3控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,想用用户出发的相关事件,交给m哦得了处理。
 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里面处理,当然对业务计算等操作也是必须放在的该层的。
6.Activity的生命周期:
答:onCreate: 在这里创建界面,做一些数据 的初始化工作
  onStart: 到这一步变成用户可见不可交互的
onResume:变成和用户可交互 的,(在activity 栈系统通过栈的方式管理这些个Activity的最上面,运行完弹出栈,则回到上一个Activity)
  onPause: 到这一步是可见但不可交互的,系统会停止动画 等消耗CPU 的事情从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在
  onstop: 变得不可见,被下一个activity覆盖了
onDestroy: 这是activity被干掉前最后一个被调用方法了,可能是外面类调用finish方法或者是系统为了节省空间将它暂时性的干掉
7.让Activity变成一个窗口:
答:Activity属性设定:有时候会做个应用程序是漂浮在手机主界面的。这个只需要在设置下Activity的主题theme,即在Manifest.xml定义Activity的地方加一句:
android :theme="@android:style/Theme.Dialog"
如果是作半透明的效果:
android:theme="@android:style/Theme.Translucent"
8.Android中常用的五种布局:
答:LinearLayout线性布局;AbsoluteLayout绝对布局;TableLayout表格布局;RelativeLayout相对布局;FrameLayout帧布局;
9.Android的五种数据存储方式:
答:sharedPreferences;文件;SQLite;contentProvider;网络
10.请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系:
答:Handler获取当前线程中的looper对象,looper用来从存有Message的Message Queue里取出message,再由Handler进行message的分发和处理。
11.AIDL的全称是什么?如何工作?能处理哪些类型的数据?
答:AIDL(AndroidInterface Definition Language)android接口描述语言
12.系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由:
答:通过直接发送Uri把参数带过去,或者通过manifest里的intentfilter里的data属性。代码如下:
Intent intent = new Intent();
Intent.setAction(“android.intent.action.View”);
Uri uriBrowsers = Uri.parse(“”);
Intent.setData(uriBrowsers);
//包名、要打开的activity
intent.setClassName(“com.android.browser”,”com.android.browser.BrowserActivity”);
startActivity(intent);
13.什么是ANR,如何避免?
答:ANR的定义:
在android上,如果你的应用程序有一段时间响应不移灵敏,系统会向用户提示“应用程序无响应”(ANR:application Not Responding)对话框。因此,在程序里对响应性能的设计很重要,这样,系统不会显示ANR给用户。
如何避免:
首先来研究下为什么它会在android的应用程序里发生和如何最佳构建应用程序来避免ANR.
android应用程序通常是运行在一个单独的线程(例如:main)里,这就意味你的应用程序所做的事情如果在主线程里占用了大长时间的话,就会引发ANR对话框,因为你的应用程序并没有给自己机会来处理输入事件或者Intent广播。
因此,运行在主线程里的任何访求都尽可能少做事情。特别是,activity应该在它的关键生命周期方法(onCreate()和onResume())里尽可能少的去作创建操作。潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程里(或者以数据库操作为例,通过异步请求的方式)来完成。然而,不是说你的主线程阻塞在那里等待子线程的完成---也不是调用Thread.wait()或者Thread.sleep()。替代的方法是:主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。以这种方式设计你的应用程序,将能保证你的主线程保持对输入的响应性并能避免由5秒输入事件的超时引发的ANR对话框。这种做法应该在其它显示UI的线程里效仿,因为它们都受相同的超时影响。
IntentReceiver执行时间的特殊限制意味着它应该做:在后台里做小的、琐碎的工作,如保存设定或注册一个Notification。和在主线程里调用的其它方法一样,应用程序应该避免在BroadcastReceiver里做耗时的操作或计算,但也不是在子线程里做这些任务(因为BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个Service。顺便提及一句,你也应该避免在Intent
Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广播时需要向用户展示什么,你应该使用Notification Manager来实现。
一般来说,在应用程序里,100到200ms是用户能感知阻滞的时间阈值,下面总结了一些技巧来避免ANR,并有助于让你的应用程序看起来有响应性。
如果你的应用程序为响应用户输入正在后台工作的话,可以显示工作的进度(ProgressBar和ProgressDialog对这种情况来说很有用)。特别是游戏,在子线程里做移动的计算。如果你的程序有一个耗时的初始化过程的话,考虑可以显示一个Splash Screen或者快速显示主画面并异步来填充这些信息。在这两种情况下,你都应该显示正在进行的进度,以免用户认为程序被冻结了。
14.什么情况会导致Force Close?如何避免?能否捕获导致其的异常?
答:如空指针等可以导致ForceC可以看Logcat,然后找到对应的程序代码来解决错误。
15.横竖屏切换时候的activity的生命周期:
1) 新建一个activity,并把各个生命周期打印出来
2) 运行activity,得到如下信息:
onCreate()à
onStart()à
onResume()à
按ctrl+F12切换成横屏时
onSaveInstanceState()à
onPause()à
onStop()à
onDestroy()à
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
再按ctrl+f12切换成竖屏时,发现打印了两次相同的Log
onSaveInstanceState()à
onPause()à
onStop()à
onDestroyà
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
onSaveInstanceState()à
onPause()à
onStop()à
onDestroyà
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
修改AndroidManifest.xml,把该Activity添加android:configChanges=“orientation”,执行步骤3
onSaveInstanceState()à
onPause()à
onStop()à
onDestroy()à
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
修改AndroidManifest.xml,把该Activity添加android:configChanges=“orientation”,执行步骤4,发现不会再打印相同信息,但多打印了一行onConfigChanged
onSaveInstanceState()à
onPause()à
onStop()à
onDestroy()à
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
onConfigurationChanged()à
把步骤5的android:configChanges=“orientation”改成
android:configChanges=“orientation|keyboradHidden”,执行步骤3,就只打印onConfigChanged
onConfigurationChanged()à
把步骤5的android:configChanges=“orientation”改成
android:configChanges=“orientation|keyboradHidden”,执行步骤4
onConfigurationChanged()à
onConfigurationChanged()à
1) 不设置activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。
2) 设置activity的android:configChanges=“orientation”时, 切屏会重新调用各个生命周期,切横屏、竖屏时都只会执行一次,但是竖屏最后多打印一条onConfigurationChanged()
3) 设置activity的android:configChanges=“orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged(),横屏一次,竖屏两次
再总结下整个activity的生命周期:
当前activity产生事件弹出Toast和AlertDialog的时候Activity的生命周期不会有改变
Activity运行时按下HOME键(跟被完全覆盖一样的)
onSavaInstanceStateà
onRestartà
onResumeà
未被完全覆盖,只是失去焦点:
onResumeà
16.如何将SQLite数据库(.db文件)与apk文件一起发布?
答:可以将.db文件复制到Eclipse Android工程中的res aw目录中。所有在res aw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。可以将.db文件复制到res aw目录中
17.如何将打开res aw目录中的数据库文件?
答:在Android中不能直接打开res aw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得res aw目录中资源的 InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。在Android
SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。
18.android 中有哪几种解析xml的类?官方推荐哪种?以及它们的原理和区别:
答:XML解析主要有三种方式,SAX、DOM、PULL。常规在PC上开发我们使用Dom相对轻松些,但一些性能敏感的数据库或手机上还是主要采用SAX方 式,SAX读取是单向的,优点:不占内存空间、解析属性方便,但缺点就是对于套嵌多个分支来说处理不是很方便。而DOM方式会把整个XML文件加载到内存 中去,这里Android开发网提醒大家该方法在查找方面可以和XPath很好的结合如果数据量不是很大推荐使用,而PULL常常用在J2ME对于节点处
理比较好,类似SAX方式,同样很节省内存,在J2ME中我们经常使用的KXML库来解析。
19.DDMS和TraceView的区别?
答:DDMS是一个程序执行查看器,在里面可以看见线程和堆栈等信息,TraceView是程序性能分析器
20.谈谈Android的IPC机制:
答:IPC是内部进程通信的简称,是共享"命名管道"的资源。Android中的IPC机制是为了让Activity和Service之间可以随时的进行交互,故在Android中该机制,只适用于Activity和Service之间的通信,类似于远程方法调用,类似于C/S模式的访问。通过定义AIDL接口文件来定义IPC接口。Servier端实现IPC接口,Client端调用IPC接口本地代理。
21.NDK是什么:
答:NDK是一系列工具的集合
NDK提供了一系列的工具,帮助开发者迅速的开发C/C++的动态库,并能自动将so和java应用打成apk包
NDK集成了交叉编译器,并提供了相应的mk文件和隔离cpu,平台等的差异,开发人员只需简单的修改mk文件就可以创建出so
22.描述一下android的系统架构:
答:android系统架构分从下往上为Linux内核层、运行库、应用程序框架层和应用程序层。
Linux内核层:负责硬件的驱动程序、网络、电源、系统安全以及内存管理等功能。
运行库和androidruntion:运行库:即c/c++函数库部分,大多数都是开放源代码的函数库,例如webkit,该函数库负责android网页浏览器的运行;例如标准的c函数库libc、openssl、sqlite等,当然也包括支持游戏开发的2dsgl和3dopengles,在多媒体方面有mediaframework框架来支持各种影音和图形文件的播放与显示,如mpeg4、h.264、mp3、aac、amr、jpg和png等众多的多媒体文件格式。Androidruntion负责解释和执行生成的dalvik格式的字节码
应用软件架构:java应用程序开发人员主要是使用该层封装好的api进行快速开发的。
应用程序层:该层是java的应用程序层,android内置的googlemaps、email、IM、浏览器等,都处于该层,java开发人员工发的程序也处于该层,而且和内置的应用程序具有平等的地位,可以调用内置的应用程序,也可以替换内置的应用程序
23.Activity 与 Task的启动模式有哪些,它们含义具体是什么?
答:在一个activity中,有多次调用startActivity来启动另一个activity,要想只生成一个activity实例,可以设置启动模式。
一个activity有四种启动模式:standed,signleTop,singleTask,singleInstance
Standed:标准模式,一调用startActivity()方法就会产生一个新的实例。
SingleTop:如果已经有一个实例位于activity栈顶,就不产生新的实例,而只是调用activity中的newInstance()方法。如果不位于栈顶,会产生一个新的实例。
singleTask:会在一个新的task中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。
SingleInstance:这个和singleTask基本一样,只有一个区别:在这个模式下的activity实例所处的task中,只能有这个activity实例,不能有其他实例
24.Application类的作用:
答:API里的第一句是:
Base class for those who need to maintain global application state
如果想在整个应用中使用全局变量,在java中一般是使用静态变量,public类型;而在android中如果使用这样的全局变量就不符合Android的框架架构,但是可以使用一种更优雅的方式就是使用Application context。
首先需要重写Application,主要重写里面的onCreate方法,就是创建的时候,初始化变量的值。然后在整个应用中的各个文件中就可以对该变量进行操作了。
启动Application时,系统会创建一个PID,即进程ID,所有的Activity就会在此进程上运行。那么我们在Application创建的时候初始化全局变量,同一个应用的所有Activity都可以取到这些全局变量的值,换句话说,我们在某一个Activity中改变了这些全局变量的值,那么在同一个应用的其他Activity中值就会改变
25.说明onSaveInstanceState() 和 onRestoreInstanceState()在什么时候被调用:
答:Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate()、onPause()等生命周期方法,它们并不一定会被触发。当应用遇到意外情况(如:内存不足、用户直接按Home键)由系统销毁一个Activity时,onSaveInstanceState()才会被调用。但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。因为在这种情况下,用户的行为决定了不需要保存Activity的状态。通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。
另外,当屏幕的方向发生了改变, Activity会被摧毁并且被重新创建,如果你想在Activity被摧毁前缓存一些数据,并且在Activity被重新创建后恢复缓存的数据。可以重写Activity的 onSaveInstanceState() 和 onRestoreInstanceState()方法。
26.android的service的生命周期?哪个方法可以多次被调用:
答:1)与采用Context.startService()方法启动服务有关的生命周期方法
onCreate() -& onStart() -& onDestroy()
onCreate()该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()或bindService()方法,服务也只被创建一次。
onStart() 只有采用Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用startService()方法尽管不会多次创建服务,但onStart() 方法会被多次调用。
onDestroy()该方法在服务被终止时调用。
2)与采用Context.bindService()方法启动服务有关的生命周期方法
onCreate() -& onBind() -& onUnbind() -& onDestroy()
onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。
onUnbind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用。
如果先采用startService()方法启动服务,然后调用bindService()方法绑定到服务,再调用unbindService()方法解除绑定,最后调用bindService()方法再次绑定到服务,触发的生命周期方法如下:
onCreate() -&onStart() -&onBind() -&onUnbind()[重载后的方法需返回true] -&onRebind()
27.android的broadcast的生命周期:
答:1)Broadcast receiver生命周期中仅有一个回调方法:
void onReceive(Context curContext, Intent broadcastMsg)
当接收器接收到一条broadcast消息,Android就会调用onReceiver(),并传递给它一个Intent对象,这个对象携带着那条broadcast消息。我们认为仅当执行这个方式时,Broadcast receiver是活动的;这个方法返回时,它就终止了。这就是Broadcast receiver的生命周期。
2)由于Broadcast receiver的生命周期很短,一个带有活动的Broadcast receiver的进程是受保护的,以避免被干掉;但是别忘了有一点,Android会在任意时刻干掉那些携带不再活动的组件的进程,所以很可能会造成这个问题。
3)解决上述问题的方案采用一个Service来完成这项工作,Android会认为那个进程中(Service所在的进程)仍然有在活动的组件。
28.android view,surfaceview,glsurfaceview的区别:
答:SurfaceView是从View基类中派生出来的显示类,直接子类有GLSurfaceView和VideoView,可以看出GL和视频播放以及Camera摄像头一般均使用SurfaceView
SurfaceView和View最本质的区别在于,surfaceView是在一个新起的单独线程中可以重新绘制画面而View必须在UI的主线程中更新画面。
那么在UI的主线程中更新画面 可能会引发问题,比如你更新画面的时间过长,那么你的主UI线程会被你正在画的函数阻塞。那么将无法响应按键,触屏等消息。
当使用surfaceView 由于是在新的线程中更新画面所以不会阻塞你的UI主线程。但这也带来了另外一个问题,就是事件同步。比如你触屏了一下,你需要surfaceView中thread处理,一般就需要有一个event queue的设计来保存touch event,这会稍稍复杂一点,因为涉及到线程同步。
所以基于以上,根据游戏特点,一般分成两类。
1)被动更新画面的。比如棋类,这种用view就好了。因为画面的更新是依赖于 onTouch 来更新,可以直接使用 invalidate。 因为这种情况下,这一次Touch和下一次的Touch需要的时间比较长些,不会产生影响。
2)主动更新。比如一个人在一直跑动。这就需要一个单独的thread不停的重绘人的状态,避免阻塞main UI thread。
  5、IntentService有何优点?
  答:IntentService 的好处
  * Acitivity的进程,当处理Intent的时候,会产生一个对应的Service
  * Android的进程处理器现在会尽可能的不kill掉你
  * 非常容易使用
  6、横竖屏切换时候activity的生命周期?
  1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
  2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次,竖屏的时候还会执行onConfigurationChanged方法
  3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
1. 如何将SQLite数据库(dictionary.db文件)与apk文件一起发布?
  解答:可以将dictionary.db文件复制到Eclipse Android工程中的res aw目录中。所有在res aw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。可以将dictionary.db文件复制到res aw目录中
  2. 如何将打开res aw目录中的数据库文件?
  解答:在Android中不能直接打开res aw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得res aw目录中资源的 InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。在Android
SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。
  3. Android引入广播机制的用意?
  答:a:从MVC的角度考虑(应用程序内)
 其实回答这个问题的时候还可以这样问,android为什么要有那4大组件,现在的移动开发模型基本上也是照搬的web那一套MVC架构,只不过是改了点嫁妆而已。android的四大组件本质上就是为了实现移动或者说嵌入式设备上的MVC架构,它们之间有时候是一种相互依存的关系,有时候又是一种补充关系,引入广播机制可以方便几大组件的信息和数据交互。
  b:程序间互通消息(例如在自己的应用程序内监听系统来电)
  c:效率上(参考UDP的广播协议在局域网的方便性)
  d:设计模式上(反转控制的一种应用,类似监听者模式)
41. 如何退出 Activity?如何安全退出已调用多个 Activity 的 Application?
对于单一 Activity 的应用来说,退出很简单,直接 finish()即可。 当然,也可以用 killProcess()和 System.exit()这样的方法。 但是,对于多 Activity 的应用来说,在打开多个 Activity 后,如果想在最后打开的 Activity 直接退出,上边的方法都是没有用的,因为上边的方法都是结束一个
Activity 而已。 当然,网上也有人说可以。 就好像有人问, 在应用里如何捕获 Home 键, 有人就会说用 keyCode 比较 KEYCODE_HOME 即可,而事实上如果不修改 framework,根本不可能做到这一点一样。 所以,最好还是自己亲自试一下。 那么,有没有办法直接退出整个应用呢? 在 2.1 之前,可以使用 ActivityManager 的 restartPackage 方法。 它可以直接结束整个应用。在使用时需要权限 ndroid.permission.RESTART_PACKAGES。
注意不要被它的名字迷惑。
可是,在 2.2,这个方法失效了。 在 2.2 添加了一个新的方法,killBackgroundProcesses(),需要权限 android.permission.KILL_BACKGROUND_PROCESSES。 可惜的是,它和 2.2 的 restartPackage 一样,根本起不到应有的效果。 另外还有一个方法,就是系统自带的应用程序管理里,强制结束程序的方法,
forceStopPackage()。 它需要权限 android.permission.FORCE_STOP_PACKAGES。 并且需要添加 android:sharedUserId="android.uid.system"属性 同样可惜的是,该方法是非公开的,他只能运行在系统进程,第三方程序无法调用。 因为需要在 Android.mk 中添加 LOCAL_CERTIFICATE := platform。 而 Android.mk 是用于在 Android 源码下编译程序用的。 从以上可以看出,在 2.2,没有办法直接结束一个应用,而只能用自己的办法间接办到。
现提供几个方法,供参考:
1、抛异常强制退出: 该方法通过抛异常,使程序 Force Close。 验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出 Force Close 的窗口。
2、记录打开的 Activity: 每打开一个 Activity,就记录下来。在需要退出时,关闭每一个 Activity 即可。
3、发送特定广播: 在需要结束应用时,发送一个特定的广播,每个 Activity 收到广播后,关闭即可。
4、递归退出 在打开新的 Activity 时使用 startActivityForResult,然后自己加标志,在 onActivityResult 中 处理,递归关闭。
除了第一个,都是想办法把每一个 Activity 都结束掉,间接达到目的。 但是这样做同样不完美。 你会发现,如果自己的应用程序对每一个 Activity 都设置了 nosensor,在两个 Activity 结束 的间隙,sensor 可能有效了。 但至少,我们的目的达到了,而且没有影响用户使用。
为了编程方便,最好定义一个 Activity 基类,处理这些共通问题。
43. 请介绍下 Android 的数据存储方式。
一.SharedPreferences 方式
二.文件存储方式
三.SQLite 数据库方式
四.内容提供器(Content provider)方式
五. 网络存储方式
43. 请介绍下 ContentProvider 是如何实现数据共享的。
创建一个属于你自己的 Content provider 或者将你的数据添加到一个已经存在的 Content provider 中,前提是有相同数据类型并且有写入 Content provider 的权限。
44. 如何启用 Service,如何停用 Service。 Android 中的 service 类似于 windows 中的 service,service 一般没有用户操作界面,它运行 于系统中不容易被用户发觉, 可以使用它开发如监控之类的程序。
一。步骤 第一步:继承 Service 类 public class SMSService extends Service { }
   第二步:在 AndroidManifest.xml 文件中的&application&节点里对服务进行配置: &service android:name=".DemoService" /&
二。Context.startService()和 Context.bindService 服务不能自己运行,需要通过调用 Context.startService()或 Context.bindService()方法启动服 务。这两个方法都可 以启动 Service,但是它们的使用场合有所不同。
   1.使用 startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务 仍然运行。 使用 bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就 终止。
   2.采用 Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的 onCreate()方法, 接着调用 onStart()方法。 如果调用 startService()方法前服务已经被创建, 多次调用 startService() 方法并 不会导致多次创建服务,但会导致多次调用 onStart()方法。
采用 startService()方法启动的服务,只能调用 Context.stopService()方法结束服务,服务结束 时会调用 onDestroy()方法。
3.采用 Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的 onCreate()方法, 接着调用 onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调 用服务的 onUnbind()方法, 。接着调用 onDestroy()方法。如果调用 bindService()方法前服务已经被绑定,多次调用
bindService()方法并不会 导致多次创建服务及绑定(也就是说 onCreate()和 onBind()方法并不会被多次调用)。 如果调用 者希望与正在绑定的服务 解除绑定,可以调用 unbindService()方法,调用该方法也会导致系统调用服务的 onUnbind()--&onDestroy()方法。
三。Service 的生命周期 1.Service 常用生命周期回调方法如下: onCreate() 该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次 startService()或 bindService()方法, 服务也只被创建一次。 onDestroy()该方法在服务被终止时调用。 2. Context.startService()启动
Service 有关的生命周期方法 onStart() 只有采用 Context.startService()方法启动服务时才会回调该方法。该方法在服务开 始运行时被调用。 多次调用 startService()方法尽管不会多次创建服务,但 onStart() 方法会被多次调用。 3. Context.bindService()启动 Service 有关的生命周期方法 onBind()只有采用 Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与 服务绑定时被调用, 当调用者与服务已经绑定,多次调用
Context.bindService()方法并不会导致该方法被多次调 用。 onUnbind()只有采用 Context.bindService()方法启动服务时才会回调该方法。 该方法在调用者 与服务解除绑定时被调用。 备注: 1. 采用 startService()启动服务 Intent intent = new Intent(DemoActivity.this, DemoService.class); startService(intent); 2.Context.bindService()启动 Intent
intent = new Intent(DemoActivity.this, DemoService.class); bindService(intent, conn, Context.BIND_AUTO_CREATE); //unbindService(conn);//解除绑定
问的问题都比较底层,总结一下大体如下:
1.对多线程的运用和理解,及多线程之间handle的传值。
我觉得这个问题问的好。多线程的理解很重要。但是开发的时候一般应该是用不到的。
2.对android虚拟机的理解,包括内存管理机制垃圾回收机制。
3.framework工作方式及原理,Activity是如何生成一个view的,机制是什么。
4.android本身的一些限制,比如apk包大小限制,读取大文件时的时间限制。
5.ANR是什么?哪些情况下会发生?开发时如何寻找ANR?
ANR,Application not respons,我个人认为就是在UI线程进行耗时操作所造成的。Android的Activity反应时间是5秒,BroadCast是10秒,所以尽量不要做耗时的操作。开发的时候如果遇到了ANR,就看你操作的地方是否进行了耗时操作,是否在UI线程进行了耗时的网络请求或者I/O操作,避免这些就OK了。
6.这个问题有必要看看,想当初毕业的时候对这个是多么的熟悉啊,现在都忘了,平时用的确实比较少。还有String,StringBuilder,StringBuffer这3个的区别。都有必要好好看看。
HashCode,equals 和 ==
7.java集合的理解
8.Java:重写equals()和hashCode()
总结一点,我和朋友最近面试了几乎所有国内的稍大点的互联网公司(百度、腾讯、阿里、金山、小米、360、美团、去哪、网易、搜狐等等吧)、国企、电商(万达电商)、还有些小公司、安全类(360)的等等吧,上面都是我一点点整理出来的,希望大家认真的把每一个题弄懂,你去面试任何一家公司,我认为都是没有问题的。说几个点,注意一下。
1、数据结构和
一般情况下,工作中是用不到的,但是就是问,每个公司都问,而且有的公司还问的特别深,还让你手写代码。我觉得这个确实有点恶心,我个人也是很讨厌算法的,但是真是没办法,人家就问,你说怎么办?只能学呗。列个表,大家可以按照下面的去学习。不要一下看完,你看完也没用,你没有深入理解。每三天学一种,半年后,我觉得你应该会进步很多。然后可以看看“编程之美”等算法书,应该会有较大的提高。
常见的数据结构
线性:数组、链表、队列、堆栈、块状数组(数组+链表)
、hash表、双端队列、位图(bitmap)
树:堆(大顶堆、小顶堆),trie树(字母树or字典树),后缀树,后缀数组,二叉排序/查找树,B+/B-/B*,AVL树,Treap,红黑树,splay树,线段树,树状数组
其它:并查集
1)基本思想:枚举,递归,分治,模拟,贪心,动态规划,剪枝,回溯
2)图算法:深度优先遍历与广度优先遍历,最短路径,最小生成树,拓扑排序
3)字符串算法:字符串查找,hash算法,KMP算法
4)排序算法:冒泡、快排、桶排序
5)动态规划:背包问题,最长公共子序列,最优二分检索树
6)数论问题:素数问题,整数问题,进制转换,同余模运算
7)排列组合:排序和组合算法
8)其它:LCA与RMQ问题
HTTP协议、TCP/IP协议,这个在Android的面试中问的比较少,但是了解一下,或者你学的比较深入,优势就比较明显了。会是你的加分点。所以,系统并且深入的学习一下就非常有必要了。
3.Android的基础
这个肯定是必须的了,比如listview优化、UI特效的实现、数据库层的搭建、JNI的使用等等。参照上面的面试题就可以。
有些补充略显臃肿,只为学习
1.activity的生命周期。
在activity第一次被创建的时候调用。这里是你做所有初始化设置的地方──创建视图、设置布局、绑定数据至列表等。如果曾经有状态记录(参阅后述。),则调用此方法时会传入一个包含着此activity以前状态的包对象做为参数。
总继之以onStart()。
在activity停止后onStop(),在再次启动之前被调用。
总继之以onStart()。
当activity正要变得为用户所见时被调用。
当activity转向前台时继以onResume(),在activity变为隐藏时继以onStop()。
onResume()
在activity开始与用户进行交互之前被调用。此时activity位于堆栈顶部,并接受用户输入。
继之以onPause()。
当系统将要启动另一个activity时调用。此方法主要用来将未保存的变化进行持久化,停止类似动画这样耗费CPU的动作等。这一切动作应该在短时间内完成,因为下一个activity必须等到此方法返回后才会继续。
当activity重新回到前台是继以onResume()。当activity变为用户不可见时继以onStop()。
onResume()
当activity不再为用户可见时调用此方法。这可能发生在它被销毁或者另一个activity(可能是现存的或者是新的)回到运行状态并覆盖了它。
如果activity再次回到前台跟用户交互则继以onRestart(),如果关闭activity则继以onDestroy()。
onRestart()
onDestroy()
在activity销毁前调用。这是activity接收的最后一个调用。这可能发生在activity结束(调用了它的
方法)或者因为系统需要空间所以临时的销毁了此acitivity的实例时。你可以用 方法来区分这两种情况。
1、onCreate():当Activity被创建的时候调用(第一次)。操作:设置布局文件,初始化视图,绑定数据文件等。
2、onStart():当Activity能被我们看到的时候。
3、onResume():当Activity获得用户的焦点的时候,就是能被用户操作的时候。
4、onPause()[pause暂停的意思]:Activity暂停。应用程序启动了另一个Activity的时候。例子:来了一个电话,系统启动了电话Activity。在这个函数里要做的就是把Activity的数据保存起来,当接完电话的时候,再把这些数据读出来,把原来的Activity还原出来。
5、onstop():当第二个Activity把第一个Activity完全遮挡住了的时候。对话框并没有把原来的Activity完全遮挡起来,不会调用。
6、onDestroy():销毁Activity。1)调用了finish()方法。2)系统资源不够用了。
函数调用过程:
启动第一个Activity的时候:
第一次创建onCreate()--&Activity可见了onStart()--&Activity可以操作了onResume()。
点击第一个Activity上的按钮通过Intent跳到第二个Activity:
第一个Activity暂停onPause()--&创建第二个ActivityonCreate()--&Activity可见onStart()--&Activity可操作onResume()--&第一个Activity被第二个Activity完全遮盖onStop()(如果调用了finish(),或者系统资源紧缺,则会被销毁onDestory())。
点击系统返回功能建,从第二个Activity回到第一个Activity :
第二个Activity暂停onPause()--&第一个Activity重启动OnRestart()(并没有被销毁,如果销毁了则要创建onCreate())--&第一个Activity可见onStart()--&第一个Activity可操作onResume()--&第二个Activity被完全遮盖onStop()(如果调用了finish(),或者系统资源紧缺,则会被销毁onDestory())。
2.横竖屏切换时候activity的生命周期
1.不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次.
2.设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次.
3.设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法.
3.android中的动画有哪几类,它们的特点和区别是什么
Android提供两种创建简单动画的机制:tweened animation(补间动画) 和 frame-by-frame animation(帧动画).
tweened animation:通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果
frame-by-frame animation:顺序播放事先做好的图像,跟电影类似
这两种动画类型都能在任何View对象中使用,用来提供简单的旋转计时器,activity图标及其他有用的UI元素。Tweened animation被andorid.view.animation包所操作;frame-by-frame animation被android.graphics.drawable.AnimationDrawable类所操作。
想了解更多关于创建tweened和frame-by-frame动画的信息,读一下Dev Guide-Graphics-2D Graphics里面相关部分的讨论。
Animation 是以 XML格式定义的,定义好的XML文件存放在res/anim中。由于Tween Animation与Frame-by-frame Animation的定义、使用都有很大的差异,我们将分开介绍,本篇幅中主要介绍Tween
Animation的定义与使用。按照XML文档的结构【父节点,子节点,属性】来介绍Tween Animation,其由4种类型:
Alpha: 渐变透明度动画效果
Scale:渐变尺寸伸缩动画效果
Translate:画面转换位置移动动画效果
Rotate: 画面转换角度移动动画效果
在介绍以上4种 类型前,先介绍Tween Animation共同的节点属性。
属性[类型]
Duration[long]
属性为动画持续时间
时间以毫秒为单位
fillAfter [boolean]
当设置为true ,该动画转化在动画结束后被应用
fillBefore[boolean]
当设置为true ,该动画转化在动画开始前被应用
interpolator
指定一个动画的插入器
有一些常见的插入器
accelerate_decelerate_interpolator
加速-减速 动画插入器
accelerate_interpolator
加速-动画插入器
decelerate_interpolator
减速- 动画插入器
其他的属于特定的动画效果
repeatCount[int]
动画的重复次数
RepeatMode[int]
定义重复的行为
1:重新开始
2:plays backward
startOffset[long]
动画之间的时间间隔,从上次动画停多少时间开始执行下个动画
zAdjustment[int]
定义动画的Z Order的改变
0:保持Z Order不变
1:保持在最上层
-1:保持在最下层
下面我们开始结 合具体的例子,分别介绍4种类型各自特有的节点元素。
渐变透明度动画效果
android:fromAlpha=”0.1″
android:toAlpha=”1.0″
android:duration=”3000″ /&
属性为动画起始时透明度
0.0表示完全不透明
1.0表示完全透明
以上值取0.0-1.0之间的float数据类型的数字
属性为动画结束时透明度
渐变尺寸伸缩动画效果
android:interpolator= “@android:anim/accelerate_decelerate_interpolator”
android:fromXScale=”0.0″
android:toXScale=”1.4″
android:fromYScale=”0.0″
android:toYScale=”1.4″
android:pivotX=”50%”
android:pivotY=”50%”
android:fillAfter=”false”
android:startOffset=“700”
android:duration=”700″
android:repeatCount=”10″ /&
fromXScale[float] fromYScale[float]
为动画起始时,X、Y坐标上的伸缩尺寸
0.0表示收缩到没有
1.0表示正常无伸缩
值小于1.0表示收缩
值大于1.0表示放大
toXScale [float]
toYScale[float]
为动画结束时,X、Y坐标上的伸缩尺寸
pivotX[float]
pivotY[float]
为动画相对于物件的X、Y坐标的开始位置
属性值说明:从0%-100%中取值,50%为物件的X或Y方向坐标上的中点位置
画面转换位置移动动画效果
&translate
android:fromXDelta=”30″
android:toXDelta=”-80″
android:fromYDelta=”30″
android:toYDelta=”300″
android:duration=”2000″ /&
fromXDelta
为动画、结束起始时 X坐标上的位置
fromYDelta
为动画、结束起始时 Y坐标上的位置
画面转移旋转动画效果
android:interpolator=”@android:anim/accelerate_decelerate_interpolator”
android:fromDegrees=”0″
android:toDegrees=”+350″
android:pivotX=”50%”
android:pivotY=”50%”
android:duration=”3000″ /&
fromDegrees
为动画起始时物件的角度
当角度为负数——表示逆时针旋转
当角度为正数——表示顺时针旋转
(负数from——to正数:顺时针旋转)
(负数from——to负数:逆时针旋转)
(正数from——to正数:顺时针旋转)
(正数from——to负数:逆时针旋转)
为动画结束时物 件旋转的角度 可以大于360度
为动画相对于物件的X、Y坐标的开始位置
说明:以上两个属性值 从0%-100%中取值
50%为物件的X或Y方向坐标上的中点位置
Android SDK提供了基类:Animation,包含大量的set/getXXXX()函数来设置、读取Animation的属性,也就是前面表一中显示的各种属性。Tween Animation由4种类型:alpha、scale、translate、roate,在Android SDK中提供了相应的类,Animation类派生出了AlphaAnimation、ScaleAnimation、 TranslateAnimation、RotateAnimation分别实现了 改变
Alpha值 、 伸缩 、 平移 、 旋转 等动画,每个子类都在父类的基础上增加了各自独有的属性。
Android的动画效果分为两种,一种是tweened animation(补间动画),第二种是frame
by frame animation。一般我们用的是第一种。补间动画又分为AlphaAnimation,透明度转换
RotateAnimation,旋转转换
ScaleAnimation,缩放转换
TranslateAnimation 位置转换(移动)。动画效果在anim目录下的xml文件中定义,在程序中用AnimationUtils.loadAnimation(Context context,int ResourcesId)载入成Animation对象,在需要显示动画效果时,执行需要动画的View的startAnimation方法,传入Animation,即可。切换Activity也可以应用动画效果,在startActivity方法后,执行overridePendingTransition方法,两个参数分别是切换前的动画效果,切换后的动画效果
4. 一条最长的短信息约占多少
  中文70(包括标点),英文160个字节。
5.handler机制的原理
  andriod提供了 Handler 和 Looper 来满足线程间的通信。Handler 先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。
  1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。
2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息。
  3) Message Queue(消息队列):用来存放线程放入的消息。
  4)线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。
6.什么是嵌入式实时操作系统操作系统属于实时操作系统吗
  嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。主要用于工业控制、 军事设备、 航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。又可分为软实时和硬实时两种,而android是基于linux内核的,因此属于软实时
7.android中线程与线程,进程与进程之间如何通信
1、一个 Android 程序开始运行时,会单独启动一个Process。
默认情况下,所有这个程序中的Activity或者Service都会跑在这个Process。
默认情况下,一个Android程序也只有一个Process,但一个Process下却可以有许多个Thread。2、一个 Android 程序开始运行时,就有一个主线程Main Thread被创建。该线程主要负责UI界面的显示、更新和控件交互,所以又叫UI Thread。
一个Android程序创建之初,一个Process呈现的是单线程模型--即Main Thread,所有的任务都在一个线程中运行。所以,Main Thread所调用的每一个函数,其耗时应该越短越好。而对于比较费时的工作,应该设法交给子线程去做,以避免阻塞主线程(主线程被阻塞,会导致程序假死 现象)。
3、Android单线程模型:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。如果在子线程中直接修改UI,会导致异常。
8.Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念
  DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。
9.sim卡的EF 文件有何作用
  sim卡的文件系统有自己规范,主要是为了和手机通讯,sim本 身可以有自己的操作系统,EF就是作存储并和手机通讯用的
11.让Activity变成一个窗口:Activity属性设定
  讲点轻松的吧,可能有人希望做出来的应用程序是一个漂浮在手机主界面的东西,那么很 简单你只需要设置 一下Activity的主题就可以了在AndroidManifest.xml 中定义 Activity的 地方一句话:
  Xml代码
  1. android :theme="@android:style/Theme.Dialog"
  这就使你的应用程序变成对话框的形式弹出来了,或者
  Xml代码
  1. android:theme="@android:style/Theme.Translucent"
  就变成半透明的,[友情提示-.-]类似的这种activity的属性可以在android.R.styleable 类的AndroidManifestActivity 方法中看到,AndroidManifest.xml中所有元素的属性的介绍都可以参考这个类android.R.styleable
  上面说的是属性名称,具体有什么值是在android.R.style中 可以看到,比如这个"@android:style/Theme.Dialog" 就对应于android.R.style.Theme_Dialog ,('_'换成'.' & --注意:这个是文章内容不是笑脸)就可以用在描述文件 中了,找找类定义和描述文件中的对应关系就都明白了。
12.如何将SQLite数据库(dictionary.db文件)与apk文件一起发布?
  解答:可以将dictionary.db文件复制到Eclipse Android工程中的res raw目录中。所有在res raw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。可以将dictionary.db文件复制到res
13.如何将打开res aw目录中的数据库文件?
  解答:在Android中不能直接打开res raw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得res raw目录中资源的 InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。
14.在中的具体体现
Android 的官方建议应用程序的开发采用MVC 模式。何谓MVC?先看看下图
MVC 是Model,View,Controller 的缩写,从上图可以看出MVC 包含三个部分:
.. 模型(Model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该
.. 视图(View)对象:是应用程序中负责生成用户界面的部分。也是在整个
MVC 架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
.. 控制器(Control)对象:是根据用户的输入,控制用户界面数据显示及更新
Model 对象状态的部分,控制器更重要的一种导航功能,响应用户出发的相
关事件,交给M 层处理。
Android 鼓励弱耦合和组件的重用,在Android 中MVC 的具体体现如下
1)视图层():一般采用xml文件进行界面的描述,使用的时候可以非常方便的引入,当然,如何你对android了解的比较多的话,就一定可以想到在android中也可以使用javascript+html等的方式作为view层,当然这里需要进行java和javascript之间的通信,幸运的是,android提供了它们之间非常方便的通信实现。
  2)控制层():android的控制层的重任通常落在了众多的acitvity的肩上,这句话也就暗含了不要在acitivity中写代码,要通过activity交给model层做业务逻辑的处理, 这样做的另外一个原因是android中的acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。
  3)模型层():对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的。
15.Android系统的架构
android的系统架构和其操作系统一样,采用了分层的架构。从架构图看,android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。
  1.应用程序
  Android会同一系列核心应用程序包一起发布,该应用程序包包括email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。
  2.应用程序框架
  开发人员也可以完全访问核心应用程序所使用的API框架。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。
  隐藏在每个应用后面的是一系列的服务和系统, 其中包括;
  * 丰富而又可扩展的视图(Views),可以用来构建应用程序, 它包括列表(lists),网格(grids),文本框(text boxes),按钮(buttons), 甚至可嵌入的web浏览器。
  * 内容提供器(Content Providers)使得应用程序可以访问另一个应用程序的数据(如联系人数据库), 或者共享它们自己的数据
  * 资源管理器(Resource Manager)提供 非代码资源的访问,如本地字符串,图形,和布局文件( layout files )。
  * 通知管理器 (Notification Manager) 使得应用程序可以在状态栏中显示自定义的提示信息。
  * 活动管理器( Activity Manager) 用来管理应用程序生命周期并提供常用的导航回退功能。
  有关更多的细节和怎样从头写一个应用程序,请参考 如何编写一个 Android 应用程序.
  系统运行库
  1)程序库
  Android 包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。以下是一些核心库:
  * 系统 C 库 - 一个从 BSD 继承来的标准 C 系统函数库( libc ), 它是专门为基于 embedded linux 的设备定制的。
  * 媒体库 - 基于 PacketVideo OpenCORE;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。
  * Surface Manager - 对显示子系统的管理,并且为多个应用程序提 供了2D和3D图层的无缝融合。
  * LibWebCore - 一个最新的web浏览器引擎用,支持Android浏览器和一个可嵌入的web视图。
  * SGL - 底层的2D图形引擎
  * 3D libraries - 基于OpenGL ES 1.0 APIs实现;该库可以使用硬件 3D加速(如果可用)或者使用高度优化的3D软加速。
  * FreeType -位图(bitmap)和矢量(vector)字体显示。
  * SQLite - 一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。
  2)Android 运行库
  Android 包括了一个核心库,该核心库提供了JAVA核心库的大多数功能。
  每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统。 Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了优化。同时虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK中 的 “dx” 工具转化成.dex格式由虚拟机执行。
  Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和底层内存管理机制。
Android 的核心系统服务依赖于 Linux 2.6 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型。 Linux 内核也同时作为硬件和软件栈之间的抽象层。
16.Android常用控件的信息
单选框与:
RadioGroup用于对单选框进行分组,相同组内的单选框只有一个单选框被选中。
事件:setOnCheckedChangeListener(),处理单选框被选择事件。把RadioGroup.OnCheckedChangeListener实例作为参数传入。
每个多选框都是独立的,可以通过迭代所有的多选框,然后根据其状态是否被选中在获取其值。
事件:setOnCheckedChangeListener(),处理多选框被选择事件。把CheckBox.OnCheckedChangeListener()实例作为参数传入。
下拉列表框):
Spinner.getItemAtPosition(Spinner.getSelectedItemPosition());获取下拉列表框的值。
事件:setOnItemSelectedListener(),处理下拉列表框被选择事件把Spinner.OnItemSelectedListener()实例作为参数传入。
SeekBar.getProgress()获取拖动条当前值
事件:setOnSeekBarChangeListener(),处理拖动条值变化事件,把SeekBar.OnSeekBarChangeListener实例作为参数传入。
重写Activity的onCreatOptionMenu(Menu menu)方法,该方法用于创建选项菜单,当用户按下手机的"Menu"按钮时就会显示创建好的菜单,在onCreatOptionMenu(Menu Menu)方法内部可以调用Menu.add()方法实现菜单的添加。
重写Activity的onMenuItemSelected()方法,该方法用于处理菜单被选择事件。
进度对话框(ProgressDialog):
创建并显示一个进度对话框:ProgressDialog.show(ProgressDialogActivity.this,"请稍等","数据正在加载中....",true);
设置对话框的风格:setProgressStyle()
ProgressDialog.STYLE_SPINNER
旋转进度条风格(为默认风格)
ProgressDialog.STYLE_HORIZONTAL 横向进度条风格
下面是各种常用控件的事件监听的使用
①EditText(编辑框)的事件监听---OnKeyListener
②RadioGroup、RadioButton(单选按钮)的事件监听---OnCheckedChangeListener
③CheckBox(多选按钮)的事件监听---OnCheckedChangeListener
④Spinner(下拉列表)的事件监听---OnItemSelectedListener
⑤Menu(菜单)的事件处理---onMenuItemSelected
⑥Dialog(对话框)的事件监听---DialogInterface.OnClickListener()
17.请介绍下中常用的五种布局
Android布局是应用界面开发的重要一环,在Android中,共有五种布局方式,分别是:FrameLayout(帧布局),LinearLayout (线性布局),
AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)。
1.FrameLayout
这个布局可以看成是墙脚堆东西,有一个四方的矩形的左上角墙脚,我们放了第一个东西,要再放一个,那就在放在原来放的位置的上面,这样依次的放,会盖住原来的东西。这个布局比较简单,也只能放一点比较简单的东西。
2.LinearLayout
线性布局,这个东西,从外框上可以理解为一个div,他首先是一个一个从上往下罗列在屏幕上。每一个LinearLayout里面又可分为垂直布局 (android:orientation="vertical")和水平布局(android:orientation="horizontal" )。当垂直布局时,每一行就只有一个元素,多个元素依次垂直往下;水平布局时,只有一行,每一个元素依次向右排列。
LinearLayout中有一个重要的属性 android:layout_weight="1",这个weight在垂直布局时,代表行距;水平的时候代表列宽;weight值越大就越大。
3.AbsoluteLayout
绝对布局犹如div指定了absolute属性,用X,Y坐标来指定元素的位置android:layout_x="20px" android:layout_y="12px" 这种布局方式也比较简单,但是在垂直随便切换时,往往会出问题,而且多个元素的时候,计算比较麻烦。
4.RelativeLayout
相对布局可以理解为某一个元素为参照物,来定位的布局方式。主要属性有:
相对于某一个元素
android:layout_below="@id/aaa" 该元素在 id为aaa的下面
android:layout_toLeftOf="@id/bbb" 该元素在 id为bbb的左边
相对于父元素的地方
android:layout_alignParentLeft="true"
与父元素左对齐
android:layout_alignParentRight="true" 与父元素右对齐
还可以指定边距等,具体详见API
5.TableLayout
表格布局类似Html里面的Table。每一个TableLayout里面有表格行TableRow,TableRow里面可以具体定义每一个元素,设定他的对齐方式 android:gravity="" 。
每一个布局都有自己适合

我要回帖

更多关于 android 环境变量配置 的文章

 

随机推荐