Skip to content

Instantly share code, notes, and snippets.

@errord
Created December 5, 2013 07:25
Show Gist options
  • Save errord/7801466 to your computer and use it in GitHub Desktop.
Save errord/7801466 to your computer and use it in GitHub Desktop.
android面试
一. 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