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

安卓四大组件基础题

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.lryc.cn/news/623361.html

相关文章:

  • AI搜索:大模型商业落地的“第一束光”,照见了什么?
  • 【数据结构】深入理解单链表与通讯录项目实现
  • aws(学习笔记第五十一课) ECS集中练习(3)
  • MySQL锁机制:悲观锁VS乐观锁详解
  • 初识c语言————宏定义和调用
  • C语言零基础第18讲:自定义类型—结构体
  • 新手向:GitCode疑难问题诊疗
  • C语言:文件操作详解
  • 从 MySQL 5.7 迁移到 8.0:别让 SQL 文件 “坑” 了你
  • 双指针和codetop复习
  • 【LeetCode每日一题】
  • JavaWeb开发_Day14
  • 嵌入式 Linux LED 驱动开发实验
  • Proteus 入门教程
  • KingbaseES主备读写分离集群安装教程
  • 通配符 重定向 管道符
  • 心路历程-三个了解敲开linux的大门
  • 高等数学 8.4 空间直线及其方程
  • 机器学习 [白板推导](十二)[卡曼滤波、粒子滤波]
  • Python语言---OrangePi全志H616
  • CPP多线程1:C++11的std::thread
  • Spring AI 进阶之路01:三步将 AI 整合进 Spring Boot
  • linux设备驱动之字符设备驱动
  • 链式二叉树的基本操作——遍历
  • 【论文笔记】Multi-Agent Based Character Simulation for Story Writing
  • 同创物流学习记录2·电车
  • 聊聊智慧这个东西之三:从食物的毒性、偏性聊起
  • 探秘gRPC——gRPC原理详解
  • [优选算法专题二滑动窗口——最大连续1的个数 III]
  • implement libwhich for Windows