Android基础

-- Activity的几种跳转方式

Android之Activity的几种跳转方式-http://blog.csdn.net/csh86277516/article/details/51790724
安卓Activity跳转的几种方式- http://www.tuicool.com/articles/Q3MrUz7

 1、使用Action跳转,如果有一个 程序 的 AndroidManifest.xml中的某一个Activity的IntentFilter段中定义了包含了相同的Action那么这个Intent 就与这个目标Action匹配。
 2,data/type,你可以用Uri来做为data,比如Uri uri = Uri.parse(http://www.google.com);
 3,至于分类Category,一般不要去在Intent中设置它,如果你写Intent的接收者,就在Manifest.xml的 Activity的 IntentFilter中包含android.category.DEFAULT
 4,extras(附加信息),是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作

> Android知识点一

1. Intent的几种有关Activity启动的方式有哪些,你了解每个含义吗?

  这里Android123提示大家,Intent的一些标记有FLAG_ACTIVITY_BROUGHT_TO_FRONT 、FLAG_ACTIVITY_CLEAR_TOP、FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET、FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS、FLAG_ACTIVITY_MULTIPLE_TASK和FLAG_ACTIVITY_NEW_TASK 等。每种含义大家看SDK文档和具体跑下这样你的记忆会更深刻些。
2. Activity和Task的启动模式有哪些? 每种含义是什么?
   有关在AndroidManifest.xml中的android:launchMode定义,主要有standard、singleTop、singleTask和singleInstance,同时对于android:taskAffinity这些问题大家也要了解,Android开发网在以前的文章中讲过,不过很多开发者仍然不是很清楚,这些基础问题我们以后仍然会再次总结。
   关于Activity的启动模式,参考: http://blog.csdn.net/feng88724/archive/2011/05/11/6412638.aspx
3. 通过Intent传递一些二进制数据的方法有哪些?
   1). 使用Serializable接口实现序列化,这是Java常用的方法。
   2). 实现Parcelable接口,这里Android的部分类比如Bitmap类就已经实现了,同时Parcelable在Android AIDL中交换数据也很常见的。
4. 能说下Android应用的入口点吗?
  真正的Android入口点是application的main,你可以看下androidmanifest.xml的包含关系就清楚了。 可以没有Activity但是必须有Application
5. Android都有哪些XML解析器,都熟练掌握吗?
  这里XmlPull、SAX和DOM相信做过Web开发的都已经滚瓜烂熟了。
6. SQLite支持事务吗? 添加删除如何提高性能?
  SQLite作为轻量级的数据库,比MySQL还小,但支持SQL语句查询,提高性能可以考虑通过原始经过优化的SQL查询语句方式处理。
7. Android Service和Binder、AIDL你都熟练吗?
  作为Android重要的后台服务,这些每个Android开发者都应该掌握,这也算是和Java SE最大的不同了,具体的实例大家可以查看Android音乐播放器的源代码Music.git中的,这里不再赘述。
8. 你用过哪款Android手机,有哪些优点和不足,相对于iPhone或Symbian又有哪些优缺点?
   把这个作为面试题也是考察下,可以大概了解到它对Android的了解程度,多移动开发的认识。
 > Android知识点2
1. 请描述下Activity的生命周期。
  创建 oncreate -  启动onstart – 恢复 onResume – 暂停 onPause – 结束 onStop – 销毁onDestroy
2.如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
  在”暂停 onPause” 状态将数据保存。
3.如何将一个Activity设置成窗口的样式。
  设置Theme。
4.如何退出Activity?如何安全退出已调用多个Activity的Application?
5.请介绍下Android中常用的五种布局。
  线性布局LinearLayout, 相对布局 RelativeLayout;表单布局 TableLayout,绝对布局AbsLayout(已淘汰),帧布局FrameLayout
6.请介绍下Android的数据存储方式。
  Preference,文件,数据库SQlite,网络存储
7.请介绍下ContentProvider是如何实现数据共享的。
8.如何启用Service,如何停用Service。
  启动:Context.startService();Context.bindService().
  关闭: Context.stopService(), Service.stopSelf();Service.stopSelfResult()
9. 注册广播有几种方式,这些方式有何优缺点?请谈谈Android引入广播机制的用意。
10. 请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。
11.AIDL的全称是什么?如何工作?AIDL能处理哪些类型的数据?
12. 请解释下Android程序运行时权限与文件系统权限的区别。(Edited by Sodino)
13.系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由。
14.有一个一维整型数组int[]data保存的是一张宽为width,高为height的图片像素值信息。请写一个算法,将该图片所有的白色不透明(0xffffffff)像素点的透明度调整为50%。
15.你如何评价Android系统?优缺点。 (这一题重复了)
优势:
  一、开放性 三、丰富的硬件选择 五、无缝结合的Google应用支持
缺点:  一、安全和隐私
  二,开发商自定义,不够统一 四、同类机型用户减少
 > Android知识点3
1、什么是ANR 如何避免它?
  http://blog.csdn.net/Zengyangtech/archive/2010/11/21/6025671.aspx
2、什么情况会导致Force Close ?如何避免?能否捕获导致其的异常?
3、Android本身的api并未声明会抛出异常,则其在运行时有无可能抛出runtime异常,你遇到过吗?诺有的话会导致什么问题?如何解决?
  会有运行时异常, 运行时异常无需捕捉
4、简要解释一下activity、 intent 、intent filter、service、Broadcast、BroadcaseReceiver
   这个问题问的很普遍,自己多看看吧。在此不多说了!
5、IntentService有何优点?
 > Android知识点4
1. android:paddingLeft与android:layout_marginLeft的区别
  当按钮分别设置以上两个属性时,得到的效果是不一样的。
android:paddingLeft="30px",,按钮上设置的内容(例如图片)离按钮左边边界30个像素
android:layout_marginLeft="30px",整个按钮离左边设置的内容30个像素
2. Android 动画有哪几种?描述一下
  Tween动画和Frame动画。 Tween动画主要是透明度、尺寸伸缩、旋转、位移等效果。
  Frame动画可以理解成gif, 一帧一帧的显示图片。比较常用的有滚动条效果。
