Android Service后台下载 广播(Eventbus)通知并展示
因为好多项目都会用到比如后台下载apk,下载图片,音视频,这个时候就需要我们用Service进行后台下载了,首先讲一下我的思路一个简单的service后台图片下载展示,我需要创建一个service并注册注意不要忘记注册 在service里面重写onCreate开启一个工作线程做耗时工作
@Overridepublic void onCreate() {// 开启一个工作线程做耗时工作HandlerThread thread = newHandlerThread("ServiceHandlerThread",Process.THREAD_PRIORITY_BACKGROUND);thread.start();// 获取工作线程的LoopermServiceLooper = thread.getLooper();// 创建工作线程的HandlermServiceHandler = new ServiceHandler(mServiceLooper);}
Process.THREAD_PRIORITY_BACKGROUND//作用是有时候,
我们会创建一个线程去操作一个比较耗时的任务时,
去设定线程的优先级。数值越大,那么优先级就越低
THREAD_PRIORITY_DEFAULT,默认的线程优先级,值为0。
THREAD_PRIORITY_LOWEST,最低的线程级别,值为19。
THREAD_PRIORITY_BACKGROUND 后台线程建议设置这个优先级,值为10。
THREAD_PRIORITY_FOREGROUND 用户正在交互的UI线程,代码中无法设置该优先级,系统会按照情况调整到该优先级,值为-2。
THREAD_PRIORITY_DISPLAY 也是与UI交互相关的优先级界别,但是要比THREAD_PRIORITY_FOREGROUND优先,代码中无法设置,由系统按照情况调整,值为-4。
THREAD_PRIORITY_URGENT_DISPLAY 显示线程的最高级别,用来处理绘制画面和检索输入事件,代码中无法设置成该优先级。值为-8。
THREAD_PRIORITY_AUDIO 声音线程的标准级别,代码中无法设置为该优先级,值为 -16。
THREAD_PRIORITY_URGENT_AUDIO 声音线程的最高级别,优先程度较THREAD_PRIORITY_AUDIO要高。代码中无法设置为该优先级。值为-19。
THREAD_PRIORITY_MORE_FAVORABLE 相对THREAD_PRIORITY_DEFAULT稍微优先,值为-1。
THREAD_PRIORITY_LESS_FAVORABLE 相对THREAD_PRIORITY_DEFAULT稍微落后一些,值为1。
接下来就是 创建一个ServiceHandler 用Picasso下载Bitmap文件
public static final String IMAGE = "iamge_url";public static final String RECEIVER_ACTION = "com.zhouwei.simpleservice";private static final String TAG = "DownloadService";public static final String ACTION_START_SERVICER = "com.zhouwei.startservice";public static final String ACTION_DOWNLOAD = "com.zhouwei.startdownload";private Looper mServiceLooper;private ServiceHandler mServiceHandler;private final class ServiceHandler extends Handler {public ServiceHandler(Looper looper){super(looper);}@Overridepublic void handleMessage(Message msg) {// 工作线程做耗时下载String url = (String) msg.obj;Bitmap bitmap = null;try {bitmap = Picasso.with(getApplicationContext()).load(url).get();/*Intent intent = new Intent();intent.putExtra("bitmap",bitmap);//intent.setAction(RECEIVER_ACTION);intent.putExtra("config","我叫王二小");// 通知显示// LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);intent.setComponent(new ComponentName("com.example.servicecast", "com.example.servicecast.MyBroadcastReceiver"));//参数为包名和类名,注意类名中要包括包名sendBroadcast(intent);*///EventBus传递因为intent传递bitmap不能超过40k所以用eventbus进行传递String name="我叫王二小";EventBus.getDefault().postSticky(new EvBean(name,bitmap));} catch (IOException e) {e.printStackTrace();}//工作完成之后,停止服务stopSelf();}}
有人会问为啥不用Broadcast呢因为intent传递bitmap时会出现他不能传递40k以上的bitmap文件
所以我选择用eventbus来传递
!! FAILED BINDER TRANSACTION !!! TransactionTooLargeException//这个错
这个时整个service类
/*** Copyright:why* Created by Baron on 2020/9/7 10:35 AM* Emaile:wanghongyuwh@163.com* Description:* Modify time:* Modified by:*/
public class DownloadService extends Service {public static final String IMAGE = "iamge_url";public static final String RECEIVER_ACTION = "com.zhouwei.simpleservice";private static final String TAG = "DownloadService";public static final String ACTION_START_SERVICER = "com.zhouwei.startservice";public static final String ACTION_DOWNLOAD = "com.zhouwei.startdownload";private Looper mServiceLooper;private ServiceHandler mServiceHandler;private final class ServiceHandler extends Handler {public ServiceHandler(Looper looper){super(looper);}@Overridepublic void handleMessage(Message msg) {// 工作线程做耗时下载String url = (String) msg.obj;Bitmap bitmap = null;try {bitmap = Picasso.with(getApplicationContext()).load(url).get();/*Intent intent = new Intent();intent.putExtra("bitmap",bitmap);//intent.setAction(RECEIVER_ACTION);intent.putExtra("config","我叫王二小");// 通知显示// LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);intent.setComponent(new ComponentName("com.example.servicecast", "com.example.servicecast.MyBroadcastReceiver"));//参数为包名和类名,注意类名中要包括包名sendBroadcast(intent);*///EventBus传递因为intent传递bitmap不能超过40k所以用eventbus进行传递String name="我叫王二小";EventBus.getDefault().postSticky(new EvBean(name,bitmap));} catch (IOException e) {e.printStackTrace();}//工作完成之后,停止服务stopSelf();}}@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {// 开启一个工作线程做耗时工作HandlerThread thread = new HandlerThread("ServiceHandlerThread",Process.THREAD_PRIORITY_BACKGROUND);thread.start();// 获取工作线程的LoopermServiceLooper = thread.getLooper();// 创建工作线程的HandlermServiceHandler = new ServiceHandler(mServiceLooper);}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.i(TAG,"call onStartCommand...");if(intent.getAction().equals(ACTION_DOWNLOAD)){handleCommand(intent);}else if(intent.getAction().equals(ACTION_START_SERVICER)){//do nothing}return START_STICKY;}private void handleCommand(Intent intent){String url = intent.getStringExtra(IMAGE);// 发送消息下载Message message = mServiceHandler.obtainMessage();message.obj = url;mServiceHandler.sendMessage(message);}
}
MainActivity
public class MainActivity extends AppCompatActivity {private ImageView mImageView1;private IntentFilter intentFilter;private MyBroadcastReceiver loadReceiver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mImageView1 = findViewById(R.id.mImageView);findViewById(R.id.loadimage).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {startDownload();}});}@Overrideprotected void onStart() {super.onStart();EventBus.getDefault().register(this);}//3.0以后这个方法自己随便写,不过要加@Subscribe这个注解@Subscribe(threadMode = ThreadMode.POSTING,sticky = true)//true 就是允许接收粘性事件public void onEvent(EvBean evBean){String name = evBean.getName();Bitmap bitmap = evBean.getBitmap();mImageView1.setImageBitmap(bitmap);Toast.makeText(this, bitmap+"", Toast.LENGTH_SHORT).show();}@Overrideprotected void onDestroy() {super.onDestroy();}private void startDownload() {Intent intent = new Intent(this,DownloadService.class);// 启动服务intent.putExtra(DownloadService.IMAGE,"http://ww4.sinaimg.cn/large/006uZZy8jw1faic21363tj30ci08ct96.jpg");intent.setAction(DownloadService.ACTION_DOWNLOAD);startService(intent);}}
依赖
implementation 'com.squareup.picasso:picasso:2.5.2'implementation 'org.greenrobot:eventbus:3.0.0'
对了不要忘记添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
还有创建一个xml文件配置
android:networkSecurityConfig="@xml/network_security_config"
<?xml version="1.0" encoding="utf-8"?>
<network-security-config><base-config cleartextTrafficPermitted="true" />
</network-security-config>
可能有些人不会EvenBus很简单
一个依赖
implementation 'org.greenrobot:eventbus:3.0.0'
一个bean类需要自己添加字段
public class EvBean {private String name;private Bitmap bitmap;public EvBean(String name,Bitmap bitmap) {this.name=name;this.bitmap=bitmap;}public Bitmap getBitmap() {return bitmap;}public void setBitmap(Bitmap bitmap) {this.bitmap = bitmap;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
发送的值时候
// 工作线程做耗时下载Bitmap bitmap = null;try {bitmap = Picasso.with(getApplicationContext()).load(url).get();String name="我叫王二小";EventBus.getDefault().postSticky(new EvBean(name,bitmap));} catch (IOException e) {e.printStackTrace();}
接受值的时候
@Overrideprotected void onStart() {super.onStart();EventBus.getDefault().register(this);}//3.0以后这个方法自己随便写,不过要加@Subscribe这个注解@Subscribe(threadMode = ThreadMode.POSTING,sticky = true)//true 就是允许接收粘性事件public void onEvent(EvBean evBean){String name = evBean.getName();Bitmap bitmap = evBean.getBitmap();mImageView1.setImageBitmap(bitmap);Toast.makeText(this, bitmap+"", Toast.LENGTH_SHORT).show();}
注意在页面销毁的时候一定要unregister
@Overrideprotected void onDestroy() {super.onDestroy();EventBus.getDefault().unregister(this);}
参考https://blog.csdn.net/qq_34115898/article/details/83347882
效果图奉上
Android Service后台下载 广播(Eventbus)通知并展示相关推荐
- 图形引擎实战:手游Android端后台下载技术分享
一.功能特点 手游android端后台下载SDK是畅游自主研发的一款移动平台android端后台文件下载工具包,它主要提供网络文件的后台下载功能,功能完善,性能高,可以满足游戏制作有关后台下载文件的需 ...
- Android SERVICE后台服务进程的自启动和保持
Service组件在android开发中经常遇到,其经常作为后台服务,需要始终保持运行,负责处理一些必要(见不得人)的任务.而一些安全软件,如360等,会有结束进程的功能,如果不做Service的保持 ...
- Android SERVICE后台服务进程的守护
Service组件在android开发中经常遇到,其经常作为后台服务,需要始终保持运行,负责处理一些必要(见不得人)的任务.而一些安全软件,如360等,会有结束进程的功能,如果不做Service的保持 ...
- Android实现多线程下载并显示通知
1.前言 相信大家都使用过一些可以下载文件的 App,在下载列表中通常都会显示一个进度条实时地更新下载进度,现在的下载都是断点重传的,也就是在暂停后,重新下载会依照之前进度接着下载. 我们这个下载的案 ...
- Android service后台执行定时任务
Android 的定时任务 1,Java的API提供的Timer类 Android 中使用容易受手机的休眠系统影响(例如:手机休眠,导致了这个功能的停止). 2,Android的Alarm机制 Ala ...
- Android Service全屏广播
场景 产品需要一个全屏广播,不管用户在那个界面每隔一段时间都会弹出一个滚动的文字,而且这个不是用推送来做的,后台返回一组数据,然后客户端自己进行处理!如果有更好的方法或者建议都可以跟我说一下,万分感谢 ...
- Android Service后台多线程压缩并提交图片及数据
手机端发帖,多张图片上传是个问题.最近重构项目代码,正好碰到这个,这里把解决的方案整理,以备后用. 方案原理: 创建上传任务表, 帖子内容发布的时候将数据存放到任务表中,并传递数据到service中. ...
- Android Service下载文件并自定义通知提示下载
最近要做一个更新sdk,里面用到了service后台下载,自定义通知提示下载进度,下面直接贴上代码. 下面是UpdateUtils.java ,告诉你如何使用 package com.cnziz.up ...
- android 通知栏进度_Android改造下载图片进度通知
android 通知栏进度 In this tutorial, we'll be using the Retrofit library in order to download an image fr ...
最新文章
- poj 1269 计算几何
- 【Android OpenGL ES 开发 (四)】纹理相关(一)
- php持久对象,php-在理论中具有两个外来身份的持久对象
- tf入门-池化函数 tf.nn.max_pool 的介绍
- 【HAOI2009】【毛毛虫】【树形dp】
- word表格分开快捷键_Word使用技巧(表格技巧、快捷键)
- 04-Python函数和模块
- Word分栏在排版中的应用
- Chrome忽略网站证书错误
- 泪目了,一位轮椅上的清华博士师兄
- JustinMind
- python多张图片生成ppt_天呐,还能这么玩!用 Python 生成动态 PPT
- eclipse配置环境变量
- 什么是CTS、CLS、CLR
- JavaScript基础思维导图
- RibbonControl
- 公司网站如何让用户使用QQ第三方登录
- Cacti-安装和使用详解
- 李小璐晒全家福 贾乃亮赤膊女儿可爱(图)
- VMware15.5没有Mac OS选项 unlocker解锁失败 Get vmware tool 卡住(已解决)
热门文章
- Gradient Transfer Optimization Model:基于梯度转移优化模型的红外与可见光图像融合
- python佛祖镇楼 BUG辟邪 永不怠机
- 由明星道德绑架引发的危机公关处理策略分析
- Cisco(思科)VLAN的配置(详细)
- Linux下plink软件使用方法,#软件工具#解密GWAS的利器--Plink 使用解析
- Ubuntu 出现结构需要清理 (structure needs cleaning)
- 论文字体楷体_GB2312显示错误
- AndroidP 增加蓝牙遥控器对应的kl文件 --hisi平台
- 【论文译文】StyleGAN
- 关于Python中输入的问题