为帝都金三银四准备的Android面试热点题

本文详细介绍了Android四大组件:Activity、Service、BroadcastReceiver和ContentProvider的基本概念及其应用场景。深入解析了Activity的生命周期、启动模式及Fragment的特性等内容。

一、基本概念

(一)、Android四大组件相关基础问题

Activity、Service、BroadcastReceiver、ContentProvider

1、 Activity基本概念:应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。

2、BroadcastReceiver基本概念:应用程序可以使用它对外部事件进行过滤只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或serice 来响应它们收到的信息,或者用NotificationManager 来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。

3、service基本概念:一个Service 是一段长生命周期的,没有用户界面的程序,可以用来开发如监控类程序。

4、ContentProvider基本概念:android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序。这些数据可以存储在文件系统中、在一个SQLite数据库、或以任何其他合理的方式。其他应用可以通过ContentResolver类(见ContentProviderAccessApp例子)从该内容提供者中获取或存入数据.(相当于在应用外包了一层壳),只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处:统一数据访问方式。

5、四大组件的基本作用
Acitivity :用于显示界面,接收用户输入,和用户交互。
Service :运行于后台无界面的程序,用于在后台完成一下任务,例如:音乐播放等。
BroadCast Receiver :接收系统或应用发出的广播并作出响应,例如:电话的呼入呼出等。
Content Provider :用于把APP本身的数据共享给其他APP,提供本APP数据的存取接口给其他APP

Activity

1、Activity的生命周期


img_d0a39162782ec1a8c59f7ca8244c022e.png
Activity的生命周期

*启动Activity:onCreate->onStart->onResume
*锁屏或被其它Activity覆盖:onPause->onStop
*解锁或由被覆盖状态再回到前台:onRestart->onStart->onResume
*跳转到其它Activity或按Home进入后台:onPause->onStop
*退回到此Activity:onRestart->onStart->onResume
*退出此Activity:onPause->onStop->onDestory
*对话框弹出不会执行任何生命周期(注:对话框如果是Activity(Theme为Dialog),还是会执行生命周期的)
*从A跳转到B:当B的主题为透明时,A只会执行onPause(A-onPause->B-(onCreate->onStart->onResume))
*从A跳转到B:A-onPause->B-(onCreate->onStart->onResume)-A-onStop(注意是A执行onPause后开始执行B的生命周期,B执行onResume后,A才执行onStop,所以尽量不要在onPause中做耗时操作)
*从B返回到A:B-onPause->A-(onRestart->onStart->onResume)-B-(onStop->onDestroy)

2、Activity四种启动模式的区别(LanchMode 的应用场景)

①、standard 模式
这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。

②、singleTop 模式
如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的实例。

③、singleTask 模式
如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。

④、singleInstance 模式
在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。 常应用于App主页

3、如何设置Activity的启动模式?
在 AndroidManifest.xml 文件中 Activity 元素的 Android:launchMode 属性。

4、Activity中类似onCreate、onStart运用了哪种设计模式,为什么?
模板模式。每次新建一个Activty时都会覆盖onCreate、onStart等方法,这些方法在父类中就相当于一个模板。

5、如何将一个Activity设置成窗口的样式?
方法一:在AndroidManifest.xml文件中将当前需要改变成窗口样式的属性。

android:theme="@android:style/Theme.Dialog"

方法二:在styles.xml文件中自定义一个主题样式,此主题样式必须继承Dialog的样式.