3. 对Intent、Activity、广播、Service等的理解。
4. 隐式、显式Intent的区别
·   显式意图
通过名字指明目标组件(这个组件名字字段component name field,
有一个数值集)。既然组件名称通常不为其他应用程序的开发者所了解,显式意图典型的被用作应用程序的内部消息-例如一个活动启动一个附属服务或姊妹活动。
   隐式意图
不命名目标组件(组件名称字段为空)。隐式意图经常用来激活其他应用程序的组件。
    这一块参考Intent说明,可以同时看一下Notepad的例子, 帮助理解,个人感觉很重要!
5.返回键与Home键区别?
  back键默认行为是finish处于前台的Activity的即Activity的状态为Destroy状态为止,再次启动该Activity是从onCreate开始的(不会调用onSaveInstanceState方法)。Home键默认是stop前台的Activity即状态为onStop为止而不是Destroy,若再次启动它,会调用onSaveInstanceState方法,保持上次Activity的状态则是从OnRestart开始的---->onStart()--->onResume()。
 > Android知识点5
1. Android中如何传递二进制数据?
2. ANR是什么?哪些情况下会发生?开发时如何寻找ANR?
3. 解释AIDL
4. SAX、DOM、PULL解析xml的原理,以及各自优缺点
4. DIP、DPI分别是什么?
5.java线程的sleep(),wait(),notify(),yield()方法的区别?
  1.sleep()使线程休眠一段时间,一段时间结束后,线程进入可执行状态,但并不是立即执行,只是在被排程器调用的时候才执行。在休眠期间,并不释放所持有的“锁”;
  2.wait()使线程休眠一段时间,若设置参数,时间到时,线程就自动进入可执行状态。若没有,则需要notify()方法去调用。注意:wait()方法和notify()方法都时针对this对象的,调用wait()方法后,会释放加在对象上的“锁”。

  3.yield()使线程放弃执行的权利,进入可执行状态,也就意味着线程在yield()方法后,有可能又执行。使用yield()方法,线程并不释放自己锁持有的“锁”。

 > Android知识点6

1 现有一按钮,绑定点击事件和Touch事件后,事件的响应流程是怎么进行的?
2 如何退出Activity?如何安全退出已调用多个Activity的Application?
3 Fragment怎么处理调用startActivityForResult之后的响应?可以有哪些处理方式实现接受响应的效果?
4 IntentService有什么优点??
5 横竖屏切换时候Activity的生命周期
6 AIDL的全称是什么 如何工作 有什么用?需要什么权限
7 关闭Activity活动之前,要保存活动的状态,可以采取什么方式来处理?
8 Activity和Task的关系 Activity的加载模式?
9 一个广播可不可以有多个Intent Filter ?一个Intent Filter可不可以有多个action?简述Intent Filter 的匹配过程
10 Handler Looper Message Queue 分别是什么 三者之间有什么关系

 > Android知识点7

 String,StringBuild,StringBuffer
