Android 开发集合JetPack

一:前提
自从Google IO 17开始,官方开始管理这个混乱的Android 开发环境,推出 Architecture Component,包括了大家一直期待的O(R)M库 Room,和生命周期管理工具ViewModel/LiveData。
Google IO 18 更是加大力度,将Support lib改名Android X重新开始,并且将所有Google 认为是正确的Practice 集中在一起,帮助开发者来简单,高效地进行Android开发。而这所有的东西现在,统称 JetPack。
二:JetPack是什么
JetPack是Google推出的一套系列组件集
JetPack的出现以及Google 标准化开发模式的确定,代表了Android 原生开发的未来方向,意味着Android 发展已经逐步成熟
image.png
三:Jetpact四大模块之基础(Foundation)
提供了最基础的底层功能,如向后兼容性,测试,开发语言Kolin支持等
image.png
1.Kotlin 语言是Android官方开发语言 ,Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,被称之为 Android 世界的Swift,由 JetBrains 设计开发并开源。
2.AppCompat
依赖:

implementation 'androidx.appcompat:appcompat:1.2.0'

image.png
集成一些Android的基础的控件
package androidx.appcompat.app(AppCompatActivity)
androidx.appcompat.content.res
androidx.appcompat.graphics.drawable
androidx.appcompat.view(ContextThemeWrapper)
androidx.appcompat.widget
3.Benchmark测试(没用过)
翻译成中文就是基准、用基准问题测试的意思,Jetpack基准库可以从AS中快速对基于Kotlin或Java的代码进行基准化分析,该库会处理CPU预热,衡量代码性能,并输出基准化分析结果到AS控制台,可以完成功能的测试与代码性能分析。目前很多项目都引入了Benchmark,用来作为评估程序性能的手段,比如跑分。

dependencies {
        androidTestImplementation "androidx.benchmark:benchmark-junit4:1.0.0-alpha04"
    }

4.Multidex(dex分包)
Android 应用 (APK) 文件包含 Dalvik Executable (DEX) 文件形式的可执行字节码文件,其中包含用来运行您的应用的已编译代码。Dalvik Executable 规范将可在单个 DEX 文件内可引用的方法总数限制在 65,536,其中包括 Android 框架方法、库方法以及您自己代码中的方法。在计算机科学领域内,术语千(简称 K)表示 1024(或 2^10)。由于 65,536 等于 64 X 1024,因此这一限制也称为“64K 引用限制”
简单使用

// 1. Gralde 配置
android {
    defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 29
        multiDexEnabled true
    }
    ...
}

dependencies {
     implementation 'androidx.multidex:multidex:2.0.1'
}

// 2. 清单配置
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application
            android:name="com.xxx.MyApplication" >
        ...
    </application>
</manifest>

// 3. Application初始化
public class MyApplication extends SomeOtherApplication {
  @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }
}

5.Security(没用过)
Jetpack Security (JetSec)加密库为 Files 和 SharedPreferences 对象的加密操作提供了抽象支持。该库使用了安全且运用广泛的密码学原语 (cryptographic primitives),强化了AndroidKeyStore的使用。使用 EncryptedFile 和 EncryptedSharedPreferences 可以让您在本地保护可能包含敏感数据、API 密钥、OAuth 令牌和其他类型机密信息的文件
6.Android JUnit单元测试(暂时没用过)

  testImplementation 'junit:junit:4.13'
    androidTestImplementation 'androidx.test:runner:1.3.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

四:Jetpact四大模块之架构(Architecture)

  • Data Binding(数据绑定):属于支持库可使用声明式将布局中的界面组件绑定到应用中的数据源
  • Lifecycles:管理 Activity 和 Fragment 生命周期
  • LiveData:是一个可观察的数据持有者类。与常规observable不同,LiveData是有生命周期感知的。
  • Navigation:处理应用内导航所需的一切
  • Paging:一次加载 or 按需加载 & 显示小块数据
  • Room:帮助开发者更友好、流畅的访问SQLite数据库。
  • ViewModel:以生命周期感知的方式存储和管理与UI相关的数据。
  • WorkManager:调度预期将要运行的可延迟异步任务。(即便应用程序退出 or重启)
    Google 官方推荐的应用架构
    image.png
    1.Data Binding(数据绑定)(待研究)
    image.png
    第一步:我们要在build.gradle中声明使用DataBinding
android {
    dataBinding {
        enabled = true
    }
}

如果使用的是Kotlin的话还需要添加下面代码:

apply plugin: 'kotlin-kapt'

kapt {
    generateStubs = true
}

第二步:Layout文件改写
其实也很简单,就是在原有的 Layout 文件外再套上一层 <layout></layout> 标签

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <EditText
            android:id="@+id/userName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:hint="请输入用户名"
            android:textSize="14sp" />

        <Button
            android:id="@+id/submit"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="30dp"
            android:text="提交" />

        <TextView
            android:id="@+id/result"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:textSize="14sp" />
    </LinearLayout>
</layout>

第三步:Activity使用

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.result.setText("hello, world");