6、Activity的启动过程
①、通过Launcher来启动Activity或者通过Activity内部调用startActivity接口来启动新的Activity,都通过Binder进程间通信进入到ActivityManagerService进程中,并且调用ActivityManagerService.startActivity接口;
②、ActivityManagerService调用ActivityStack.startActivityMayWait来做准备要启动的Activity的相关信息;
③、ActivityStack通知ApplicationThread要进行Activity启动调度了,这里的ApplicationThread代表的是调用ActivityManagerService.startActivity接口的进程,对于通过点击应用程序图标的情景来说,这个进程就是Launcher了,而对于通过在Activity内部调用startActivity的情景来说,这个进程就是这个Activity所在的进程了;
④、ApplicationThread不执行真正的启动操作,它通过调用ActivityManagerService.activityPaused接口进入到ActivityManagerService进程中,看看是否需要创建新的进程来启动Activity;
⑤、对于通过点击应用程序图标来启动Activity的情景来说,ActivityManagerService在这一步中,会调用startProcessLocked来创建一个新的进程,而对于通过在Activity内部调用startActivity来启动新的Activity来说,这一步是不需要执行的,因为新的Activity就在原来的Activity所在的进程中进行启动;
⑥、ActivityManagerService调用ApplicationThread.scheduleLaunchActivity接口,通知相应的进程执行启动Activity的操作;
⑦、ApplicationThread把这个启动Activity的操作转发给ActivityThread,ActivityThread通过ClassLoader导入相应的Activity类,然后把它启动起来。

7、Activity、Window 和 View 三者的区别
①、一个 Activity 构造的时候一定会构造一个 Window(PhoneWindow),并且只有一个。
②、这个Window会有一个ViewRoot(View、ViewGroup)。
③、通过addView()加载布局。
④、WindowMangerService 接收消息,并且回到 Activity 函数,比如onKeyDown()。
Activity 是控制单元---Window 是承载模型---View 是显示视图

8、简述onActivityResult(int requestCode, int resultCode, Intent data)方法的作用?
希望在Activity中得到新打开Activity关闭后返回的数据,则需要使用系统提供的startActivityForResult(Intent intent,int requestCode)方法打开新的Activity,新的Activity关闭后会向前面的Activity传回数据,为了得到传回的数据,必须在最先关闭的Activity中重写onActivityResult(int requestCode, int resultCode,Intent data)方法。

9、内存不足时,怎么保持Activity的一些状态?
在onSaveInstanceState方法中保存Activity的状态,在onRestoreInstanceState或onCreate方法中恢复Activity的状态

10、简述onSaveInstanceState方法作用?
①、用于保存Activity的状态存储一些临时数据
②、Activity被覆盖或进入后台,由于系统资源不足被kill会被调用
③、用户改变屏幕方向会被调用
④、跳转到其它Activity或按Home进入后台会被调用
⑤、会在onStop之前被调用,和onPause的顺序不固定的

11、简述onRestoreInstanceState(Bundle savedInstanceState)方法作用?
①、用于恢复保存的临时数据,此方法的Bundle参数也会传递到onCreate方法中,你也可以在onCreate(Bundle savedInstanceState)方法中恢复数据
②、由于系统资源不足被kill之后又回到此Activity会被调用
③、用户改变屏幕方向重建Activity时会被调用
④、会在onStart之后被调用

12、onRestoreInstanceState和onCreate的区别是什么?
当onRestoreInstanceState被调用时Bundle参数一定是有值的,不用做为null判断,onCreate的Bundle则可能会为null。官方文档建议在此方法中进行数据恢复。

13、如何安全退出已调用多个Activity的Application?
①、记录打开的Activity:每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。
②、发送特定广播:在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。
③、递归退出:在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。

Fragment

1、Fragment的生命周期


img_1ecd3c3135740d0e02a7d5abc110c1b3.png
Fragment的生命周期

2、Activity中如何动态的添加Fragment?

//1,获取碎片管理器
FragmentManager fragment=getFragmentManager();
//2,碎片的显示需要使用FragmentTransaction类操作
FragmentTransaction transacction=fragment.beginTransaction();
//获取屏幕管理器和默认的显示
Display display=getWindowManager().getDefaultDisplay();
//判断横屏
if(display.getWidth()>display.getHeight()){
    //获取java类
    Frament1 frament1 =  new Frament1();
    transacction.replace(android.R.id.content, frament1);
}else{
    Frament2 frament2 =  new Frament2();
    transacction.replace(android.R.id.content, frament2);
}
//3、使用FragmentTransaction必须要commit
transacction.commit();

3、简述Fragment 特点
①、Fragment可以作为Activity界面的一部分组成出现;
②、可以在一个Activity中同时出现多个Fragment,并且一个Fragment也可以在多个Activity中使用;
③、在Activity运行过程中,可以添加、移除或者替换Fragment;
④、Fragment可以响应自己的输入事件,并且有自己的生命周期,它们的生命周期会受宿主Activity的生命周期影响;
⑤、Fragment可以轻松得创建动态灵活的UI设计,可以适应于不同的屏幕尺寸;
⑥、Fragment 解决Activity间的切换不流畅,轻量切换;

