安卓四大组件基础题
Android四大组件
文章目录
- Android四大组件
- 一、基础概念
- 二、Activity相关
- 三、Service相关
- 四、BroadcastReceiver相关
- 五、ContentProvider相关
- 六、综合应用
- 问题汇总
一、基础概念
Q1: Android四大组件是什么?分别有什么作用?
A1:
- Activity(活动):应用程序的页面,主要用于与用户交互
- Service(服务):没有UI页面,主要用于在后台执行耗时、不需要与用户交互的操作
- BroadcastReceiver(广播接收器):用于应用接收外部消息,如网络连接广播等
- ContentProvider(内容提供器):主要用于应用程序之间数据共享
二、Activity相关
Q2: Activity的生命周期有哪些方法?分别什么时候调用?
A2:
- onCreate():表示窗口正在被创建,加载layout布局文件,做初始化操作
- onStart():Activity正在被启动,窗口已可见但还没出现在前台,无法交互
- onRestart():窗口正在重新启动,从其他页面返回时调用
- onResume():窗口已可见,显示在前台并且进行活动,可以与窗口交互
- onPause():窗口正在停止,可以做存储数据、停止动画等不太耗时的操作
- onStop():窗口即将停止,可以做稍微重量级的回收工作
- onDestroy():窗口即将被销毁,做回收工作和最终的资源释放
Q3: Activity的四种启动模式是什么?分别有什么特点?
A3:
- standard(标准模式):每次调用startActivity()都会产生一个新的实例
- singleTop(栈顶复用):当栈顶的activity恰好是该activity的实例时,不创建新实例
- singleTask(栈内复用):检查栈中是否存在该activity实例,存在就发送intent给它,否则创建新实例放入栈底
- singleInstance(单例模式):该模式的Activity实例所处的task中只能有这个activity实例,不能有其他实例
Q4: Activity启动的几种方式?
A4:
- 同一应用内启动(类名):
startActivity(new Intent(MainActivity.this, SecondActivity.class));
- 同一应用内启动(action):
startActivity(new Intent("com.test.intent.action.SECOND"));
- 不同应用启动(action):
startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
- 不同应用启动首页:
startActivity(getPackageManager().getLaunchIntentForPackage("packageName"));
Q5: Activity传递数据的几种方式?
A5:
-
putExtra方式:
intent.putExtra("key", value)
-
Bundle方式:可传递基本数据类型和复杂数据
Serializable序列化:对象实现Serializable接口
Parcelable序列化:对象实现Parcelable接口(效率更高)
-
startActivityForResult:用于需要返回结果的情况
三、Service相关
Q6: Service的生命周期是什么?
A6: onCreate(创建) → onStartCommand(开始执行) → onDestroy(结束)
- 服务未创建时先执行onCreate再执行onStartCommand
- 服务已创建时,再次startService不会执行onCreate,但会执行onStartCommand
Q7: 如何实现Activity和Service通信?
A7: 通过Binder机制:
- 在Service中创建DownloadBinder类继承Binder
- 重写onBind()方法返回DownloadBinder实例
- Activity中创建ServiceConnection保持连接
- 使用bindService()绑定服务,通过Binder调用Service方法
Q8: 前台服务和后台服务的区别?如何创建前台服务?
A8:
-
区别:前台服务会在状态栏显示通知,不容易被系统回收;后台服务没有UI显示,容易被回收
-
创建前台服务
:
- 创建NotificationChannel(Android 8.0+)
- 创建Notification
- 调用startForeground()方法
Q9: IntentService和普通Service的区别?
A9:
- IntentService:执行完任务后会自动销毁,不需要手动调用stopService
- 普通Service:需要手动调用stopService或stopSelf来销毁
- IntentService原理:内部使用Handler+HandlerThread,执行完任务后自动调用stopSelf()
四、BroadcastReceiver相关
Q10: 广播的两种类型是什么?有什么区别?
A10:
- 标准广播:异步执行,所有接收器几乎同时接收,无先后顺序,无法截断
- 有序广播:同步执行,按优先级顺序接收,可以截断广播
Q11: 广播注册的两种方式?
A11:
- 静态注册:在AndroidManifest.xml中注册,应用未启动也能接收广播(Android 7.0后有限制)
- 动态注册:在代码中注册,需要在onDestroy中反注册防止内存泄漏
Q12: 本地广播的优势和使用方法?
A12:
- 优势
- 广播不会离开应用,数据安全
- 其他程序无法发送广播到应用内部
- 效率比全局广播高
- 使用方法:使用LocalBroadcastManager进行注册、发送和反注册
五、ContentProvider相关
Q13: ContentProvider的作用和实现方式?
A13:
- 作用:实现不同应用程序之间的数据共享,提供标准的数据访问接口
- 实现方式
- 继承ContentProvider类
- 实现query、insert、update、delete等方法
- 在AndroidManifest.xml中注册
Q14: ContentProvider中UriMatcher的作用?
A14: UriMatcher用于匹配不同的URI,根据不同的URI执行相应的数据库操作:
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(AUTHORITY, TABLE_NAME_BOOK, TABLE_CODE_1);
Q15: ContentProvider的call方法有什么用途?
A15: call方法用于扩展ContentProvider功能,可以传递Bundle数据,实现除CRUD之外的自定义操作。
六、综合应用
Q16: 如何实现Service保活?
A16:
- 系统级Service:默认保活,不容易被杀死
- android:persistent=“true”:应用启动很早,被杀后会重启(不推荐)
- 提高Service优先级:android:priority=“1000”,使用前台服务
- 双进程守护:创建两个Service互相守护
Q17: 从Service启动Activity需要注意什么?
A17: 需要设置Intent.FLAG_ACTIVITY_NEW_TASK
标志:
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Q18: Android进程优先级从高到低的顺序?
A18: 前台进程 → 可视进程 → 次要服务进程 → 后台进程 → 内容供应节点 → 空进程
Q19: Activity的FLAG有哪些常用的?
A19:
- FLAG_ACTIVITY_NEW_TASK:指定为singleTask启动模式
- FLAG_ACTIVITY_SINGLE_TOP:指定为singleTop启动模式
- FLAG_ACTIVITY_CLEAR_TOP:清除栈中位于它上面的所有Activity
- FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:不出现在历史任务列表中
Q20: 如何安全地启动其他应用的Activity?
A20: 添加非空判断和resolveActivity判断:
if (intent != null && intent.resolveActivity(getPackageManager()) != null) {startActivity(intent);
}
问题汇总
Q1: Android四大组件是什么?分别有什么作用?
Q2: Activity的生命周期有哪些方法?分别什么时候调用?
Q3: Activity的四种启动模式是什么?分别有什么特点?
Q4: Activity启动的几种方式?
Q5: Activity传递数据的几种方式
Q6: Service的生命周期是什么
Q7: 如何实现Activity和Service通信?
Q8: 前台服务和后台服务的区别?如何创建前台服务?
Q9: IntentService和普通Service的区别?
Q10: 广播的两种类型是什么?有什么区别?
Q11: 广播注册的两种方式?
Q12: 本地广播的优势和使用方法?
Q13: ContentProvider的作用和实现方式?
Q14: ContentProvider中UriMatcher的作用?
Q15: ContentProvider的call方法有什么用途?
Q16: 如何实现Service保活?
Q17: 从Service启动Activity需要注意什么?
Q18: Android进程优先级从高到低的顺序?
Q19: Activity的FLAG有哪些常用的?
Q20: 如何安全地启动其他应用的Activity?