这是一个简单的使用,具体使用待研究
2.Lifecycles Activity声明周期的类
生命周期感知组件执行操作以响应另一个组件(例如Activity和Fragment)的生命周期状态的更改。这些组件可帮助您生成更易于组织且通常更轻量级的代码,这些代码更易于维护。
3.LiveData(待研究)
LiveData采用了观察者模式设计,其中LiveData是被观察者,当数据发生变化时会通知观察者进行数据更新。通过这点,可以确保数据和界面的实时性。
4.Navigation
用于在 Android 应用中的“目标”之间导航,该框架提供一致的 API,无论目标是作为 Fragment、Activity 还是其他组件实现。
5.Paging
paging会自动请求数据,这也就是分页请求的效果.paging的目的就是实现分页加载,之前我们都是自己实现分页,这次是Google爸爸为我们实现。不得不说,jetpack真香!
6.Room(之前有写过一期)
请查看:https://segmentfault.com/a/11...
Room持久库提供了一个SQLite抽象层,让你访问数据库更加稳如狗,提示数据库性能。
7.ViewModel
image.png
ViewModel的生命周期会比创建它的Activity、Fragment的生命周期都要长。即ViewModel中的数据会一直存活在Activity/Fragment中
View Model的使用
第一步:添加依赖:

dependencies {
    implementation "androidx.lifecycle:lifecycle-viewmodel:2.2.0"
}

第二步:写一个继承自ViewModel的类
前面提到,ViewModel最重要的作用是将视图与数据分离,并独立于Activity的重建,为了验证这一点。我们在ViewModel中创建一个计时器Timer,每隔1s,通知接口通知它的调用者。代码如下

public class TimerViewModel extends ViewModel {
    private Timer timer;
    private  int currentSecond;
    @Override
    protected void onCleared() {
        super.onCleared();
        //清理资源
        timer.cancel();
    }

    //开始计时
    public  void startTiming(){
        if(timer == null){
            currentSecond = 0;
            timer = new Timer();
            TimerTask timerTask = new TimerTask() {
                @Override
                public void run() {
                    currentSecond++;
                    if(onTimeChangeListener != null){
                        onTimeChangeListener.onTimeChanged(currentSecond);
                    }
                }
            };
            timer.schedule(timerTask,1000,1000);
        }
    }
    private  OnTimeChangeListener onTimeChangeListener;

    public void setOnTimeChangeListener(OnTimeChangeListener onTimeChangeListener) {
        this.onTimeChangeListener = onTimeChangeListener;
    }

    public  interface  OnTimeChangeListener{
        void onTimeChanged(int second);
    }

}

第三步:编写TimerActivity

public class TimerActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_timer);
        iniComponent();
    }

    private void iniComponent() {
        final TextView textView = findViewById(R.id.textview);
        TimerViewModel timerViewModel =  new ViewModelProvider(this).get(TimerViewModel.class);//实例化ViewModel
        timerViewModel.setOnTimeChangeListener(new TimerViewModel.OnTimeChangeListener() {
            @Override
            public void onTimeChanged(final int second) {
                //更新UI
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText("TIME:"+second);
                    }
                });
            }
        });
        timerViewModel.startTiming();
    }
}

8.WorkManager(单讲一期)
WorkManager 负责用来管理后台任务,它和一个异步任务,还有一个第三方的库(jobqueue)类似WorkManager
五:Jetpact四大模块之行为(Behavior)
帮助应用与标准的 Android 服务(如通知、权限、分享和 Google 助理)相集成。包含组件库:

  • 相机 - CameraX:简化相机应用的开发工作,可向后兼容至 Android 5.0(API 级别 21)
  • 下载 - DownloadManager:可处理长时间运行的HTTP下载 & 超时重连
  • 多媒体 - Media & playback:用于媒体播放 & 路由的向后兼容 API。
  • 通知 - Notifications:提供向后兼容的通知 API,支持 Wear 和 Auto。
  • 权限 - Permissions:用于检查和请求应用权限的兼容性 API。
  • 偏好设置 - Preferences:提供了能够改变应用的功能和行为能力。
  • 共享 - Sharing:提供适合应用操作栏的共享操作。
  • 切片 - Slices:创建可在应用外部显示应用数据的灵活界面元素。
    1.Camerax
    在 Android 应用中要实现 Camera 功能还是比较困难的,为了保证在各品牌手机设备上的兼容性、响应速度等体验细节,Camera 应用的开发者往往需要花很大的时间和精力进行测试,甚至需要手动在数百种不同设备上进行测试。CameraX 正是为解决这个痛点而诞生的
    2.DownloadManager
    DownloadManger是android 2.3(API 9)开始提供的系统服务,用于处理长时间的下载操作。应用场景是客户端请求一个URL地址去下载一个目标文件。DownloadManger可以构建一个后台下载服务,在发生故障或连接更改、重新启动系统等情况后,处理HTTP连接并重试下载
    3.Slices
    Slice其实是一个UI展示模块,它可以在搜索APP、语音助手、关键字识别等动作中动态地显示你的APP部分模块的内容,通过它,可以丰富地显示你的APP当中的内容

六:Jetpact四大模块之界面(UI)

  • 动画 - Animation & Transitions:提供各类内置动画,也可以自定义动画效果。
  • 表情 - Emoji:使用户在未更新系统版本的情况下也可以使用表情符号。
  • 布局 - Layout:xml书写的界面布局或者使用Compose完成的界面。
  • 调试板 - Palette:从调色板中提取出有用的信息。

结尾:怎么把知识装入大脑?


Rocky_ruan
57 声望5 粉丝

不积跬步,无以至千里