冷启动白屏分析

介绍下Android应用程序启动过程
1)Launcher通过Binder进程间通信机制通知ActivityManagerService,它要启动一个Activity;
2)ActivityManagerService通过Binder进程间通信机制通知Launcher进入Paused状态;
3)Launcher通过Binder进程间通信机制通知ActivityManagerService,它已经准备就绪进入Paused状态,于是ActivityManagerService就创建一个新的进程,用来启动一个ActivityThread实例,即将要启动的Activity就是在这个ActivityThread实例中运行;
4)ActivityThread通过Binder进程间通信机制将一个ApplicationThread类型的Binder对象传递给ActivityManagerService,以便以后ActivityManagerService能够通过这个Binder对象和它进行通信;
5)ActivityManagerService通过Binder进程间通信机制通知ActivityThread,现在一切准备就绪,它可以真正执行Activity的启动操作了。

Activity的启动模式以及使用场景
1/ standrd:标准模式,每次启动都会重新创建一个activity实例加入到任务栈中,不会考虑是不是有此实例存在,不会复用,消耗内存资源

2/ SingleTop:栈顶复用,如果处于栈顶,则生命周期不走onCreate()和onStart(),会调用onNewIntent(),适合推送消息详情页,比如新闻推送详情Activity;只检测任务栈栈顶,只有在栈顶的Activity不会被创建,就算是在第二位也是会被创建

3/SingleTask:栈内复用,如果存在栈内,则在其上所有Activity全部出栈,使得其位于栈顶,生命周期和SingleTop一样,app首页基本是用这个

4/ SingleInstance:这个是SingleTask加强本,系统会为要启动的Activity单独开一个栈,这个栈里只有它,适用新开Activity和app能独立开的,如系统闹钟,微信的视频聊天界面,使用微信调起自己的客户端某个页面,不做任何处理的情况下,按下回退或者当前Activity.finish(),页面不会停留在自己的客户端而是返回到微信的客户端页面

使用:(1) manifest设置,(2) startActivity flag

栈和队列的区别?
(1) 队列先进先出,栈先进后出
(2) 对插入和删除操作的"限定"。
栈是限定只能在表的一端进行插入和删除操作的线性表。
队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。
(3)遍历数据速度不同。栈只能从头部取数据,也就最先放入的需要遍历整个栈最后才能取出来,而且在遍历数据的时候还得为数据开辟临时空间,保持数据在遍历前的一致性。队列则不同,它基于地址指针进行遍历,而且可以从头或尾部开始遍历,但不能同时遍历,无需开辟临时空间,因为在遍历的过程中不影像数据结构,速度要快的多

Broadcast 内部实现机制?
1)自定义广播接受者Broadcast Receiver,并复写onRecvice方法
2)通过Binder机制像AMS进行注册
3)广播发送者通过Binder机制像AMS发送广播
4)AMS查找符合相应条件(IntentFilter/Permission等)的Broadcast Receiver,将广播发送到Broadcast Receiver相应的消息队列循环当中去(一般是Activity中)
5)消息循环拿到此广播,回调Broadcast Receiver中的onReceive方法、

两种注册方式的不同?
动态注册不是常驻型广播,也就是说广播跟随程序的生命周期。
静态注册是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

android:enabled: 定义系统是否能够实例化这个广播接收器
android:exported: 用于指示该广播接收器是否能够接收来自应用程序外部的消息

HttpConnection 与HttpURLConnection的区别?
在Android 2.2版本之前,HttpClient拥有较少的bug,因此使用它是最好的选择
2.3之后使用HttpURLConnection,它的API简单,体积较小,压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用,利于维护与优化

HTTP 和 HTTPS 的不同之处
1、开头不同https:// 与http://
2、HTTP 是不安全的,而 HTTPS 是安全的,HTTPS 在 HTTP 应用层的基础上使用安全套接字层作为子层
3、HTTP 标准端口是 80 ,而 HTTPS 的标准端口是 443
4、在 OSI 网络模型中,HTTP 工作于应用层,而 HTTPS 工作在传输层
5、HTTP 无需加密,而 HTTPS 对传输的数据进行加密
6、HTTP 无需证书,而 HTTPS 需要认证证书

HTTP 和 HTTPS 的相同点
而 HTTPS 和 HTTP 唯一不同的只是一个协议头(https)的说明,其他都是一样的,换句话说,HTTPS 跟 HTTP 一样,只不过增加了 SSL。

什么时候该使用 HTTPS?
银行网站、支付网关、购物网站、登录页、电子邮件以及一些企业部门的网站应该使用 HTTPS
如果某个网站要求你填写信用卡信息,首先你要检查该网页是否使用 https 加密连接

进程优先级?
前台进程 (Foreground process)、可见进程 (Visible process)、服务进程 (Service process)、后台进程 (Background process)、空进程 (Empty process)

前台进程:
1、拥有用户正在交互的 Activity(已调用 onResume())
2、拥有正在“前台”运行的 Service(服务已调用 startForeground())
3、拥有正在“前台”运行的 Service(服务已调用 startForeground())

可见进程:
1、拥有不在前台、但仍对用户可见的 Activity(已调用 onPause())
2、拥有绑定到可见(或前台)Activity 的 Service

服务进程:
正在运行 startService() 方法启动的服务,且不属于上述两个更高类别进程的进程。

后台进程:对用户不可见的 Activity 的进程(已调用 Activity的onStop() 方法)
空进程 :不含任何活动应用组件的进程

Android 中对于内存的回收,主要依靠 Lowmemorykiller 来完成,是一种根据 OOM_ADJ 阈值级别触发相应力度的内存回收的机制。

进程保活?
1、提供进程优先级,降低进程被杀死的概率
2、在进程被杀死后,进行拉活

进程优先级的方式:
1、利用 Activity 提升权限:监控手机锁屏解锁事件,在屏幕锁屏时启动1个像素的 Activity,在用户解锁时将 Activity 销毁掉。注意该 Activity 需设计成用户无感知,通过该方案,可以使进程的优先级在屏幕锁屏时间由4提升为最高优先级1。本方案主要解决第三方应用及系统管理工具在检测到锁屏事件后一段时间(一般为5分钟以内)内会杀死后台进程,已达到省电的目的问题。
实现方式:通过windon设置windonparmeas 是指 Activity 的大小为1像素;引用主题 Activity 为透明;通过广播监听锁屏开启来控制activity的控制与销毁

2、利用 Notification 提升权限
方案设计思想:Android 中 Service 的优先级为4,通过 setForeground 接口可以将后台 Service 设置为前台 Service,使进程的优先级由4提升为2,从而使进程的优先级仅仅低于用户当前正在交互的进程,与可见进程优先级一致,使进程被杀死的概率大大降低。

方案实现挑战:从 Android2.3 开始调用 setForeground 将后台 Service 设置为前台 Service 时,必须在系统的通知栏发送一条通知,也就是前台 Service 与一条可见的通知时绑定在一起的。对于不需要常驻通知栏的应用来说,该方案虽好,但却是用户感知的,无法直接使用。

方案挑战应对措施:通过实现一个内部 Service,在 LiveService 和其内部 Service 中同时发送具有相同 ID 的 Notification,然后将内部 Service 结束掉。随着内部 Service 的结束,Notification 将会消失,但系统优先级依然保持为2。

进程被杀死后,进行拉活:

1、利用系统广播拉活
方案

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值