1.CharSequence是一个java接口,代表一个char序列,String、StringBuilder、StringBuffer都实现了该接口,CharSequence实例通过调用toString方法可转化为String对象。 
2.String类是final的,不可派生子类,其内部封装的是char[],另外,android下的String类和jdk中的String类是有区别的,android下的String类中部分API通过native方法实现,效率相对高一些。 
3.String使用’+’进行字符串拼接时,在编译期会转化为StringBuilder.append方式 
4.String在内存中有一个常量池,两个相同的串在池中只有一份实例(String s = “abc”方式或者String#intern方式会在池中分配),使用new String方式会在heap中分配,每次创建都是一个全新的实例。 
5.StrigBuilder & StringBuffer都是可扩展的串,提供了一系列apped方法用于拼接不同类型对象 
6.StringBuffer于jdk1.0引入,线程安全(多线程场景下使用),StringBuilder于jdk1.5引入,线程不安全,因而效率更高。 
7.StringBuilder & StringBuffer初始容量都为16,开发者应该指定其容量,以避免多次扩容所带来的性能问题。
 > Android知识点8
>> Java 基础之继承与接口的区别
抽象类:
  抽象类体现了数据抽象的思想,是实现多态的一种机制。它定义了一组抽象的方法,至于这组抽象方法的具体表现形式由派生类来实现。同时抽象类提供了继承的概念,它的出发点就是为了继承,否则它没有存在的任何意义。所以说定义的抽象类一定是用来继承的,同时在一个以抽象类为节点的继承关系等级链中,叶子节点一定是具体的实现类。 在语法方面:

1.由abstract关键词修饰的类称之为抽象类。 

2.抽象类中没有实现的方法称之为抽象方法,也需要加关键字abstract。

3.抽象类中也可以没有抽象方法,比如HttpServlet方法。 

4.抽象类中可以有已经实现的方法,可以定义成员变量。


接口: 接口是用来建立类与类之间的协议,它所提供的只是一种形式,而没有具体的实现。同时实现该接口的实现类必须要实现该接口的所有方法,通过使用implements关键字。 接口是抽象类的延伸,java为了保证数据安全是不能多重继承的,也就是说继承只能存在一个父类,但是接口不同,一个类可以同时实现多个接口,不管这些接口之间有没有关系,所以接口弥补了抽象类不能多重继承的缺陷,

 语法方面: 

1.由interface关键词修饰的称之为接口; 

2.接口中可以定义成员变量,但是这些成员变量默认都是public static final的常量。

3.接口中没有已经实现的方法,全部是抽象方法。 

4.一个类实现某一接口,必须实现接口中定义的所有方法。 

5.一个类可以实现多个接口。
 

抽象/接口区别: 

一.语法层次上:如上所述。 

二.设计层次上: 

1、 抽象层次不同。抽象类是对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。

 2、 跨域不同。抽象类所跨域的是具有相似特点的类,而接口却可以跨域不同的类。我们知道抽象类是从子类中发现公共部分,然后泛化成抽象类,子类继承该父类即可,但是接口不同。实现它的子类可以不存在任何关系,共同之处。例如猫、狗可以抽象成一个动物类抽象类,具备叫的方法。鸟、飞机可以实现飞Fly接口,具备飞的行为,这里我们总不能将鸟、飞机共用一个父类吧!所以说抽象类所体现的是一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在”is-a” 关系,即父类和派生类在概念本质上应该是相同的。对于接口则不然,并不要求接口的实现者和接口定义在概念本质上是一致的, 仅仅是实现了接口定义的契约而已,相当于是”like-a”的关系。 

3、 设计层次不同。对于抽象类而言,它是自下而上来设计的,我们要先知道子类才能抽象出父类,而接口则不同,它根本就不需要知道子类的存在,只需要定义一个规则即可,至于什么子类、什么时候怎么实现它一概不知。比如我们只有一个猫类在这里,如果你这是就抽象成一个动物类,是不是设计有点儿过度?我们起码要有两个动物类,猫、狗在这里,我们在抽象他们的共同点形成动物抽象类吧!所以说抽象类往往都是通过重构而来的!但是接口就不同,比如说飞,我们根本就不知道会有什么东西来实现这个飞接口,怎么实现也不得而知,我们要做的就是事前定义好飞的行为接口。所以说抽象类是自底向上抽象而来的,接口是自顶向下设计出来的。

附加,空接口的作用: 通常是作为一个标记,你比如这个Serializable、Cloneable。

>> Android开发中何时使用多进程
  要想知道如何使用多进程,先要知道Android里的多进程概念。一般情况下,一个应用程序就是一个进程,这个进程名称就是应用程序包名。我们知道进程是系统分配资源和调度的基本单位,所以每个进程都有自己独立的资源和内存空间,别的进程是不能任意访问其他进程的内存和资源的。那如何让自己的应用拥有多个进程?很简单,我们的四大组件在AndroidManifest文件中注册的时候,有个属性是 "android:process :"这里可以指定组件的所处的进程。默认就是应用的主进程。指定为别的进程之后,系统在启动这个组件的时候,就先创建(如果还没创建的话)这个进程,然后再创建该组件。你可以重载Application类的onCreate方法,打印出它的进程名称,就可以清楚的看见了。再设置android:process属性时候,有个地方需要注意:如果是android:process=”:deamon”,以:开头的名字,则表示这是一个应用程序的私有进程,否则它是一个全局进程。私有进程的进程名称是会在冒号前自动加上包名,而全局进程则不会。一般我们都是有私有进程,很少使用全局进程。他们的具体区别不知道有没有谁能补充一下。
  使用多进程显而易见的好处就是分担主进程的内存压力。我们的应用越做越大,内存越来越多,将一些独立的组件放到不同的进程,它就不占用主进程的内存空间了。当然还有其他好处,有心人会发现Android后台进程里有很多应用是多个进程的,因为它们要常驻后台,特别是即时通讯或者社交应用,不过现在多进程已经被用烂了。典型用法是在启动一个不可见的轻量级私有进程,在后台收发消息,或者做一些耗时的事情,或者开机启动这个进程,然后做监听等。还有就是防止主进程被杀守护进程,守护进程和主进程之间相互监视,有一方被杀就重新启动它。应该还有还有其他好处,这里就不多说了。
  坏处的话,多占用了系统的空间,大家都这么用的话系统内存很容易占满而导致卡顿。消耗用户的电量。应用程序架构会变复杂,应为要处理多进程之间的通信。这里又是另外一个问题了。

>> 设备横竖屏切换的时候,接下来会发生什么
我们一般看到的答案:
   不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
   设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
  设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

  这个是不完整的。下面的文字引自Android Developer:
  Caution: Beginning with Android 3.2 (API level 13), the "screen size" also changes when the device switches between portrait and landscape orientation. Thus, if you want to prevent runtime restarts due to orientation change when developing for API level 13 or higher (as declared by the minSdkVersion and targetSdkVersion attributes), you must include the “screenSize” value in addition to the “orientation” value. That is, you must decalare android:configChanges=”orientation|screenSize”. However, if your application targets API level 12 or lower, then your activity always handles this configuration change itself (this configuration change does not restart your activity, even when running on an Android 3.2 or higher device).
 也就是说:当API >12时,需要加入screenSize属性,否则屏幕切换时即使你设置了orientation系统也会重建Activity. 横竖屏切换对生命周期的影响Activity在清单文件中的属性

>> 要做一个尽可量流畅的ListView,你可以做到的优化手段是什么?越详细越多手段越好
  复用convertView
  使用ViewHolder
  item中有图片时,异步加载
  快速滑动时,不加载图片
  item中有图片时,应对图片进行适当压缩
  分批和分页加载
  facebook新闻页ListView优化

>> java虚拟机的运行原理

>> 继承viewGroup后必须实现哪些方法,这些方法有谁调用??
  继承ViewGroup后,IDE会提示提供构造方法和实现 onLayout() 方法。
  在ViewGroup中只有一个抽象的方法 onLayout() ,所以必须实现它;如果执行 requestLayout() 请求重新调整位置会调用到 onLayout() 。
  ViewGroup深入理解

>> android 关于安全的问题,你所知道的所有的安全问题
1.错误导出组件
2.参数校验不严
3.WebView引入各种安全问题
4.不混淆、不防二次打包
5.明文存储关键信息
6.错误使用HTTPS
7.山寨加密方法
  > Security Tips,对称加密和非对称加密:
对称加密,就是加密和解密数据都是使用同一个key,这方面的算法有DES。 非对称加密,加密和解密是使用不同的key。发送数据之前要先和服务端约定生成公钥和私钥,使用公钥加密的数据可以用私钥解密,反之。这方面的算法有RSA。ssh 和 ssl都是典型的非对称加密。

>> Activity的四种launchMode
Activity一共有以下四种launchMode:standard;singleTop;singleTask;singleInstance
我们可以在AndroidManifest.xml配置的android:launchMode属性为以上四种之一即可。 下面我们结合实例一一介绍这四种lanchMode: 
  1.standard standard模式是默认的启动模式,不用为配置android:launchMode属性即可,当然也可以指定值为standard。standard启动模式,不管有没有已存在的实例,都生成新的实例。
  2.singleTop 我们在上面的基础上为指定属性android:launchMode=”singleTop”,系统就会按照singleTop启动模式处理跳转行为。跳转时系统会先在栈结构中寻找是否有一个Activity实例正位于栈顶,如果有则不再生成新的,而是直接使用。如果系统发现存在有Activity实例,但不是位于栈顶,重新生成一个实例。 这就是singleTop启动模式,如果发现有对应的Activity实例正位于栈顶,则重复利用,不再生成新的实例。
  3.singleTask 如果发现有对应的Activity实例,则使此Activity实例之上的其他Activity实例统统出栈,使此Activity实例成为栈顶对象,显示到幕前。
  4.singleInstance 这种启动模式比较特殊,因为它会启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有其他Activity实例进入。

>> Android启动Service的两种方式是什么? 它们的适用情况是什么
startService:生命周期与调用者不同。启动后若调用者未调用stopService而直接退出,Service仍会运行
bindService:生命周期与调用者绑定,调用者一旦退出,Service就会调用unBind->onDestroy

>> 谈谈你对Android中Context的理解

>> Java中反射的作用是什么?什么时候会用到?
  JAVA反射机制是在#运行时#,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 Java反射机制主要提供了以下功能: a)在运行时判断任意一个对象所属的类; b)在运行时构造任意一个类的对象; c)在运行时判断任意一个类所具有的成员变量和方法; d)在运行时调用任意一个对象的方法;生成动态代理。

>> 注册广播有几种方式,这些方式有何优缺点?请谈谈Android引入广播机制的用意
  1.在清单文件中注册, 常见的有监听设备启动,常驻注册不会随程序生命周期改变 2.在代码中注册,随着程序的结束,也就停止接受广播了
    Android引入广播机制的用意:
  a:从MVC的角度考虑(应用程序内) 其实回答这个问题的时候还可以这样问,android为什么要有那4大组件,现在的移动开发模型基本上也是照搬的web那一套MVC架构,只不过是改了点嫁妆而已。android的四大组件本质上就是为了实现移动或者说嵌入式设备上的MVC架构,它们之间有时候是一种相互依存的关系,有时候又是一种补充关系,引入广播机制可以方便几大组件的信息和数据交互。
  b:程序间互通消息(例如在自己的应用程序内监听系统来电)
  c:效率上(参考UDP的广播协议在局域网的方便性)
  d:设计模式上(反转控制的一种应用,类似监听者模式)

>> Java中有内存泄露吗?举一些例子?JNI中呢
1.查询数据库没有关闭游标 
2. 构造Adapter时,没有使用缓存的 convertView 
3. Bitmap对象不再使用时调用recycle()释放内存 
4. 无用时没有释放对象的引用 
5. 在Activity中使用非静态的内部类,并开启一个长时间运行的线程,因为内部类持有Activity的引用,会导致Activity本来可以被gc时却长期得不到回收 
6.使用Handler处理消息前,Activity通过例如finish()退出,导致内存泄漏 
7.动态注册广播在Activity销毁前没有unregisterReceiver
 

Android内存泄漏研究????

>> 请介绍下Android中常用的五种布局
  我常用的: linearlayout , RelativeLayout , FrameLayout ,TableLayout 很少用到, GridLayout 用过一次。

>> Service的onCreate回调在UI线程中吗
Service生命周期的各个回调和其他的应用组件一样,是跑在主线程中,会影响到你的UI操作或者阻塞主线程中的其他事情

>> 请介绍下ContentProvider是如何实现数据共享
  当一个应用程序需要把自己的数据暴露给其他程序使用时,该就用程序就可通过提供ContentProvider来实现;其他应用程序就可通过 ContentResolver 来操作ContentProvider暴露的数据。 一旦某个应用程序通过ContentProvider暴露了自己的数据操作接口,那么不管该应用程序是否启动,其他应用程序都可以通过该接口来操作该应用程序的内部数据,包括增加数据、删除数据、修改数据、查询数据等。 ContentProvider 以某种Uri的形式对外提供数据 ,允许其他应用访问或修改数据;其他应用程序使用ContentResolver根据Uri去访问操作指定数据。 步骤: 1、定义自己的ContentProvider类,该类需要继承Android提供的ContentProvider基类。 2、在AndroidManifest.xml文件中注册个ContentProvider,注册ContenProvider时需要为它绑定一个URL。 例: android:authorities=”com.myit.providers.MyProvider” /> 说明:authorities就相当于为该ContentProvider指定URL。 注册后,其他应用程序就可以通过该Uri来访问MyProvider所暴露的数据了。
  接下来,使用ContentResolver操作数据,Context提供了如下方法来获取ContentResolver对象。 一般来说,ContentProvider是单例模式,当多个应用程序通过ContentResolver来操作 ContentProvider提供的数据时,ContentResolver调用的数据操作将会委托给同一个ContentProvider处理。 使用ContentResolver操作数据只需两步: 1、调用Activity的ContentResolver获取ContentResolver对象。 2、根据需要调用ContentResolver的insert()、delete()、update()和query()方法操作数据即可.

>> 请介绍下AsyncTask的内部实现,适用的场景是
  Android AsyncTask完全解析,带你从源码的角度彻底理解.
  AsyncTask内部也是Handler机制来完成的,只不过Android提供了执行框架来提供线程池来执行相应地任务,因为线程池的大小问题,所以AsyncTask只应该用来执行耗时时间较短的任务,比如HTTP请求,大规模的下载和数据库的更改不适用于AsyncTask,因为会导致线程池堵塞,没有线程来执行其他的任务,导致的情形是会发生AsyncTask根本执行不了的问题。

>> 谈谈你对binder机制的理解
Android进程间通信(IPC)机制Binder简要介绍和学习计划  bind service
binder是一种IPC机制,进程间通讯的一种工具.
Java层可以利用aidl工具来实现相应的接口.

>> Android中进程间通信有哪些实现方式?原理是什么
Intent,Binder(AIDL),Messenger,BroadcastReceiver

>> 介绍下实现一个自定义view的基本流程
1.明确需求,确定你想实现的效果 
2.确定是使用组合控件的形式还是全新自定义的形式,组合控件即使用多个系统控件来合成一个新控件,你比如titilebar,这种形式相对简单, 参考
3.如果是完全自定义一个view的话,你首先需要考虑继承哪个类,是View呢,还是ImageView等子类。 
4.根据需要去复写View#onDraw、View#onMeasure、View#onLayout方法 
5.根据需要去复写dispatchTouchEvent、onTouchEvent方法 
6.根据需要为你的自定义view提供自定义属性,即编写attr.xml,然后在代码中通过TypedArray等类获取到自定义属性值 
7.需要处理滑动冲突、像素转换等问题

>> 编写attr.xml文件
在layout布局文件中引用,同时引用命名空间;
在自定义控件中进行读取(构造方法拿到attr.xml文件值);
覆写onMeasure()方法;
覆写onLayout()方法;

>>Android中touch事件的传递机制是怎样的?
事件传递:
(1) 所有Touch事件都被封装成了MotionEvent对象,包括Touch的位置、时间、历史记录以及第几个手指(多指触摸)等。
(2) 事件类型分为ACTION_DOWN, ACTION_UP, ACTION_MOVE, ACTION_POINTER_DOWN, ACTION_POINTER_UP, ACTION_CANCEL,每个事件都是以ACTION_DOWN开始ACTION_UP结束。
(3) 对事件的处理包括三类,分别为传递——dispatchTouchEvent()函数、拦截——onInterceptTouchEvent()函数、消费——onTouchEvent()函数和OnTouchListener
传递流程:
(1) 事件从Activity.dispatchTouchEvent()开始传递,只要没有被停止或拦截,从最上层的View(ViewGroup)开始一直往下(子View)传递。子View可以通过onTouchEvent()对事件进行处理。
(2) 事件由父View(ViewGroup)传递给子View,ViewGroup可以通过onInterceptTouchEvent()对事件做拦截,停止其往下传递。
(3) 如果事件从上往下传递过程中一直没有被停止,且最底层子View没有消费事件,事件会反向往上传递,这时父View(ViewGroup)可以进行消费,如果还是没有被消费的话,最后会到Activity的onTouchEvent()函数。
(4) 如果View没有对ACTION_DOWN进行消费,之后的其他事件不会传递过来。
(5) OnTouchListener优先于onTouchEvent()对事件进行消费。 上面的消费即表示相应函数返回值为true。PRE_andevcon_mastering-the-android-touch-system Touch 事件的分发和消费机制

>> ANR是什么?怎样避免和解决ANR
ANR:Application Not Responding,即应用无响应

-- ANR一般有三种类型:
1:KeyDispatchTimeout(5 seconds) –主要类型,按键或触摸事件在特定时间内无响应
2:BroadcastTimeout(10 seconds),BroadcastReceiver在特定时间内无法处理完成
3:ServiceTimeout(20 seconds) –小概率类型,Service在特定的时间内无法处理完成

  超时的原因一般有两种:
(1)当前的事件没有机会得到处理(UI线程正在处理前一个事件没有及时完成或者looper被某种原因阻塞住)
(2)当前的事件正在处理,但没有及时完成

    UI线程尽量只做跟UI相关的工作,耗时的工作(数据库操作,I/O,连接网络或者其他可能阻碍UI线程的操作)放入单独的线程处理,尽量用Handler来处理UI thread和thread之间的交互。

>> UI线程主要包括如下:
Activity:onCreate(), onResume(), onDestroy(), onKeyDown(), onClick()
AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel()
Mainthread handler: handleMessage(), post(runnable r)


>> 查找ANR的方式: 1. 导出/data/data/anr/traces.txt,找出函数和调用过程,分析代码 2. 通过性能LOG人肉查找

>> Android多线程的实现方式有哪些?它们的优缺点和适用场景是什么
Thread & AsyncTask Thread 可以与Loop 和 Handler 共用建立消息处理队列 AsyncTask 可以作为线程池并行处理多任务

>> Android下解决滑动冲突的常见思路是什么
相关的滑动组件 重写 onInterceptTouchEvent ,然后判断根据xy值,来决定是否要拦截当前操作

>> 如何把一个应用设置为系统应用
  成为系统应用,首先要在 对应设备的 Android 源码SDK下编译,编译好之后:
此 Android 设备是 Debug 版本,并且已经 root,直接将此 apk 用 adb 工具 push 到 system/app 或 system/priv-app 下即可。
如果非 root 设备,需要编译后重新烧写设备镜像即可。
有些权限(如 WRITE_SECURE_SETTINGS ),是不开放给第三方应用的,只能在对应设备源码中编译然后作为系统 app 使用。


>> Android注册广播有几种方式? 它们的适用情况是什么?
  Android中有两种广播的注册方式: 1、静态注册:AndroidManifest.xml配置文件中; 2、动态注册:Java代码; 静态注册适用于全局广播;动态注册适用于局部广播;
  补充一点:有些广播只能通过动态方式注册,比如时间变化事件、屏幕亮灭事件、电量变更事件,因为这些事件触发频率通常很高,如果允许后台监听,会导致进程频繁创建和销毁,从而影响系统整体性能。

>> 你看过Android Framework的代码吗?介绍一下某一个或几个模块?
我觉得这个问题 最好从app相关系统模块讲一下,例如inputmanager(输入事件),activitymanager,windowmanager等. 或者从类似asyctask,hander,等基础工具来讲.

>> 如何调试Android应用程序
log;断点调试
-------------------------
1、 Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念  
  DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行, 都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。  
2、sim卡的EF 文件有何作用  
  sim卡的文件系统有自己规范,主要是为了和手机通讯,sim本  身可以有自己的操作系统,EF就是作存储并和手机通讯用的  
3、嵌入式操作系统内存管理有哪几种,各有何特性 ?   
   页式,段式,段页,用到了MMU,虚拟空间等技术   
4、什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?  
    嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度 予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作 出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。主要用于工 业控制、军事设备、航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。又可 分为软实时和硬实时两种,而android是基于linux内核的,因此属于软实时。  
5、一条最长的短信息约占多少byte?  
 中文70(包括标点),英文160个字节   
6、 android中的动画有哪几类,它们的特点和区别是什么?  
   一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方 式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画, 
传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。  
  还有属性动画等  
7、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。  
8、说说mvc模式的原理,它在android中的运用  
  MVC(Model_view_contraller)” 模型_视图_控制器”。 MVC应用程序总是由这 
三个部分组成。Event(事件)导致Controller改变Model或View,或者同时改 变两者。只要 Controller改变了Models的数据或者属性,所有依赖的View都 会自动更新。类似的,只要Controller改变了View,View会  从潜在的Model中获取数据来刷新自己。  
 
>> View重绘和内存泄露的好像是面试经常问的问题  
1. View的刷新:  
    在需要刷新的地方,使用handle.sendmessage发送信息,然后在handle的 getmessage里面执行invaliate或者postinvaliate.   
2. GC内存泄露  
 出现情况:  
 >数据库的cursor没有关闭  
 >构造adapter时,没有使用缓存contentview  ,衍生listview的优化问题-----减少创建view的对象,充分使用 contentview,可以使用一静态类来优化处理getview的过程/   
 >Bitmap对象不使用时采用recycle()释放内存  
 >activity中的对象的生命周期大于activity  
 调试方法: DDMS==> HEAPSZIE==>dataobject==>[Total Size]  
 还有其他问题,大家欢迎提出阿,可以是整体架构的,还有这个Hal层.  

 一 Activity的生命周期  
 和其他手机 平台 的应用程序一样,Android的应用程序的生命周期是被统 一掌控的,也就是说我们写的应用程序命运掌握在别人(系统)的手里,我们不 能改变它,只能学习并适应它。  
  简单地说一下为什么是这样:我们手机在运行  一个应用程序的时候,有可能打进来电话发进来短信,或者没有电了,这时候程序都会被中断,优先去服务电话的基本功能,另外系统也不允许你占用太多资源, 至少要保证电话功能吧,所以资源不足的时候也就有可能被干掉。言归正传, 
  Activity的基本生命周期如下代码所示:   
 public class MyActivity extends Activity  
{     
protected void onCreate(Bundle savedInstanceState);       
protected void onStart();    
protected void onReStart();   
protected void onResume();     
protected void onPause();       
protected void onStop();     
protected void onDestroy();    
}     
你自己写的Activity会按需要重 载这些方法,onCreate是免不了的,在一个Activity正常启动的过程中, 他们被调用的顺序是 onCreate -> onStart ->onResume, 在Activity被干掉的 时候顺序是onPause -> onStop -> onDestroy ,这样就是一个完整的生命周期, 但是有人问了  ,程序正运行着呢来电话了,这个程序咋办?中止了呗,如果中止的时候新出的 一个Activity是全屏的那么:onPause->onStop ,恢复的时候 onStart->onResume ,如果打断这个应用程序的是一个Theme为Translucent 或者Dialog 的Activity那么只是onPause ,恢复的时候onResume 。  
   
详细介绍一下这几个方法中系统在做什么以及我们应该做什么:  
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()里写上持久层操作的代码,将用户编辑的内容都保存到存储介质上(一般 都是数据库)。实际工作中因为生命周期的变化而带来的问题也很多,比如你的应用程序起了新的线程在跑,这时候中断了,你还要去维护那个线程,是暂停还是杀 掉还是数据回滚,是吧?因为Activity 可能被杀掉,线程中使用的变量和一些界面元素就千万要注意了,一般我都 是采用Android的消息机制 [Handler,Message]来处理多线程和界面交互的问 题。这个我后面会讲一些,最近因为这些东西头已经很大了,等我理清思绪再跟 大家分享。  
    
>> 二  让Activity变成一个窗口:Activity属性设定  
 讲点轻松的吧,可能有人希望做出来的应用程序是一个漂浮在手机主界面的东 西,那么很 简单你只需要设置一下Activity的主题就可以了在 AndroidManifest.xml 中定义 Activity的地方一句话:   android:theme="@android :style/Theme.Dialog"   这就使你的应用程序变成对话框的形式弹出来了,或者 Xml代码  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 ,('_'换成'.' <--注意:这个是文章内容不是 笑脸)就可以用在描述文件中了,找找类定义和描述文件中的对应关系就都明白了。  
    
三  你后台的Activity被系统回收怎么办:onSaveInstanceState  当你的程序中某一个Activity A 在运行时中,主动或被动地运行另一个新的 Activity B    这个时候A会执行   
 public void onSaveInstanceState(Bundle outState) {       
super.onSaveInstanceState(outState);      
outState.putLong("id", 1234567890);    
}   
public void  onSaveInstanceState(Bundle outState) { 
   
B 完成以后又会来找A, 这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回 收的A就要重新调用onCreate()方法,不同于直接启动的是这 回 onCreate()里是带上参数 savedInstanceState,没被收回的就还是 onResume就好了。  
 savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate 就不会有它,所以用的时候要判断一下是否为空。   
 if(savedInstanceState !=null){    
     long id =savedInstanceState.getLong("id");   
}   
    
就像官方的Notepad教程里的情况,你正在编辑某一个note,突然被中断,那么就把这个note的id记住,再起来的时候就可以根据这个id去把那个note取出来,程序就完整一些。这也是看你的应用需不需要保存什么,比如你的界面就是读取一个列表,那就不需要特殊记住什么,哦,  没准你需要记住滚动条的位置...  
 
四 调用与被调用:我们的通信使者Intent  
  要说Intent了,Intent就是这个这个意图,应用程序间Intent进行交流,打个电话啦,来个电话啦都会发Intent, 这个是Android架构的松耦合的精髓部分,大大提高了组件的复用性,比如你要在你的应用程序中点击按钮,给某人打电话,很简单啊,看下代码先:   
Intent intent = new Intent();    
intent.setAction(Intent.ACTION_CALL);    
intent.setData(Uri.parse("tel:"+ number));    
startActivity(intent);   扔出这样一个意图,系统看到了你的意图就唤醒了电话拨号程序,打出来电话。 什么读联系人,发短信啊,邮件啊,统统只需要扔出intent就好了,这个部分 设计地确实很好啊。  
  这里面配置用到了action, data, category这些东西,那么聪明的你一定想到 intent里也会有这些东西,然后一匹配不就找到接收者了吗?  action其实就是一个意图的字符串名称。 上 面这段intent-filter的配置文件说明了这个Activity可以接受不同的  Action,当然相应的程序逻辑也不一样咯,提一下那个 mimeType,他是在 ContentProvider里定义的,你要是自己实现一个ContentProvider就知道了, 必须指定 mimeType才能让数据被别人使用。  
    
不知道原理说明白没,总结一句,就是你调用别的界面不是直接new那个界面, 而是通过扔出一个intent,让系统帮你去调用那个界面,这样就多么松藕合啊, 而且符合了生命周期被系统管理的原则。  
 想知道category都有啥,Android为你预先定制好的action都有啥等等,请 亲自访问官方链接Intent  
 ps:想知道怎么调用系统应用程序的同学,可以仔细看一下你的logcat,每次 运行一个程序的时候是不是有一些信息比如:  
   Starting activity: Intent  {action=android.intent.action.MAINcategories={android.intent.category .LAUNCHER}flags=0x10200000comp={com.android.camera/com.android.camera .GalleryPicker} }  再对照一下Intent的一些set方法,就知道怎么调用咯,希望你喜欢:)  
  -------------------------------------  
一,listview你是怎么优化的。  
二,view的刷新,之前说过  
三,IPC及原理  
四,Android多线程  
五,Android为什么要设计4大组件,他们之间的联系,不设计行不行(主要是 为了实现MVC模式,然而java中最难的模式也是这个,很少有产品能将这个模 式做得很好【Technicolor的面试官问的这个】)  
六,service的周期,activity的周期,谈下你对Android内部应用的了解,比 如他做电话,以及联系人等等应用。框架层有很多东西还是多看看,熟悉Android 怎么做的,不管你做应用程开发还是应用框架层开发很有好处的。  
   
在就是你项目经验,突出你遇到什么难点,然后是怎么解决的!尽量将每个技术 点凸显出来,当然面试官有时候会为了体现你是否真正做过,他会问你,你在这 个应用中做那个模块,用了多少个类之类的问题。  
   
>>> 偶尔有的面试官会问你,你用过Android自带的单元测试了没,怎么用的?  
当然我面试过很多家单位,有的是做平板,手机,数字电视,有的是做出个erp 之类的客户端等等,出于前面的三个,基本上都是将Android的全部改掉,如果 真正要做Android的话,大家要学的还很多。  
    
总 之,一句话,什么样的面试官都有,去面试的时候要做好一切心理准备,不 管是技术还是基础都得扎实。一个人的交谈能力也很重要,总之不是非常标准的 普通话, 最起码你说的得让别人听得懂,而且得把面试官讲得非常彻底,这样 你获得offer的机会更大,谈工资也有优势~~当然曾经一家公司的面试官跟我说 过,技术 是不惜钱的,只要你有能力,多少钱他都请。  
----------------------------
 1.View如何刷新?  
 2.DDMS与TraceView的区别?  
 3.activity被回收了怎么办?  
 4.在Java中如何引入C语言?  
参考答案 :  
 1.View 可以调用invalidate()和postInvalidate()这两个方法刷新  
 2.DDMS是一个程序执行查看器,在里面你可以看见线程和堆栈等信息,TraceView是程序性能分析器  
 3.activity回收了,那就只有另起了  
 4.java调用C语言程序,可以用JNI接口来实现  

 上面答案仅作参考,毕竟我个人能力也有限嘛,难免会回答错误,呵呵.....  
解答:  
 1.View受系统刷新(系统内部有个循环,监控事件、做业务处理、绘UI), 可以用postInvalidate()促使系统刷新。  
 2.(还真不知道)  
 3.请参照Activity生命周期,如果被系统destroy了,也就是说的回收,只 有从新start了  
 4.通过JNI调用。建议阅读《The Java Native InterfaceProgrammer's Guide  and Specification》,英文版的,从sun网站下吧。
---------------------------------------------------------------------------
2.HashMap,Hashset,ArrayList以及LinkedList集合的区别,以及各自的用法
3.Activity的启动模式有哪几种
4.介绍Handler机制
5.线程考核,解析sleep,wait,join,yield方法,以及notify 和notifyAll是如何控制线程同步的
6.android 存储方式以及各至用法
7.ListView 中BaseAdapter的使用和优化;在ListView中的item放置一个按钮,如何使用按钮对不能的item响应不同的事件
8.编程题:
题意:生成一个1-100的随机数组,但数组中的数字不能重复,即位置是随机的,但数组元素不能重复

监听数据库变化的一个接口ContentObserver这个接口.

1.以前做过项目的,画个简单的架构图,介绍之前的项目;
2.项目中遇到的问题,以及怎么解决的.麦洛就举了之前写的上拉下拉这个控件的例子
3.Android Activity生命周期
4.Adapter中View重用的问题

1.介绍Http协议
2.Http协议实现多线程下载并支持断点续传,以及服务端是怎么支持的?
3.面向对象的理解,面向对象的原则–开发封闭原则的理解
4.android wap与net的两种连接方式
5.项目中的一些问题
------------------------------------
3.谈谈android数据存储方式。
   答:Android提供了5种方式存储数据:
(1)使用SharedPreferences存储数据;它是Android提供的用来存储一些简单配置信息的一种机制,采用了XML格式将数据存储到设备中。只能在同一个包内使用,不能在不同的包之间使用。
(2)文件存储数据;文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与Java中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。
(3)SQLite数据库存储数据;SQLite是Android所带的一个标准的数据库,它支持SQL语句,它是一个轻量级的嵌入式数据库。
(4)使用ContentProvider存储数据;主要用于应用程序之间进行数据交换,从而能够让其他的应用保存或读取此Content Provider的各种数据类型。
(5)网络存储数据;通过网络上提供给我们的存储空间来上传(存储)和下载(获取)我们存储在网络空间中的数据信息。
4.Android中Activity, Intent, Content Provider, Service各有什么区别。
    答:Activity: 活动,是最基本的android应用程序组件。一个活动就是一个单独的屏幕,每一个活动都被实现为一个独立的类,并且从活动基类继承而来。
Intent: 意图,描述应用想干什么。最重要的部分是动作和动作对应的数据。
Content Provider:内容提供器,android应用程序能够将它们的数据保存到文件、SQLite数据库中,甚至是任何有效的设备中。当你想将你的应用数据和其他应用共享时,内容提供器就可以发挥作用了。
Service:服务,具有一段较长生命周期且没有用户界面的程序。
5.View, surfaceView, GLSurfaceView有什么区别。
 答:view是最基础的,必须在UI主线程内更新画面,速度较慢。
SurfaceView 是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快
GLSurfaceView 是SurfaceView的子类,opengl 专用的。
  6.Adapter有什么作用?常见的Adapter有哪些?
答:Adapter是连接后端数据和前端显示的适配器接口(相当于mvc架构中的controller)。常见的Adapter有ArrayAdapter, BaseAdapter, CursorAdapter, HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, SpinnerAdapter, WrapperListAdapter等。
  7.Manifest.xml文件中主要包括哪些信息?
答:manifest:根节点,描述了package中所有的内容。
uses-permission:请求你的package正常运作所需赋予的安全许可。
permission: 声明了安全许可来限制哪些程序能使用你package中的组件和功能。
instrumentation:声明了用来测试此package或其他package指令组件的代码。
application:包含package中application级别组件声明的根节点。
activity:Activity是用来与用户交互的主要工具。
receiver:IntentReceiver能使的application获得数据的改变或者发生的操作,即使它当前不在运行。
service:Service是能在后台运行任意时间的组件。
provider:ContentProvider是用来管理持久化数据并发布给其他应用程序使用的组件。
  8.什么是ANR 如何避免它? 
在android上,如果应用对输入事件(如按键、触摸屏事件)的响应超过5秒或者广播接收器(BroadCastReceiver的onReceive)超过10秒钟仍未执行完毕,系统会像用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框,这就是ANR。用户可以选择让程序继续执行,但是,用户在使用应用时,并不希望看到这个对话框。因此,在程序里对响应性能的实际很重要,这样,系统不会显示ANR给用户。
如何避免:
   Android应用程序通常是运行在一个单独的线程(如 main)里。这意味着应用程序中主线程所做的事情在主线程中占用时间过长的情况下,就会出现ANR对话框。因为你的应用程序没有给自己机会处理输入事件或者Intent广播。因此运行在主线程中的方法都尽可能的少做些事情,特别是,Activity应该在其关键生命周期方法(onCreate()和onResume())里尽可能少的去做创建操作。潜在的耗时操作,例如网络和数据库操作,或者耗时的计算入改变位图尺寸,应该在子线程里(或者以数据库操作为例,通过异步请求的方式)来完成成。主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。然而,不是说你的主线程阻塞在那里等待子线程的完成—也不是调用Thread.wait()或者Thread.sleep()。替代的方法是,主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。以这种方式设计的应用程序,将能保证主线程保持对输入的响应性并能避免由于5s输入事件超时所导致的ANR对话框。这种做法应该在其它显示UI线程效仿,应为其均受5s超时的影响。
IntentReceiver执行时间的特殊限制意味着它应该做:在后台里做小的、琐碎的工作如保存设定或者注册一个Notification。和在主线程里调用的其它方法一样,应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。但不再是在子线程里做这些任务(因为BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个Service。顺便提及一句,你也应该避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广播时需要向用户展示什么,你应该使用Notification Manager来实现。一般来说,在应用程序里,100到200ms是用户能感知阻滞的时间阈值。因此,这里有一些额外的技巧来避免ANR,并有助于让你的应用程序看起来有响应性。如果你的应用程序为响应用户输入正在后台工作的话,可以显示工作的进度(ProgressBar和ProgressDialog对这种情况来说很有用)。特别是游戏,在子线程里做移动的计算。如果你的应用程序有一个耗时的初始化过程的话,考虑可以显示一个Splash Screen或者快速显示主画面并异步来填充这些信息。在这两种情况下,你都应该
显示正在进行的进度,以免用户认为应用程序被冻结了。
  9.Android本身的api并未声明会抛出异常,则其在运行时有无可能抛出runtime异常,你遇到过吗?诺有的话会导致什么问题?如何解决?
    会出现运行时异常,比如nullpointerException。我遇到过,比如textview.setText()时,textview没有初始化。会导致程序无法正常运行出现forceclose。打开控制台查看logcat信息找出异常信息并修改程序。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值