做为一个嵌入式软件开发程序员,这是我第 3 次接触 Android APP 的开发。
- 第 1 次:多年前,前 Andorid 程序员离职,其负责的 Android APP 已完成,并已实际投入使用,但后续需要我来维护和更新;
- 第 2 次:时隔多年后,领导需要一个一个 Android APP Demo,演示 Andoird APP 同时拍照、录像、识别二维码,当时使用 Andoird 官网上二维码识别库和例程,组合为一个基本可用的 Demo;
- 这一次:需要基于泰凌微的 TelinkBleMesh Android APP,实现自己的基于泰凌微处理器产品的 Android APP;
之前因为没有系统的学习和实践过 Android APP 的开发 ,每次都是懵懵懂懂,跌跌撞撞,这次也不例外。以下内容没什么特别,权当记录。如有错误,请指正。
-
TelinkBleMesh Android APP 基于 TelinkBleMeshLib 开发,TelinkBleMeshLib 是一个 Telink 自定义的 Andoird 库。
这让我想到:如何自定义 Andoird 库并调用?
参考:
学习 Android(十三)JAR 和 AAR -
Android 应用构建的关键配置文件:build.gradle
参考:
Gradle 神奇之旅:深度解析 build.gradle 文件,你离构建大师只差这一篇!
Android build.gradle 配置详解 -
Android 应用的全局配置文件:AndroidManifest.xml
参考:
AndroidManifest.xml 深度解析
AndroidManifest.xml 最全详解 -
Android 四大组件(其子类)都必须在 AndroidManifest.xml 文件中注册,那什么是 Android 四大组件。
参考:
Android组件必知:四大组件全解析 -
由 Activity 想到 Fragment,什么是 Fragment,它需要在 AndroidManifest.xml 文件中注册吗?
首先明确,Fragment 与 Activity 不同,它不是 Android 的四大组件之一,因此不需要在 AndroidManifest.xml 文件中进行注册。
Fragment 必须依附于 Activity 才能存在,它有自己的生命周期,但其生命周期完全受宿主 Activity 控制。 参考:
Android开发-Fragment
Android Developers > Design & Plan > App architecture > Fragment -
除了 MainActivity.java,还有个 TelinkMeshApplication.java 最终继承了 Application,这两个文件中的类的实例,谁先执行?嵌入式开发的入口是 main() 函数,那 Android APP 开发,入口在哪里?
Application 是一个全局的上下文对象,整个应用程序只有一个实例。它在整个应用程序的生命周期内一直存在,从应用程序启动到应用程序关闭。可以在这个类中进行一些初始化操作,这些操作对所有的Activity、Service等组件都有效。
当应用程序第一次启动时,系统会先创建Application类的实例,然后才会开始处理任何的Activity。因此,在Application的构造函数或者onCreate()方法中执行的操作会在任何Activity之前发生。
从整个程序的生命周期看,Application 类的 onCreate() 方法是 Android APP 的入口。
从界面的启动顺序看,MainActivity.java 中的 class MainActivity 是第一个 activity,activity_main.xml 是其第一个界面。
参考:
对Android中Application的理解
Android中继承Activity、Application和AppCompatActivity的区别 -
MainActivity 最终继承了 AppCompatActivity,有时看到其它 APP 继承的是 ComponentActivity,它们有什么不同,选择哪一个?
参考:
Android 中的 Activity 类解析:从基础到兼容性
Android Activity 继承体系梳理 -
extends 和 implements 关键字在 Android 开发中随处可见,它们有什么不同?实现抽象类的子类,用哪个关键字?
比如:
public class TelinkMeshApplication extends MeshApplication
public abstract class MeshApplication extends Application implements EventHandler
简单说,extends 用于继承父类或者用于实现抽象类,implements 用于实现接口。
抽象类的抽象方法需要子类实现,子类是通过继承抽象类并使用 @Override 来实现抽象方法,所以使用的关键子是 extends,不是 implements。
参考:
Android:JAVA 语言 extends 和 implements 用法的学习
JAVA快速入门手册——抽象类和抽象方法
Java 抽象类与抽象方法:从零到精通
别再混淆!Java抽象类与接口的终极对比(语法+设计+Java 8+新特性) -
C 语言中有 static 和 const 关键字,java 中有 static 和 final 关键字,一个人同时学习多门编程语言,开始最容易记忆混乱!
参考:
Java 中 final 与 static 的区别 -
Application 继承类的第一行代码就是 super.onCreate(),那什么是 super,以及相关的另一个关键字 this,又是什么
参考:
【Java面试题】——this 和 super 的区别
Java中super与this的深入解析 -
Android 开发中的 Handle,Thread, HandleThread
Application 继承类中 onCreate() 里有这样一段代码:private Handler mOfflineCheckHandler; HandlerThread offlineCheckThread = new HandlerThread("offline check thread"); offlineCheckThread.start(); mOfflineCheckHandler = new Handler(offlineCheckThread.getLooper());这是创建了一个设备在线检测的线程,那它和 Thread 创建线程有什么区别?
参考:
深入理解Handler、Thread与HandlerThread:Android开发中的关键概念
Thread、Handler和HandlerThread关系何在?
Android 面试(五):探索 Android 的 Handler
Android中正确使用Handler的姿势 -
java 类的实例化:new 与 getInstance() 方法
Application 继承类中有这样一个函数:public static TelinkMeshApplication getInstance() { return this; }这是获取类的实例,这让我想起类的实例化 new,那它们有什么不同呢?
new 关键字用于实例化一个类的新对象。每次调用 new 都会创建一个新的对象实例。
getInstance() 方法通常用于实现单例模式(Singleton Pattern)。单例模式确保一个类只有一个实例,并提供一个全局访问点来获取该实例。
参考:java实例化的4种方式 -
Android APP 判断应用是否在前台
Application 继承类中 onCreate() 里有对 registerActivityLifecycleCallbacks 的使用,源码中使用这个函数来实现应用是否在前台的判断。
参考:
Android – ActivityLifecycleCallbacks应用的生命周期集中管理
Android 如何判断应用是否在前台 -
什么是 SharedPreferences,有什么用?
Application 继承类中 onCreate() 里有这样一行代码:MeshLogger.enableRecord(SharedPreferenceHelper.isLogEnable(this));MeshLogger 是 Telink 自定义的一个日志类,SharedPreferenceHelper 也是 Telink 自定义的一个工具类,里面使用的主要类是 SharedPreferences。
参考:
Android 数据持久化(SharedPreferences)
使用 SharedPreferences 保存简单数据
SharedPreferences 工具类之 SharedPreferencesHelper -
什么是 UncaughtExceptionHandler,有什么用?
Application 继承类中 onCreate() 里有这样一行代码:AppCrashHandler.init(this);AppCrashHandler 是 Telink 自定义的一个类,实现了 UncaughtExceptionHandler 接口,用来捕获未处理的异常。 参考:
Android UncaughtExceptionHandler 解决未捕获异常,防止软件报”停止运行“
崩溃日志——UncaughtExceptionHandler -
什么是 FileProvider,有什么用?
TelinkFileProvider.java 文件中自定义了 TelinkFileProvider 类,继承了 FileProvider。
参考:
Android FileProvider的基本使用
Android FileProvider 应用
Content Provider 与 File Provider -
在应用程序的 build.gradle (模块级) 配置中有这样一行代码:apply plugin: ‘io.objectbox’,说明项目使用了 objectbox 数据库。
参考:
新手区 如何在 Android 中使用 ObjectBox 数据库框架?
ObjectBox数据库使用说明
Android数据库ObjectBox使用说明 -
TelinkBleMeshLib 中 com.telink.ble.mesh.foundation.event 下自定义了很多的事件,都是自定义抽象类 Event 的实现。而 Event 又是接口 Parcelable 的实现,Parcelable 是什么?
参考:
java进阶篇07、序列化–Serializable、Parcelable和Json
Android为什么不使用Serializable,而是另辟蹊径Parcelable?
Serializable 都这么牛逼了,Parcelable,我还要你何用? -
其它:
在 java 语言中,类里的方法调用,不需要被调用的方法一定要书写在调用之前,这和 C 语言必须有先后书写(或声明)是不一样的。
在Java 语言中,可以有方法名相同但参数不同的多个方法,这种现象称为方法重载(Method Overloading)。通过方法重载,可以在一个类中定义多个功能相似但处理不同数据类型或数量的方法。当调用这些方法时,Java 根据传递给方法的参数类型和数量来决定调用哪个具体的方法。这和 C 语言不能有同名函数是不一样的。







