Android 小技巧

在 Activity 中最常看到的函式呼叫,就是 findViewById(),常見用法如下:

(ImageView) findViewById(R.id.image);

由於 findViewById() 傳回的是 View 這個通用型別。因此實務上每次都要強制轉型成實際的型別,這樣的程式碼看起來實在有點礙眼。

要解決這樣的問題,你只要在 Activity 中,加入底下這個 getView() 函式。

public final <E extends View> E getView(int id) {
		return (E) findViewById(id);
	}
	
	getView(R.id.image);

转载(http://ysl-paradise.blogspot.com/2014/04/activitygetview.html)


26

26


Android 面试题

android 面试题: 1. @Override public boolean equals(Object o) { if (o != null && o.getClass() == this.getClass()) { MonthInfo data = (MonthInfo) o; if (data.year == this.year && data.month == this.month) { return true; } } return false; }

HashCode()方法被用来获取给定对象的唯一整数。这个整数被用来确定对象被存储在HashTable类似的结构中的位置。默认的,Object类的hashCode()方法返回这个对象存储的内存地址的编号。

  1. Padding指view的内容相对于view的边界的距离。Margin指一个view相对于其他view的距离。

  2. 在使用include标签时,如果指定了除android:id=”xxx”和layout=”xxx”之外的属性时,必须加上android:layout_width和android:layout_height,否则其他属性不会生效。

  3. android:layout_marginBottom=”20dp” android:layout_marginRight=”50dp”

  4. 1) drawable-fr-rCA/ 与设备配置冲突

2) drawable/ drawable-port-ldpi/ drawable-port-notouch-12key/ 按描述符优先级en匹配

3) drawable-en/ drawable-en-notouch-12key/ 按描述符优先级port匹配

所以drawable-en-port/匹配。

  1. onSaveInstanceState在activity被系统杀掉之前调用。如,activity a启动了activity b,b完全遮挡了a,那么a可能在系统资源紧张时被回收,在系统杀掉a之前会调用onSaveInstanceState。

  2. Start service将会调用service的onCreate -> onStartCommand -> onDestroy, bind service会调用servcie的onCreate -> onBind -> onUnbind -> onDestroy。

在onStartCommand返回START_STICKY,则service进程被杀掉后,系统会重启该service。

  1. 1)实现数据共享 2)屏蔽实现细节

  2. 不是。onReceive()方法将在与registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)时传入的handler关联的线程里执行。默认调用registerReceiver(BroadcastReceiver, IntentFilter)方法不传handler时将在主线程执行。

  3. Thread, HandlerThread, AsyncTask, Loader, ThreadPoolExecutor

  4. 1)输入事件(touch, key等) 5s内没有得到处理 2)BroadcastReceiver的onReceive方法执行超过10s

  5. 当启动一个launchMode为singleTask的activity时,activity会根据taskAffinity去寻找相应的task来驻留自己,当发现没有这样的task时,系统就会创建这样的task,并将activity放进task里,最后将该task置于前台;如果发现有这样的task,则查询该task中是否已有该activity的实例,如果没有,则将activity置于task栈顶,最后将该task置于前台;如果有这样的实例,则查询是否位于task栈顶,如果在栈顶,则调用该activity实例的onNewIntent方法,并将task置于前台;如果不在栈顶,则销毁该activity实例之上的activity,并调用该activity的onNewIntent方法,并将task置于前台。

  6. Handler

  7. LayoutView1.onInterceptTouchEvent:ACTION_DOWN LayoutView2.onInterceptTouchEvent:ACTION_DOWN LayoutView2.onTouchEvent:ACTION_DOWN LayoutView1.onInterceptTouchEvent:ACTION_MOVE LayoutView2.onTouchEvent:ACTION_MOVE … LayoutView1.onInterceptTouchEvent:ACTION_UP LayoutView2.onTouchEvent:ACTION_UP

onInterceptTouchEvent, onTouchEvent小结: 1)所有都默认 任何View在onTouchEvent的ACTION_DOWN事件时返回false,则不会收到后续move, up事件,且只有ACTION_DOWN事件会回传到父控件。

2)当某个ViewGroup的onInterceptTouchEvent返回true,则会发生截获,事件被传到当前控件的onTouchEvent。

3)当某个ViewGroup的onInterceptTouchEvent, onTouchEvent返回true,则后续move, up事件直接传给该控件的onTouchEvent。 4)当parent view截获move、up事件时,会强制给原先接受ACTION_DOWN事件的子view发送ACTION_CANCEL事件。

  1. 当需要将一个对象从一个进程传递到另一个进程时,则需要实现Parcelable接口。 1) 使你的类实现Parcelable接口,并实现相应的方法 2) 添加静态字段CREATOR,CREATOR为一个实现了Parcelable.CREATOR接口的类对象 3) 添加.aidl文件`


Android 知识点

IPC 官方文档 扩展 OpenBinder

IntentService 开源项目


Android 面试题

android 面试题: 1.Activity的生命周期 官方说明 开源项目

2.请覆写一个类的equals()方法。为什么覆写一个类的equals方法时常常需要覆写hashCode()方法?

3.谈谈padding和margin有何区别。

4.请指出下面的include用法有何问题。

5.如图,要实现FrameLayout里面包含了一个ImageView,FrameLayout的位置是(0, 50, 240, 230),ImageView的位置是(20, 140, 120, 210)(Unit: px)。当ImageView的layout_gravity=”bottom center_horizontal”时,请写出ImageView对应的layout_margin值。(screen pixel density: mdpi)

6.假设有如下drawable目录,每一个目录包含相同图片的不同版本, drawable/ drawable-en/ drawable-fr-rCA/ drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/

假设如下的设备配置(以修饰词的优先级高低排列) Locale = en-GB Screen orientation = port Screen pixel density = hdpi Touchscreen type = notouch Primary text input method = 12key

请描述出android系统是如何一步一步选出最匹配的resource的。

7.什么情况下Activity的onSaveInstanceState()方法会被调用。

  1. Start service和bind service分别会调用到service哪些生命周期的方法。在service的onStartCommand()方法里返回START_STICKY有何作用。

  2. 为什么要用ContentProvider。

  3. BroadcastReceiver的onReceive()方法总是在主线程运行吗。

  4. Android提供了哪些线程机制。

  5. 什么情况下会产生ANR以及如何避免ANR。

  6. 谈谈你对activity的android:launchMode=”singleTask”的理解。

  7. 请描述Handler,Message,MessageQueue,Looper,Thread,HandlerThread,Runnable之间的关系。

  8. 如右图的布局, 假定LayoutView2的onInterceptTouchEvent和onTouchEvent均返回true,其他全为默认返回值,请描述手指点下,移动并抬起的过程中,onInterceptTouchEvent和onTouchEvent相关的调用流程。

  9. 什么时候需要实现Parcelable接口,需要哪些具体的步骤。

  10. 请画出Context模块的类结构图,使用了何种设计模式。