安云自助建站系统源码,网页编辑岗位职责,齐齐哈尔北京网站建设,河北建设工程信息网查看http://blog.csdn.net/superjunjin/article/details/7860025 26.如果后台的Activity由于某原因被系统回收了#xff0c;如何在被系统回收之前保存当前状态#xff1f; 当你的程序中某一个Activity A 在运行时中#xff0c;主动或被动地运行另一个新的Activity B 这个时候A会… http://blog.csdn.net/superjunjin/article/details/7860025 26.如果后台的Activity由于某原因被系统回收了如何在被系统回收之前保存当前状态 当你的程序中某一个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); } 就像官方的Notepad教程 里的情况你正在编辑某一个note突然被中断那么就把这个note的id记住再起来的时候就可以根据这个id去把那个note取出来程序就完整 一些。这也是看你的应用需不需要保存什么比如你的界面就是读取一个列表那就不需要特殊记住什么哦 没准你需要记住滚动条的位置... 27.如何退出Activity 对于单一Activity的应用来说退出很简单直接finish()即可。当然也可以用killProcess()和System.exit()这样的方法。现提供几个方法供参考 1、抛异常强制退出该方法通过抛异常使程序Force Close。验证可以但是需要解决的问题是如何使程序结束掉而不弹出Force Close的窗口。 2、记录打开的Activity每打开一个Activity就记录下来。在需要退出时关闭每一个Activity即可。 3、发送特定广播在需要结束应用时发送一个特定的广播每个Activity收到广播后关闭即可。 4、递归退出在打开新的Activity时使用startActivityForResult然后自己加标志在onActivityResult中处理递归关闭。除了第一个都是想办法把每一个Activity都结束掉间接达到目的。但是这样做同样不完美。你会发现如果自己的应用程序对每一个Activity都设置了nosensor在两个Activity结束的间隙sensor可能有效了。但至少我们的目的达到了而且没有影响用户使用。为了编程方便最好定义一个Activity基类处理这些共通问题。 28.请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。 答简单的说Handler获取当前线程中的looper对象looper用来从存放Message的MessageQueue中取出Message再有Handler进行Message的分发和处理. Message Queue(消息队列)用来存放通过Handler发布的消息通常附属于某一个创建它的线程可以通过Looper.myQueue()得到当前线程的消息队列 Handler可以发布或者处理一个消息或者操作一个Runnable通过Handler发布消息消息将只会发送到与它关联的消息队列然也只能处理该消息队列中的消息 Looper是Handler和消息队列之间通讯桥梁程序组件首先通过Handler把消息传递给LooperLooper把消息放入队列。Looper也把消息队列里的消息广播给所有的 HandlerHandler接受到消息后调用handleMessage进行处理 Message消息的类型在Handler类中的handleMessage方法中得到单个的消息进行处理 在单线程模型下为了线程通信问题Android设计了一个Message Queue(消息队列) 线程间可以通过该Message Queue并结合Handler和Looper组件进行信息交换。下面将对它们进行分别介绍 1. Message Message消息理解为线程间交流的信息处理数据后台线程需要更新UI则发送Message内含一些数据给UI线程。 2. Handler Handler处理者是Message的主要处理者负责Message的发送Message内容的执行处理。后台线程就是通过传进来的 Handler对象引用来sendMessage(Message)。而使用Handler需要implement 该类的 handleMessage(Message)方法它是处理这些Message的操作内容例如Update UI。通常需要子类化Handler来实现handleMessage方法。 3. Message Queue Message Queue消息队列用来存放通过Handler发布的消息按照先进先出执行。 每个message queue都会有一个对应的Handler。Handler会向messagequeue通过两种方法发送消息sendMessage或post。这两种消息都会插在message queue队尾并按先进先出执行。但通过这两种方法发送的消息执行的方式略有不同通过sendMessage发送的是一个message对象,会被 Handler的handleMessage()函数处理而通过post方法发送的是一个runnable对象则会自己执行。 4. Looper Looper是每条线程里的Message Queue的管家。Android没有Global的MessageQueue而Android会自动替主线程(UI线程)建立Message Queue但在子线程里并没有建立Message Queue。所以调用Looper.getMainLooper()得到的主线程的Looper不为NULL但调用Looper.myLooper()得到当前线程的Looper就有可能为NULL。对于子线程使用LooperAPI Doc提供了正确的使用方法这个Message机制的大概流程 1. 在Looper.loop()方法运行开始后循环地按照接收顺序取出Message Queue里面的非NULL的Message。 2. 一开始Message Queue里面的Message都是NULL的。当Handler.sendMessage(Message)到Message Queue该函数里面设置了那个Message对象的target属性是当前的Handler对象。随后Looper取出了那个Message则调用 该Message的target指向的Hander的dispatchMessage函数对Message进行处理。在dispatchMessage方法里如何处理Message则由用户指定三个判断优先级从高到低 1) Message里面的Callback一个实现了Runnable接口的对象其中run函数做处理工作 2) Handler里面的mCallback指向的一个实现了Callback接口的对象由其handleMessage进行处理 3) 处理消息Handler对象对应的类继承并实现了其中handleMessage函数通过这个实现的handleMessage函数处理消息。 由此可见我们实现的handleMessage方法是优先级最低的 3. Handler处理完该Message (updateUI) 后Looper则设置该Message为NULL以便回收 在网上有很多文章讲述主线程和其他子线程如何交互传送信息最终谁来执行处理信息之类的个人理解是最简单的方法——判断Handler对象里面的Looper对象是属于哪条线程的则由该线程来执行 1. 当Handler对象的构造函数的参数为空则为当前所在线程的Looper 2. Looper.getMainLooper()得到的是主线程的Looper对象Looper.myLooper()得到的是当前线程的Looper对象。 29.你如何评价Android系统优缺点。 答Android平台手机 5大优势 一、开放性 在优势方面Android平台首先就是其开发性开发的平台允许任何移动终端厂商加入到Android联盟中来。显著的开放性可以使其拥有更多的开发者随着用户和应用的日益丰富一个崭新的平台也将很快走向成熟。开放性对于Android的发展而言有利于积累人气这里的人气包括消费者和厂商而对于消费者来讲随大的受益正是丰富的软件资源。开放的平台也会带来更大竞争如此一来消费者将可以用更低的价位购得心仪的手机。 二、挣脱运营商的束缚 在过去很长的一段时间特别是在欧美地区手机应用往往受到运营商制约使用什么功能接入什么网络几乎都受到运营商的控制。从去年iPhone 上市 用户可以更加方便地连接网络运营商的制约减少。随着EDGE、HSDPA这些2G至3G移动网络的逐步过渡和提升手机随意接入网络已不是运营商口中的笑谈当你可以通过手机IM软件方便地进行即时聊天时再回想不久前天价的彩信和图铃下载业务是不是像噩梦一样互联网巨头Google推动的Android终端天生就有网络特色将让用户离互联网更近。 三、丰富的硬件选择 这一点还是与Android平台的开放性相关由于Android的开放性众多的厂商会推出千奇百怪功能特色各具的多种产品。功能上的差异和特色却不会影响到数据同步、甚至软件的兼容好比你从诺基亚 Symbian风格手机 一下改用苹果 iPhone 同时还可将Symbian中优秀的软件带到iPhone上使用、联系人等资料更是可以方便地转移是不是非常方便呢 四、不受任何限制的开发商 Android平台提供给第三方开发商一个十分宽泛、自由的环境不会受到各种条条框框的阻扰可想而知会有多少新颖别致的软件会诞生。但也有其两面性血腥、暴力、情色方面的程序和游戏如可控制正是留给Android难题之一。 五、无缝结合的Google应用 如今叱诧互联网的Google已经走过10年度历史从搜索巨人到全面的互联网渗透Google服务如地图、邮件、搜索等已经成为连接用户和互联网的重要纽带而Android平台手机将无缝结合这些优秀的Google服务。 再说Android的5大不足 一、安全和隐私 由于手机 与互联网的紧密联系个人隐私很难得到保守。除了上网过程中经意或不经意留下的个人足迹Google这个巨人也时时站在你的身后洞穿一切因此互联网的深入将会带来新一轮的隐私危机。 二、首先开卖Android手机的不是最大运营商 众所周知T-Mobile在23日于美国纽约发布 了Android首款手机G1。但是在北美市场最大的两家运营商乃ATT和Verizon而目前所知取得Android手机销售权的仅有 T-Mobile和Sprint其中T-Mobile的3G网络相对于其他三家也要逊色不少因此用户可以买账购买G1能否体验到最佳的3G网络服务则要另当别论了 三、运营商仍然能够影响到Android手机 在国内市场不少用户对购得移动定制机不满感觉所购的手机被人涂画了广告一般。这样的情况在国外市场同样出现。Android手机的另一发售运营商Sprint就将在其机型中内置其手机商店程序。 四、同类机型用户减少 在不少手机论坛都会有针对某一型号的子论坛对一款手机的使用心得交流并分享软件资源。而对于Android平台手机由于厂商丰富产品类型多样这样使用同一款机型的用户越来越少缺少统一机型的程序强化。举个稍显不当的例子现在山寨机泛滥品种各异就很少有专门针对某个型号山寨机的讨论和群组除了哪些功能异常抢眼、颇受追捧的机型以外。 五、过分依赖开发商缺少标准配置 在使用PC端的Windows Xp系统的时候都会内置微软Windows Media Player这样一个播放器程序用户可以选择更多样的播放器如Realplay或暴风影音等。但入手开始使用默认的程序同样可以应付多样的需要。在Android平台中由于其开放性软件更多依赖第三方厂商比如Android系统的SDK中就没有内置音乐 播放器全部依赖第三方开发缺少了产品的统一性。 30.谈谈android数据存储方式。 Android提供了5种方式存储数据 1使用SharedPreferences存储数据它是Android提供的用来存储一些简单配置信息的一种机制采用了XML格式将数据存储到设备中。只能在同一个包内使用不能在不同的包之间使用。 2文件存储数据文件存储方式是一种较常用的方法在Android中读取/写入文件的方法与Java中实现I/O的程序是完全一样的提供了openFileInput()和openFileOutput()方法来读取设备上的文件。 3SQLite数据库存储数据SQLite是Android所带的一个标准的数据库它支持SQL语句它是一个轻量级的嵌入式数据库。 4使用ContentProvider存储数据主要用于应用程序之间进行数据交换从而能够让其他的应用保存或读取此Content Provider的各种数据类型。 5网络存储数据通过网络上提供给我们的存储空间来上传(存储)和下载(获取)我们存储在网络空间中的数据信息。 31. Android中Activity, Intent, Content Provider, Service各有什么区别。 Activity 活动是最基本的android应用程序组件。一个活动就是一个用户可以操作的可视化用户界面每一个活动都被实现为一个独立的类并且从活动基类继承而来。 Intent 意图描述应用想干什么。最重要的部分是动作和动作对应的数据。 Content Provider内容提供器android应用程序能够将它们的数据保存到文件、SQLite数据库中甚至是任何有效的设备中。当你想将你的应用数据和其他应用共享时内容提供器就可以发挥作用了。 Service服务具有一段较长生命周期且没有用户界面的程序组件。 32.View, surfaceView, GLSurfaceView有什么区别。 view是最基础的必须在UI主线程内更新画面速度较慢。 SurfaceView 是view的子类类似使用双缓机制在新的线程中更新画面所以刷新界面速度比view快 GLSurfaceView 是SurfaceView的子类opengl 专用的 33.Manifest.xml文件中主要包括哪些信息 manifest根节点描述了package中所有的内容。 uses-permission请求你的package正常运作所需赋予的安全许可。 permission 声明了安全许可来限制哪些程序能你package中的组件和功能。 instrumentation声明了用来测试此package或其他package指令组件的代码。 application包含package中application级别组件声明的根节点。 activityActivity是用来与用户交互的主要工具。 receiverIntentReceiver能使的application获得数据的改变或者发生的操作即使它当前不在运行。 serviceService是能在后台运行任意时间的组件。 providerContentProvider是用来管理持久化数据并发布给其他应用程序使用的组件。 34.根据自己的理解描述下Android数字签名。 (1)所有的应用程序都必须有数字证书Android系统不会安装一个没有数字证书的应用程序 (2)Android程序包使用的数字证书可以是自签名的不需要一个权威的数字证书机构签名认证 (3)如果要正式发布一个Android程序必须使用一个合适的私钥生成的数字证书来给程序签名而不能使用adt插件或者ant工具生成的调试证书来发布。 (4)数字证书都是有有效期的Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中即使证书过期也不会影响程序的正常功能。 35. AIDL的全称是什么?如何工作?能处理哪些类型的数据? AIDL全称Android Interface Definition LanguageAndroid接口描述语言是一种借口描述语言; 编译器可以通过aidl文件生成一段代码通过预先定义的接口达到两个进程内部通信进程跨界对象访问的目的.AIDL的IPC的机制和COM或CORBA类似, 是基于接口的但它是轻量级的。它使用代理类在客户端和实现层间传递值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相关类.; 2. 调用aidl产生的class.理论上, 参数可以传递基本数据类型和String, 还有就是Bundle的派生类, 不过在Eclipse中,目前的ADT不支持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等其他比支持的类型. (另外: 我没尝试Parcelables, 在EclipseADT下编译不过, 或许以后会有所支持). 实现接口时有几个原则: .抛出的异常不要返回给调用者. 跨进程抛异常处理是不可取的. .IPC调用是同步的。如果你知道一个IPC服务需要超过几毫秒的时间才能完成地话你应该避免在Activity的主线程中调用。也就是IPC调用会挂起应用程序导致界面失去响应. 这种情况应该考虑单起一个线程来处理. .不能在AIDL接口中声明静态属性。 IPC的调用步骤: 1. 声明一个接口类型的变量该接口类型在.aidl文件中定义。 2. 实现ServiceConnection。 3. 调用ApplicationContext.bindService(),并在ServiceConnection实现中进行传递. 4. 在ServiceConnection.onServiceConnected()实现中你会接收一个IBinder实例(被调用的Service). 调用 YourInterfaceName.Stub.asInterface((IBinder)service)将参数转换为YourInterface类型。 5. 调用接口中定义的方法。你总要检测到DeadObjectException异常该异常在连接断开时被抛出。它只会被远程方法抛出。 6. 断开连接调用接口实例中的ApplicationContext.unbindService() 参考http://buaadallas.blog.51cto.com/399160/372090 36.android:gravity与android:layout_gravity的区别 LinearLayout有两个非常相似的属性android:gravity与android:layout_gravity。他们的区别在 于android:gravity用于设置View组件的对齐方式而android:layout_gravity用于设置Container组件的 对齐方式。 举个例子我们可以通过设置android:gravitycenter来让EditText中的文字在EditText组件中居中显示同 时我们设置EditText的android:layout_gravityright来让EditText组件在LinearLayout中居右 显示。来实践以下 正如我们所看到的在EditText中其中的文字已经居中显示了而EditText组件自己也对齐到了LinearLayout的右侧。 [html] view plaincopy LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/android android:orientationvertical android:layout_widthfill_parent android:layout_heightfill_parent EditText android:layout_widthwrap_content android:gravitycenter android:layout_heightwrap_content android:textone android:layout_gravityright/ /LinearLayout 38. 注册广播接收者两种方式的区别及优缺点 答首先写一个类要继承BroadcastReceiver 第一种:在清单文件中声明,添加 receiveandroid:name.IncomingSMSReceiver intent-filter actionandroid:nameandroid.provider.Telephony.SMS_RECEIVED) intent-filter receiver 第二种使用代码进行注册如: IntentFilterfilter newIntentFilter(android.provider.Telephony.SMS_RECEIVED); IncomingSMSReceiverreceiver new IncomgSMSReceiver(); registerReceiver(receiver.filter); 两种注册类型的区别是 1)第一种是常驻型静态注册也就是说当应用程序关闭后如果有信息广播来程序也会被系统调用自动运行。 2)第二种不是常驻型广播动态注册也就是说广播跟随程序的生命周期。 注册的方法有两种一种是静态注册一种是动态注册。 动态注册优点在 Android 的广播机制中动态注册的优先级是要高于静态注册优先级的因此在必要的情况下我们是需要动态注册广播接收器的。
静态注册优点动态注册广播接收器还有一个特点就是当用来注册的 Activity 关掉后广播也就失效了。同时反映了静态注册的一个优势就是无需担忧广播接收器是否被关闭只要设备是开启状态广播接收器就是打开着的。39.Dalvik基于JVM的改进 1.几个class变为一个dexconstant pool省内存 2.Zygotecopy-on-write shared,省内存省cpu省电 3.基于寄存器的bytecode省指令省cpu省电 4.Trace-based JIT,省cpu省电,省内存 40.android中有哪几种解析xml的类,官方推荐哪种以及它们的原理和区别. Ø DOM解析 优点: 1.XML树在内存中完整存储,因此可以直接修改其数据和结构. 2.可以通过该解析器随时访问XML树中的任何一个节点. 3.DOM解析器的API在使用上也相对比较简单. 缺点:如果XML文档体积比较大时,将文档读入内存是非常消耗系统资源的. 使用场景:DOM 是用与平台和语言无关的方式表示 XML 文档的官方 W3C 标准.DOM 是以层次结构组织的节点的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能进行任何工作.DOM是基于对象层次结构的. Ø SAX解析 优点: SAX 对内存的要求比较低,因为它让开发人员自己来决定所要处理的标签.特别是当开发人员只需要处理文档中所包含的部分数据时,SAX 这种扩展能力得到了更好的体现. 缺点: 用SAX方式进行XML解析时,需要顺序执行,所以很难访问到同一文档中的不同数据.此外,在基于该方式的解析编码过程也相对复杂. 使用场景: 对于含有数据量十分巨大,而又不用对文档的所有数据进行遍历或者分析的时候,使用该方法十分有效.该方法不用将整个文档读入内存,而只需读取到程序所需的文档标签处即可. Ø Xmlpull解析 android SDK提供了xmlpull api,xmlpull和sax类似,是基于流stream操作文件,然后根据节点事件回调开发者编写的处理程序.因为是基于流的处理,因此xmlpull和sax都比较节约内存资源,不会象dom那样要把所有节点以对橡树的形式展现在内存中.xmlpull比sax更简明,而且不需要扫描完整个流. 41.Android系统中GC什么情况下会出现内存泄露呢 出现情况: 1. 数据库的cursor没有关闭 2.构造adapter时,没有使用缓存contentview 衍生listview的优化问题-----减少创建view的对象,充分使用contentview,可以使用一静态类来优化处理getview的过程 3.Bitmap对象不使用时采用recycle()释放内存 4.activity中的对象的生命周期大于activity 调试方法: DDMS HEAPSZIEdataobject[Total Size] 42.谈谈对Android NDK的理解
NDK全称Native Development Kit。1、NDK是一系列工具的集合。* NDK提供了一系列的工具帮助开发者快速开发C或C的动态库并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。* NDK集成了
交叉编译器
并提供了相应的mk文件隔离CPU、平台、ABI等差异开发人员只需要简单修改mk文件指出“哪些文件需要编译”、“编译特性要求”等就可以创建出so。* NDK可以自动地将so和Java应用一起打包极大地减轻了开发人员的打包工作。2、NDK提供了一份稳定、功能有限的API头文件声明。Google明确声明该API是稳定的在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出这些API支持的功能非常有限包含有C标准库libc、标准数学库libm、压缩库libz、Log库liblog。