最近知道朋友面试,于是就问了一下关于面试的问题,发现平时用的挺顺手,要是被突然这么一问,还真有些答不上来。本篇博文,就这些问题,综合 Google 官方文档和网上一些大牛的博客,给出一个比较专业的答案,希望对各位面试的朋友有些帮助。
Question 1: 碎片跳转碎片然后怎么从这个碎片返回到前面一个碎片?
这个问题很简单,但是为了答案的可信度和专业度,这里还是要贴上官方的文档:
官方文档链接
可以从上面的图例中代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15// Create fragment and give it an argument specifying the article it should show
ArticleFragment newFragment = new ArticleFragment();
Bundle args = new Bundle();
args.putInt(ArticleFragment.ARG_POSITION, position);
newFragment.setArguments(args);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack so the user can navigate back
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
这样我们来总结一下该如何回答这道题?
答案:要想返回到前一个碎片,我们需要在前一个碎片创建,提交事务前,将其压入返回栈中,也就是调用
FragmentTransaction.addToBackStack(),然后第二个碎片中调用getSupportFragmentManager().popBackStack()(support.v4包) 或者getFragmentManager().popBackStack()即可返回上一个碎片。拓展回答(以显示自己知识的深度): 需要注意的是,如果你对显示的 fragment 不压入栈,那么此 fragment 被移除或替换的时候会调用其
onDestory()方法,而不是onStop()方法。另外就是,调用addToBackStack()压入栈时,需要传入一个参数,这个参数一般置为null即可,除非你需要通过 FragmentManager.BackStackEntry 的 API 进行高级的 fragment 操作.
Question 2: 碎片中 replece 和 add 的区别
1)
fragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)
此方法的功能 - 将一个之前已经被添加到 container(容器) 中的且目前还存在的 fragment 替换掉。一旦你调用了这个方法,基本上等同于将容器中所有拥有相同 containerViewId 删除掉,也就是说调用了 remove(Fragment) 方法,然后再调用 add(int, Fragment, String) 方法。
另外需要注意的是,从 fragmentA replace()成 fragmentB,会调用 fragmentA 的销毁的相关生命周期方法和 fragmentB 的创建的相关生命周期方法,我们再从 fragmentB replace()成 fragmentA,又会调用 fragmentB 的销毁相关生命周期方法和 fragmentA 的创建的相关生命周期方法。这样做很耗性能。
使用场景: 对于旧的 fragment 无需再使用时,可以使用 replace() 方法将其销毁。
2)
fragmentTransaction.add(int containerViewId, Fragment fragment, String tag)
此方法的功能 - 将一个 fragment 添加到 activity 的视图容器中。这个 fragment 可能会有自己的视图(如果 Fragment.onCreateView 有创建 view 的话).
不同于 replace() 方法,我们通过 add() 方法从 fragmentA 到 fragmentB,需要调用 fragmentB 的创建的相关生命周期方法,不会调用 fragmentA 的销毁的生命周期方法,再利用 hide(), show() 方法从 fragmentB 到 fragmentA,不会调用任何生命周期方法。
使用场景: 对于需要重用和频繁切换的 fragment,我们可以使用 add(),hide(),show() 方法。
请参考: FragmentTransaction
Question 3: viewpaper实现的横幅广告滑到最后一张停了怎样实现循环滑动
// TODO
Question 4: 讲讲触摸事件的分发机制,知道多少讲多少
参见我的博文 《Android Touch 事件传递机制》
Question 5: 有没有深入了解过自定义View ,简单讲一讲
参见我的自定义view相关博文:
Android自定义控件(一)
Android自定义控件(二)
Android自定义控件(三)
Android自定义控件(四)
Question 6: 讲讲安卓3之前用的 httpclient,再讲讲 httpURLconnection 后来的 volley 框架有什么好处
关于 Apache 的 HTTP client 和 HttpURLConnection 请参照我的另一篇博文:《关于 Android 中的 HTTP Clients》
Retrofit 及 Volley 框架默认在 Android Gingerbread(API 9) 及以上都是用 HttpURLConnection,9 以下用 HttpClient。
想知道更多关于 Volley 的信息,我推荐你阅读 Trinea 大牛的博文:《Volley 源码解析》.
Question 7: activity 和 fragment 的生命周期用起来有没有感觉不太一样,讲讲不一样的地方
// TODO
Question 8: 你遇到过的内存泄漏问题,你是怎么解决的
// TODO
Question 9: activity A 跳转到 activity B,然后 activity B 载跳转到 activity C ,在 C 上执姓某个操作,怎样让A和B上的数据也更新
// TODO
Question 10: 讲讲 activity 的启动模式有哪些
// TODO
Question 11: 讲讲 activity 中的 onNewIntent()什么时候用
// TODO
Question 12: 一个activity刚启动执行哪些生命周期方法,如果点击按钮弹出dialog对话框时又执行哪些方法,再点击对话框之外的部分这时对话框消失又执行哪些方法
// TODO
Question 13: 广播的启动方式
// TODO
Question 14: 你用过的第三方SDK有哪些,简单讲讲
这题结合自己在项目使用第三方 SDK 的实际情况的说说:
- 百度地图,高德地图,etc.
- 推送方面(极光推送,etc.)
- 其他
先只需说出自己使用过的第三方 SDK 即可,至于使用时的步骤以及使用过程中碰到的问题,等面试官详细问起的再说。
Question 15: Android端和后台是怎么交互的,从发送请求开始讲描述整个过程
我的个人回答:终端一般都是采用 HTTP 协议与后台进行交互,Android 端一般使用 Apache 的 HTTP client 或者是 HttpURLConnection 抑或者是封装比较好的请求框架(如,Volley ,etc.),通过指定请求的 IP,请求方式,超时时间等,向服务端发送请求。因为我之前是做 web 开发的,服务端的话,一般是写个 servlet, 重写 doPost(), doGet() 方法,来对不同的请求做业务处理,这里的处理可能是查询数据库,也可能是返回一个图片流,etc.
Question 16: handler,loop机制,讲一下
// TODO