当前位置: 首页 > web >正文

安卓四大组件基础题

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:

  1. 同一应用内启动(类名)startActivity(new Intent(MainActivity.this, SecondActivity.class));
  2. 同一应用内启动(action)startActivity(new Intent("com.test.intent.action.SECOND"));
  3. 不同应用启动(action)startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
  4. 不同应用启动首页startActivity(getPackageManager().getLaunchIntentForPackage("packageName"));

Q5: Activity传递数据的几种方式?

A5:

  1. putExtra方式intent.putExtra("key", value)

  2. Bundle方式:可传递基本数据类型和复杂数据

    Serializable序列化:对象实现Serializable接口

    Parcelable序列化:对象实现Parcelable接口(效率更高)

  3. startActivityForResult:用于需要返回结果的情况

三、Service相关

Q6: Service的生命周期是什么?

A6: onCreate(创建) → onStartCommand(开始执行) → onDestroy(结束)

  • 服务未创建时先执行onCreate再执行onStartCommand
  • 服务已创建时,再次startService不会执行onCreate,但会执行onStartCommand

Q7: 如何实现Activity和Service通信?

A7: 通过Binder机制:

  1. 在Service中创建DownloadBinder类继承Binder
  2. 重写onBind()方法返回DownloadBinder实例
  3. Activity中创建ServiceConnection保持连接
  4. 使用bindService()绑定服务,通过Binder调用Service方法

Q8: 前台服务和后台服务的区别?如何创建前台服务?

A8:

  • 区别:前台服务会在状态栏显示通知,不容易被系统回收;后台服务没有UI显示,容易被回收

  • 创建前台服务

    1. 创建NotificationChannel(Android 8.0+)
    2. 创建Notification
    3. 调用startForeground()方法

Q9: IntentService和普通Service的区别?

A9:

  • IntentService:执行完任务后会自动销毁,不需要手动调用stopService
  • 普通Service:需要手动调用stopService或stopSelf来销毁
  • IntentService原理:内部使用Handler+HandlerThread,执行完任务后自动调用stopSelf()

四、BroadcastReceiver相关

Q10: 广播的两种类型是什么?有什么区别?

A10:

  • 标准广播:异步执行,所有接收器几乎同时接收,无先后顺序,无法截断
  • 有序广播:同步执行,按优先级顺序接收,可以截断广播

Q11: 广播注册的两种方式?

A11:

  1. 静态注册:在AndroidManifest.xml中注册,应用未启动也能接收广播(Android 7.0后有限制)
  2. 动态注册:在代码中注册,需要在onDestroy中反注册防止内存泄漏

Q12: 本地广播的优势和使用方法?

A12:

  • 优势
    1. 广播不会离开应用,数据安全
    2. 其他程序无法发送广播到应用内部
    3. 效率比全局广播高
  • 使用方法:使用LocalBroadcastManager进行注册、发送和反注册

五、ContentProvider相关

Q13: ContentProvider的作用和实现方式?

A13:

  • 作用:实现不同应用程序之间的数据共享,提供标准的数据访问接口
  • 实现方式
    1. 继承ContentProvider类
    2. 实现query、insert、update、delete等方法
    3. 在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:

  1. 系统级Service:默认保活,不容易被杀死
  2. android:persistent=“true”:应用启动很早,被杀后会重启(不推荐)
  3. 提高Service优先级:android:priority=“1000”,使用前台服务
  4. 双进程守护:创建两个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?

http://www.xdnf.cn/news/18117.html

相关文章:

  • 美国服务器环境下Windows容器工作负载智能弹性伸缩
  • Agent中的memory
  • 17.3 全选购物车
  • MyBatis 的 SQL 拦截器:原理、实现与实践
  • 【力扣-多数元素 JAVA/Python】
  • GaussDB 数据库架构师修炼(十三)安全管理(4)-数据库审计
  • Reading Coach-微软推出的免费AI阅读教练
  • 洛谷B3924 [GESP202312 二级] 小杨的H字矩阵
  • Wi-Fi 7 将如何重塑互联工作场所
  • Linux软件编程:进程与线程(线程的传参、属性、通信(互斥锁、信号量))
  • 存储、硬盘、文件系统、 IO相关常识总结
  • Boost库核心组件与应用
  • 图论Day4学习心得
  • MyBatis极速通关中篇:核心配置精讲与复杂查询实战
  • MATLAB R2010b系统环境(二)MATLAB环境的准备
  • 分享一个Oracle表空间自动扩容与清理脚本
  • Docker小游戏 | 使用Docker部署人生重开模拟器
  • 34 HTB Cat 机器 - 中等难度
  • 洛谷B3836 [GESP202303 二级] 百鸡问题
  • Hana IDE 安装吧报错
  • 每日算法刷题Day62:8.16:leetcode 堆8道题,用时2h30min
  • 【数据分享】大清河(大庆河)流域上游土地利用
  • GCN图卷积神经网络的Pytorch实现
  • 摩搭api 实现
  • 【最后203篇系列】032 OpenAI格式调用多模型实验
  • 博弈论07——Lemke-Howson 算法
  • Redis入门与背景详解:构建高并发、高可用系统的关键基石
  • SpringBoot自动配置原理(二)
  • [Linux] RAID存储技术
  • TDengine 3.3.7.0 版新功能(BLOB 数据类型)