4、Fragment嵌套多个Fragment会出现bug吗?
会出现三种bug:突变的动画效果、被继承的setRetainInstance、错乱的onActivityResult传递
具体分析:http://blog.youkuaiyun.com/megatronkings/article/details/51417510

### 软件测试面试及答案 #### 数据和数据库完整性测试 在评估应用程序的数据处理能力时,确保数据的一致性和准确性至关重要。这涉及到验证输入到系统的数据能否被正确存储、检索以及更新而不会丢失或损坏[^1]。 #### 功能测试 此类型的测试旨在确认各个功能模块按照预期工作。例如,在电子商务网站上购买商品的功能应该能够成功完成交易流程中的每一步骤,包括选择产品、填写配送信息直至支付过程结束。 #### 用户界面测试 用户体验对于任何应用的成功都非常重要。通过模拟真实用户的操作行为来进行UI/UX方面的审查可以发现潜在的设计缺陷并提高产品的易用性水平。 #### 性能评测与负载测试 为了衡量系统在不同条件下的响应速度和服务质量,通常会实施性能评测;而在高并发情况下考察服务器承受压力的能力则属于负载测试范畴。这类活动有助于识别瓶颈所在从而优化资源配置策略以满足业务需求。 #### 安全性和访问控制测试 保护敏感资料免受未授权访问是至关重要的。因此需要定期开展针对权限管理机制的有效性检验——即检查只有经过适当认证后的合法用户才能获取特定资源,并且防止内部人员滥用职权造成的信息泄露风险。 #### 故障转移和恢复测试 当发生意外中断事件(如硬件故障)之后,快速恢复正常运行状态是一项基本要求。为此设计专门方案用于演练灾难场景下应急措施的效果评价就显得尤为必要了。 #### 配置测试 不同的环境设置可能会影响程序的表现形式及其稳定性表现。所以有必要针对多种部署模式展开全面细致的研究分析以便及时调整参数设定达到最佳兼容效果。 #### 加密测试 随着网络安全威胁日益严峻,保障通信链路的安全传输成为不可忽视的任务之一。这就意味着要对采用的各种加密算法进行严格检测确保其强度足以抵御外部攻击者破解企图的同时不影响正常使用体验。 #### 可用性测试 从最终消费者的角度出发考量整个交互过程是否流畅自然也是不可或缺的一个环节。它不仅限于页面加载时间长短这样的硬指标还包括视觉呈现美观度在内的软因素共同作用决定着整体满意度得分高低。 #### 版本验证测试 每当有新的迭代发布之前都要经历一轮详尽的质量把控工序来保证新旧特性之间不存在冲突矛盾之处并且所有已知问均已得到妥善解决才允许上线推广给广大受众群体试用反馈意见收集整理待改进事项清单持续完善产品质量管理体系循环往复不断提升竞争力优势地位稳固保持行业领先水平不断超越自我追求卓越品质永无止境地探索未知领域创造无限可能性未来可期。 #### 文档测试 良好的技术文档可以帮助开发者更好地理解项目的架构和技术细节,同时也方便后续维护和支持工作的顺利开展。因此,应当仔细审核各类手册指南是否存在错误遗漏等问影响实际工作效率提升。 ```python import unittest class TestExample(unittest.TestCase): def test_addition(self): self.assertEqual(1 + 1, 2) if __name__ == '__main__': unittest.main() ``` 上述代码展示了如何利用Python内置库`unittest`创建简单的单元测试案例并通过调用`.main()`方法启动执行流程实现自动化校验目的[^2]。 关于具体项目经验分享方面,则可以从以下几个角度入手准备回答: - 描述所参与的具体项目名称及其背景意义; - 解释团队结构构成情况比如成员数量角色分工协作方式等要素; - 提供有关开发周期长度里程碑规划进度安排等方面的信息说明; - 统计编写了多少条测试用例发现了几个Bug等相关量化成果展示个人贡献价值所在[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值