Q:assets与res/raw的不同?
A: 简单来说assets用于存放需要打包到应用程序的静态文件,以便部署到设备中,支持任意深度的子目录,这些文件不会生成任何资源ID,
访问的时候需要AssetManager类,使用/assets开始(不包含它)的相对路径名。
AssetManager am = null;
am = getAssets();
InputStream is = am.open("filename");
res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;
InputStream is =getResources().openRawResource(R.id.filename);
Q:Android异步处理方式? 优缺点
A: 处理一:使用Thread+Handler实现非UI线程更新UI界面
处理二:使用AsyncTask异步更新UI界面
处理三:Handler+Looper+MessageQueue
处理四:异步多线程类的封装,模拟android AsyncQueryHandler 这个类封装,这样代码比较简洁,一般命名为 AsyncWorkHandler
感觉最佳方式是AsyncTask,线程池可以免去新建线程的开销
“AsyncTasks should ideally be used for short operations (a few seconds at the most.) ”不过文档建议如果太长的操作还是自己使用java.util.concurrent 类来做
AsyncTask的本质是一个线程池,所有提交的异步任务都会在这个线程池中的工作线程内执行,当工作线程需要跟UI线程交互时,工作线程会通过向在UI线程创建的Handler
Q:在什么情况下使用AIDL?
A: 要做进程间的调用需要是用AIDL,如果只是线程间的调用只需要是用LocalService
参考 http://www.poemcode.net/2010/05/aidl-ipc/
Q: Android不同应用间调用的四种方式
A: http://ffwmxr.blog.163.com/blog/static/663727222014329105521355/
Activity可以跨进程调用其他应用程序的Activity,这种调用其他应用的界面
Content Provider可以跨进程访问其他应用程序中的数据(以Cursor对象形式返回),当然,也可以对其他应用程序的数据进行增、删、改操作;适合大量记录型数据传输,android本省系统很多服务实际使用这种方式,实际上也是是用Binder的机制来完成,参考这篇文章 http://blog.csdn.net/luoshengyang/article/details/6967204
Broadcast可以向android系统中所有应用程序发送广播,而需要跨进程通讯的应用程序可以监听这些广播,Broadcast做法相对简单,但速度慢;
Service和Content Provider类似,也可以访问其他应用程序中的数据,但不同的是,Content Provider返回的是Cursor对象,而Service返回的是Java对象,这种可以跨进程通讯的服务叫AIDL服务。
如果通一个应用Activity和Service通信可以是用LocalService实现,Service向Activity发消息则可以是用Broadcast
Q: 延时执行方法
A:
一:开启新线程 (不建议)
二:利用定时器(推荐)
TimerTask task = new TimerTask(){
public void run(){
//execute the task
}
};
Timer timer = new Timer();
timer.schedule(task, delay);
三:使用handler的postDelayed方法
http://blog.csdn.net/xiabo851205/article/details/7991529 (感觉做间隔调用挺方便)
new Handler().postDelayed(new Runnable(){
public void run() {
//execute the task
}
}, delay);
四:利用AlarmManager,特点时刻广播指定意图能实现,一般的简单任务不这么做。
![(please configure the [header_logo] section in trac.ini)](http://www1.pconline.com.cn/hr/2009/global/images/logo.gif)