永恒的码流

万物皆流,无物常驻

0%

Android应用的性能优化是一个很大的课题,本文简单介绍性能优化各项指标、引起性能问题的场景以及解决方案。

简介

性能优化的内容主要体现在如下几个方面:

  • 流畅:启动速度、页面显示速度、响应速度
  • 稳定:ANR、崩溃
  • 节省:安装包大小、能耗、内存、网络
阅读全文 »

简介

Android中涉及线程操作的类或机制主要有:

  • Thread。线程操作的最基本的类。
  • ThreadPoolExecutor。基于线程池,处理并发多线程操作。
  • Handler机制:Handler、Looper、MessageQueue等。Android中多线程处理的基本机制。
  • HandlerThread。Thread的子类,维护了一个Looper,Handler机制的辅助类。
  • AsyncTask。基于Handler机制。
  • IntentService。基于Handler机制。

本文主要介绍Android中的Handler机制。

Handler机制

Handler 发消息到MessageQueue中,Looper 循环从MessageQueue中获取消息并消费(执行Handler的回调方法)。

以线程B向线程A发消息为例,从时间顺序上说明如下:

  • 在线程A中,创建Looper,通过sThreadLocal与当前绑定,启动Looper的消息循环,线程处于活跃状态;创建Handler,在Looper进行消息循环之前创建,Handler会与当前线程的Looper建立联系。
  • 在线程B中,使用上面的Handler发送消息。
  • 在线程A中,Looper循环消息获取消息,由于消息持有Handler引用,最终会执行Handler的回调方法。
阅读全文 »

Service

使用服务两种方式

  • 启动服务。外部通过调用startService()启动服务,后者回调方法 onStartCommand()。之后服务在后台无限期运行,直到调用stopSelf()stopService()停止。
  • 绑定服务。外部通过调用 bindService() 绑定服务,后者回调方法 onBind()。之后一直运行,直到取消绑定为止。

这两种方式可以同时使用,一般单独调用。

stopSelf() vs stopSelf(int startId) :前者立即停止服务;后者在最近的startId与参数相匹配时才停止,防止有任务未完成时而服务停止的情况。

阅读全文 »

概述

Fragment 表示应用界面中可重复使用的一部分,不能独立存在,而是必须由 Activity 或另一个 Fragment 托管。

模块化和可重用性:Fragment之间需要解耦,避免让一个 Fragment 依赖于另一个 Fragment 或从一个 Fragment 操控另一个 Fragment。

添加 Fragment 到 Activity 中的两种方法:

  • 直接在布局里定义fragment元素。
  • 在布局定义 fragment 容器,然后在代码中将 fragment 添加到容器中。推荐使用 AndroidX 的FragmentContainerView。此控件中也可以直接定义 Fragment 进行初始化。

Fragment 创建时处于 INITIALIZED 状态,之后需要添加到 FragmentManager 才能转移到下一个状态。Fragment 的状态转移由 FragmentManger 通过 FragmentTransaction 来管理。

阅读全文 »

Activity 生命周期

完整生命周期流程:

  1. 一般的流程:onCreate() → onStart() → onResume() → onPause() → onStop() → onDestory()
  2. 非正常销毁:onCreate() → onStart() → onResume() → onPause() → onCreate()
  3. 非正常销毁:onCreate() → onStart() → onResume() → onPause() → onStop() → onCreate()
  4. 可见的返回:onCreate() → onStart() → onResume() → onPause() → onResume()
  5. 不可见返回:onCreate() → onStart() → onResume() → onPause() → onStop() → onRestart() → onStart()
阅读全文 »

总结Android应用开发基础知识中的应用和Application类。

应用

Android 应用的生命周期由系统控制,包括三个阶段:启动、运行和结束。每个阶段会触发Application 对象中对应的回调方法。

应用的启动

通过Launcher启动App的流程:

  • Launcher进程请求SystemServer进程创建Activity。
  • SystemServer进程解析Intent等,并检查目标APP进程是否存在,不存在则去创建进程。
  • SystemServer进程通过Socket方式请求Zygote进程创建APP进程,返回进程号等信息。
  • App进程入口为ActivityThread.main()方法,执行此方法,初始化进程并请求SystemServer绑定App进程。绑定进程的工作包括,一,通知App进程去启动Application;二,通知APP进程去启动Activity。

总结:当用户点击应用图标的时候,系统会去检测进程是否存在,如果不存在,则通过Zygote创建进程,创建完进程后,则需要将进程与App进行绑定,将App的资源加载到内存中,当加载完毕,各种条件准备就绪,接下来就是启动Application和Activity了,如此,App的界面就展示出来了。

阅读全文 »