相关文章
【重生之我在学Android原生】ContentProvider(Java)
【重生之我在学Android原生】Media3
【重生之我在学Android】WorkManager (章一)
前言
官方文档
官方推荐 - 前台服务、后台服务都可以使用WorkManger来实现
案例
语言:JAVA
实现要求
一步步实现一个图片压缩APP
创建项目
添加WorkManager依赖
参考文章
添加到builder.gradle, sync一下
val workVersion = "2.9.0"
implementation("androidx.work:work-runtime:$workVersion")
接收share来的图片数据
要实现这种效果,需要在AndroidManifest.xml声明标签,过滤intent
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
将Activity改为singleTop
运行APP。打开手机相册,分享一张图片,会重新使用这个Activity
android:launchMode="singleTop"
在onNewIntent接收数据
定义Worker
你需要做什么事情,你就定义一个Worker,指派它做事,做什么事,就在dowork里定义
dowork有三个返回,见图
传入Uri到Worker
参考这里
通过inputdata传入
Uri -> Bitmap
若有爆红位置
压缩图片直到图片的大小不超过XKB
传入图片的大小阀值
不断循环压缩,一直到图片的大小不超过20KB
生成文件
返回图片地址数据
构建Data,传值回去
监听Worker结果
在获取到WorkManager这个实例后
通过getWorkInfoByIdLiveData方法来监听workerrequest状态及结果返回
显示结果
在布局中,加入一张图片
Android版本 兼容问题
兼容低版本的Android系统
inputStream.readAllBytes() 需要在API 33之后使用
所以需要更改写法,来使低版本的Android系统使用
bytes = new byte[inputStream.available()];
inputStream.read(bytes);
运行项目
完整代码
// ImageCompressionWorker
package com.test.imagecompressionworkerapplication;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.work.Data;
import androidx.work.Worker;
import androidx.work.WorkerParameters;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.