Android 基础知识

一、Activity

1、onSaveInstanceState(),onRestoreInstanceState的调用时机

onSaveInstanceState 调用时机

从最近应用中选择运行其他程序时

但用户按下Home键时

屏幕方向切换时

按下电源案件时

从当前activity启动一个新的activity时

onRestorInstanceState调用时机

只有activity确实是呗系统回收,重新创建activity的情况下才会调用。例如:

屏幕方向切换生命周期如下

onPause->onSaveInstanceState->onStop->onDestroy->onCreate->onstart->onRestoreInstanceState->onResume

2、activity的启动模式和使用场景

standard

默认模式,每次启动activity 都会创建一个新的实例

singleTop

一般应用于通知消息打开的页面

如果要启动的activity已经再栈顶,则不会重新创建,指挥调用该activity的onnewintent()方法。

如果要启动的activity不在栈顶,则会重新创建该activity的实例

singletask

一般适用于主页面

如果要启动的activity已经存在于它想要归属的栈中,那么不会创建新实例,将栈中位于该activity上的所有的activity出栈,同事该activity的onnewintent方法会被调用

singleinstance

例如呼叫来电界面

要创建再一个新栈,然后创建该activity实例并压入新栈中,新栈中只会存在这一个activity实例

3、activity之前传递数据的方式intent是否有大笑限制,如果传递的数据量偏大,有哪些方案

有,最好不要超过512k

可以用本地存储,或者缓存等方案进行传递

4、显示启动和隐示启动

显示启动 直接再清单文件写好调用

隐示启动 在清单文件里通过intent-filter 进行name配置,调用时可改成name值进行启动

5、scheme使用场景,协议格式,如何使用

scheme是页面内跳转协议,可以自定义scheme协议

定义格式

使用Uri.parse("hr://test:8080/goods?goodsid=8888&name=test")

6、ANR的场景

Service TimeOut 未在规定时间执行完成,前台服务20S,后台200s

BroadCastQueue TimeOut 围在规定时间内处理完广播 前台广播10s,后台60s内

ContentProvider TimeOut publish 在10s内没有完成

Input Dispatching timeout 5s内未响应键盘出入,触摸屏幕等事件

Activity的生命周期回调阻塞并不会直接触发ANR,职不过死循环阻塞了主线程,如果系统有上述情况发生,就无法在相应的时间内处理从而触发ANR

7、oncreate和onsaveinstancestate回复数据时的区别

onrestoreintstancestate 不一定会被调用,因为它只有在上次activity被回收了才会调用

oncreate里的bundle参数可能为空,一定要做非空判断,而onrestoreintstancestate的bundle参数一定不会是空值

二、Service

1、service的生命周期,两种启动方式的区别

startService/bindService

如果服务已经开启,多次执行startService 不会重复执行oncreate,而是会调用onStart和onStartCommand

如果服务已经开启,多次执行bindService时,onCreate和onBind方法并不会被多次调用

startService 不会依赖于调用者,bindService 依赖于调用者

2、service于activity实现通信

通过Binder对象

Service继承Binder的内部类,并添加相应的逻辑方法

或通过BroadCast广播与activity通信

3、IntentService是什么,IntentService原理

IntentService是Service的子类,默认开启了一个工作线程HandlerThread,使用这个工作线程逐一处理所有启动请求,在任务执行完毕后会自动停止服务,只要实现一个方法onHandleIntent,该方法会接受每个启动求救的intent,能够执行后台工作和耗时操作。

三、BroadcastReceiver

1、广播的分类和使用场景

广播分为两个角色,发送着 和 接受着

广播接收器分为两种,静态注册和动态注册

静态通过清单文件的标签申明的BroadcastReceiver

动态通过AMS.registerReceiver的方式注册,动态注册更灵活,可在不需要时通过unregisterReceiver取消注册

根据发送形式分为

1、**普通广播:**通过Context.sendBroadcast发送,可并行处理

2、**系统广播:**管使用系统广播时,只需在注册广播接受着时定义相关的action即可,不需要手动发送广播例如:网络变化,锁屏,飞行模式等

3、**有序广播:**指的是发送出去的广播被BroadcastReceiver按照先后顺序进行接收,发送方式变为sendOrderedBroadcase(intent)。

4、**App应用内广播:**Android的广播可以跨进程通信

5、**粘性广播:**由于在5.0已经失效,不建议使用

四、ContentProvider

主要用来是应用间数据共享,提供统一的接口,例如通讯录,通话记录等

五、Handler

1、handler的实现原理

共分为 Handler、Message、MessageQueue和Looper

Handler负责消息的发送和处理

Message消息对象,相当于是实体

MessageQueue消息队列,用于存放消息对象的数据结构

Looper消息队列的处理者,用于轮询消息队列的消息对象

Handler发送消息时调用MessageQueue的enqueueMessage插入一条消息到MessageQueue,Looper不断轮询调用MessageQueue的next方法,如果发现message就调用handler的dispatchMessage,dispatchMEssage被成功调用,接着调用handlerMessage

2、子线程中能不能直接new一个Handler

不能,因为Handler的构造方法中,会通过Looper.myLooper()获取looper对象

3、Handler导致的内存泄露原因和解决方案

非静态内部类和匿名内部类都会隐式持有当前类的外部应用

当activity中使用handler,然后被销毁时还存在未处理或正在处理的消息,就会造成内存泄漏,

解决方式,1、将Handler的子类设置成静态内部类,使用WeakRererence弱引用持有Actiivty实例

2、当外部类结束生命周期时,清空Handler内部消息队列

4、HandlerThread时什么,好处,原理,使用场景

HandlerThread本质是一个线程类,他集成了Thread,有自己的内部Looper对象,通过Looper.loop进行循环,通过获取HandlerThread的looper对象传递给Handler对象,然后再handlerMessage方法中执行异步任务

优势

将loop运行在子线程中处理,减轻了主线程的压力,是主线程更流畅,有自己的消息对列不会干扰ui线程,串行执行,开启一个线程起到多个线程的作用

劣势

由于每一个任务队列逐步执行,一旦队列好事个过长,消息延时

对于io等操作,线程等待不能并发

5、idleHandler使用场景

闲时机制,不占用资源

相关推荐
阿巴斯甜18 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker18 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952719 小时前
Andorid Google 登录接入文档
android
黄林晴20 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_2 天前
Android 启动优化方案
android
阿巴斯甜2 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇2 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_2 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android