朋友面试中被问到的 Android 面试题解答

最近知道朋友面试,于是就问了一下关于面试的问题,发现平时用的挺顺手,要是被突然这么一问,还真有些答不上来。本篇博文,就这些问题,综合 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

文章有帮助到您?不妨打赏博主一碗拉面或一杯咖啡的小费吧 :-D!