Created
December 5, 2013 07:25
-
-
Save errord/7801466 to your computer and use it in GitHub Desktop.
android面试
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
一. Android问题 | |
为适应多机型适配作出的努力。 | |
使用dip代替px。 | |
通过创建values-hdpi, values-mdpi, values-xhdpi分别为不同的屏幕大小的机型定制不同的布局。 | |
设置字体大小的时候通过TextAppearnce="@android:style/TextAppearance.[Large, Small, Medium]"来设置大小。 | |
设想我们要做一个app,这个app中间有一个登陆的逻辑。在用户完成登陆后需要改变其他activity的一些界面,这怎么做比较好? | |
如果他的描述中有"BroadcastReceive"就是正确答案. | |
有没有写过custom view. | |
有 | |
view的布局过程是怎么样的。 | |
view的布局过程是先进行onMeasure确定大小,然后再通过onLayout确定位置. | |
onMeasure http://developer.android.com/reference/android/view/View.html#onMeasure(int, int) | |
onLayout https://developer.android.com/reference/android/view/ViewGroup.html#onLayout(boolean, int, int, int, int) | |
出问题了怎么调式应用。 | |
打断点 | |
看log | |
mat查看内存情况 (加分项) | |
HierarchyViewer (加分项) | |
ddms (加分项) | |
有了解过android测试框架吗? | |
junit | |
Robotium (加分项) | |
fest-android (加分项) | |
用过哪些android编译工具链? | |
ant | |
maven (严重加分项) | |
gradle (加分项) | |
优化ui render的方法。 | |
不要把io阻塞的操作放在主线程中。 | |
少用LinearLayout多用RelativeLayout。 | |
多写CustomView。 | |
通过HierarchyViewer查看每个view加载速度。 | |
android每个应用最大分配的内存多少? | |
4.0之前32M | |
4.0及之后48M | |
Fragment是什么?什么场景下使用?生命周期 | |
Android是在Android 3.0 (API level 11)开始引入Fragment的。可以把Fragment想成Activity中的模块,这个模块有自己的布局,有自己的生命周期,单独处理自己的输入,在Activity运行的时候可以加载或者移除Fragment模块。可以把Fragment设计成可以在多个Activity中复用的模块。当开发的应用程序同时适用于平板电脑和手机时,可以利用Fragment实现灵活的布局,改善用户体验 | |
如果Activity是暂停状态,其中所有的Fragment都是暂停状态;如果Activity是stopped状态,这个Activity中所有的Fragment都不能被启动;如果Activity被销毁,那么它其中的所有Fragment都会被销毁。但是,当Activity在活动状态,可以独立控制Fragment的状态,比如加上或者移除Fragment。 | |
必须实现的三个回调函数 | |
onCreate() | |
系统在创建Fragment的时候调用这个方法,这里应该初始化相关的组件,一些即便是被暂停或者被停止时依然需要保留的东西。 | |
onCreateView() | |
当第一次绘制Fragment的UI时系统调用这个方法,必须返回一个View,如果Fragment不提供UI也可以返回null。 | |
注意,如果继承自ListFragment,onCreateView()默认的实现会返回一个ListView,所以不用自己实现。 | |
onPause() | |
当用户离开Fragment时第一个调用这个方法,需要提交一些变化,因为用户很可能不再返回来。 | |
为什么不能在main thread现成之外操作ui | |
会使ui乱掉 | |
异步任务用什么?怎么用?实现原理? | |
AsynTask | |
View的刷新 | |
在需要刷新的地方,使用handle.sendmessage发送信息,然后在handle的getmessage里面执行invaliate或者postinvaliate. | |
Activity之间的通讯,及如何携带参数 | |
通讯: Intent | |
参数: Bundle | |
为什么不能在activity之间直接创建或调用,直接传参数而需要用intent | |
在 Android 中,不同的 Activity 实例可能运行在一个进程中,也可能运行在不同的进程中。因此我们需要一种特别的机制帮助我们在 Activity 之间传递消息。Android 中通过 Intent 对象来表示一条消息,一个 Intent 对象不仅包含有这个消息的目的地,还可以包含消息的内容,这好比一封 Email,其中不仅应该包含收件地址,还可以包含具体的内容。对于一个 Intent 对象,消息“目的地”是必须的,而内容则是可选项。 | |
在上面的实例中通过 Activity. startActivity(intent) 启动另外一个 Activity 的时候,我们在 Intent 类的构造器中指定了“收件人地址”。 | |
如果我们想要给“收件人”Activity 说点什么的话,那么可以通过下面这封“e-mail”来将我们消息传递出去: | |
Intent intent =new Intent(CurrentActivity.this,OtherActivity.class); | |
// 创建一个带“收件人地址”的 email | |
Bundle bundle =new Bundle();// 创建 email 内容 | |
bundle.putBoolean("boolean_key", true);// 编写内容 | |
bundle.putString("string_key", "string_value"); | |
intent.putExtra("key", bundle);// 封装 email | |
startActivity(intent);// 启动新的 Activity | |
那么“收件人”该如何收信呢?在 OtherActivity 类的 onCreate() 或者其它任何地方使用下面的代码就可以打开这封“e-mail”阅读其中的信息: | |
Intent intent =getIntent();// 收取 email | |
Bundle bundle =intent.getBundleExtra("key");// 打开 email | |
bundle.getBoolean("boolean_key");// 读取内容 | |
bundle.getString("string_key"); | |
上面我们通过 bundle 对象来传递信息,bundle 维护了一个 HashMap<String, Object> 对象,将我们的数据存贮在这个 HashMap 中来进行传递。但是像上面这样的代码稍显复杂,因为 Intent 内部为我们准备好了一个 bundle ,所以我们也可以使用这种更为简便的方法: | |
Intent intent =new Intent(EX06.this,OtherActivity.class); | |
intent.putExtra("boolean_key", true); | |
intent.putExtra("string_key", "string_value"); | |
startActivity(intent); | |
接收: | |
Intent intent=getIntent(); | |
intent.getBooleanExtra("boolean_key",false); | |
intent.getStringExtra("string_key"); | |
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。 | |
一 Activity的生命周期 | |
和其他手机 平台 的应用程序一样,Android的应用程序的生命周期是被统一掌控的,也就是说我们写的应用程序命运掌握在别人(系统)的手里,我们不能改变它,只能学习并适应它。 | |
简单地说一下为什么是这样:我们手机在运行 | |
一个应用程序的时候,有可能打进来电话发进来短信,或者没有电了,这时候程序都会被中断,优先去服务电话的基本功能,另外系统也不允许你占用太多资源,至少要保证电话功能吧,所以资源不足的时候也就有可能被干掉。言归正传,Activity的基本生命周期如下代码所示: | |
Java 代码 | |
1 | |
public class MyActivity extends Activity | |
2 { | |
3 | |
protected void onCreate(Bundle savedInstanceState); | |
4 | |
protected void onStart(); | |
5 | |
protected void onResume(); | |
6 | |
protected void onPause(); | |
7 | |
protected void onStop(); | |
8 | |
protected void onDestroy(); | |
9 | |
} | |
你自己写的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]来处理多线程和界面交互的问题。这个我后面会讲一些,最近因为这些东西头已经很大了,等我理清思绪再跟大家分享。 | |
二. Java问题 | |
如果重写了ObjectA和ObjectB的hashcode方法,并且都返回1, 那么会有什么结果? | |
在使用hash相关的额collection的时候容易发生碰撞, 降低速度。 | |
使用匿名内部类可以调用到外部类的private方法吗? | |
可以 | |
什么是类的反射机制? | |
得到一个类的Class对象,然后通过Class对象来解析类的结构,比如说得到这个类有什么方法,有什么属性。得到这些方法或属性后,可以调用指定对象上的这个方法,也可以给指定对象上的这个属性赋值。 | |
eg: | |
T t = new T(); | |
Class c = t.getClass(); //得到T这个类的class对象 | |
Method m = c.getDeclaredMethod("getName"); //得到getName方法 | |
m.invoke(t); //调用getName方法,并且将this指向t这个对象 | |
说出一些常用的类,包,接口,请各举5个 | |
类:1.java.lang.Object | |
2.java.lang.String | |
3.java.lang.System | |
4.java.io.file | |
5.java.io.FileInputStream | |
包:1.java.lang包 | |
2.java.io包 | |
3.java.swt包 | |
4.java.util包 | |
5.java.sql包 | |
接口:1.java.util.List<E> | |
2.java.util.Map<E> | |
3.java.util.Iterator<E> | |
4.java.sql.CallableStatement | |
5.java.lang.Comparable<T> | |
静态变量和实例变量的区别? | |
java类的成员变量有俩种:一种是被static关键字修饰的变量,叫类变量或者静态变量;另一种没有static修饰,为实例变量。 | |
在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。 | |
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。 | |
String是最基本的数据类型吗 | |
基本数据类型包括byte、int、char、long、float、double、boolean和short。 java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。 | |
char型变量中能不能存贮一个中文汉字?为什么? | |
是能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,所以放一个中文是没问题的 | |
string 和 stringbuffer的区别? | |
它们都是处理字符串的类,但是它们有一个最大的区别,那就是,String对象是存储你不能改动的文本字符串,相反,如果你希望改动,则应使用StringBuffer类作为替换. | |
ArrayList和Vector的区别,HashMap和Hashtable的区别 | |
答:就ArrayList与Vector主要从二方面来说. | |
一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的 | |
二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半 | |
就HashMap与HashTable主要从三方面来说。 | |
一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现 | |
二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的 | |
三.值:只有HashMap可以让你将空值作为一个表的条目的key或value | |
多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? | |
答:多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 | |
同步的实现方面有两种,分别是synchronized,wait与notify | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment