因为好多项目都会用到比如后台下载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)通知并展示相关推荐

  1. 图形引擎实战:手游Android端后台下载技术分享

    一.功能特点 手游android端后台下载SDK是畅游自主研发的一款移动平台android端后台文件下载工具包,它主要提供网络文件的后台下载功能,功能完善,性能高,可以满足游戏制作有关后台下载文件的需 ...

  2. Android SERVICE后台服务进程的自启动和保持

    Service组件在android开发中经常遇到,其经常作为后台服务,需要始终保持运行,负责处理一些必要(见不得人)的任务.而一些安全软件,如360等,会有结束进程的功能,如果不做Service的保持 ...

  3. Android SERVICE后台服务进程的守护

    Service组件在android开发中经常遇到,其经常作为后台服务,需要始终保持运行,负责处理一些必要(见不得人)的任务.而一些安全软件,如360等,会有结束进程的功能,如果不做Service的保持 ...

  4. Android实现多线程下载并显示通知

    1.前言 相信大家都使用过一些可以下载文件的 App,在下载列表中通常都会显示一个进度条实时地更新下载进度,现在的下载都是断点重传的,也就是在暂停后,重新下载会依照之前进度接着下载. 我们这个下载的案 ...

  5. Android service后台执行定时任务

    Android 的定时任务 1,Java的API提供的Timer类 Android 中使用容易受手机的休眠系统影响(例如:手机休眠,导致了这个功能的停止). 2,Android的Alarm机制 Ala ...

  6. Android Service全屏广播

    场景 产品需要一个全屏广播,不管用户在那个界面每隔一段时间都会弹出一个滚动的文字,而且这个不是用推送来做的,后台返回一组数据,然后客户端自己进行处理!如果有更好的方法或者建议都可以跟我说一下,万分感谢 ...

  7. Android Service后台多线程压缩并提交图片及数据

    手机端发帖,多张图片上传是个问题.最近重构项目代码,正好碰到这个,这里把解决的方案整理,以备后用. 方案原理: 创建上传任务表, 帖子内容发布的时候将数据存放到任务表中,并传递数据到service中. ...

  8. Android Service下载文件并自定义通知提示下载

    最近要做一个更新sdk,里面用到了service后台下载,自定义通知提示下载进度,下面直接贴上代码. 下面是UpdateUtils.java ,告诉你如何使用 package com.cnziz.up ...

  9. android 通知栏进度_Android改造下载图片进度通知

    android 通知栏进度 In this tutorial, we'll be using the Retrofit library in order to download an image fr ...

最新文章

  1. poj 1269 计算几何
  2. 【Android OpenGL ES 开发 (四)】纹理相关(一)
  3. php持久对象,php-在理论中具有两个外来身份的持久对象
  4. tf入门-池化函数 tf.nn.max_pool 的介绍
  5. 【HAOI2009】【毛毛虫】【树形dp】
  6. word表格分开快捷键_Word使用技巧(表格技巧、快捷键)
  7. 04-Python函数和模块
  8. Word分栏在排版中的应用
  9. Chrome忽略网站证书错误
  10. 泪目了,一位轮椅上的清华博士师兄
  11. JustinMind
  12. python多张图片生成ppt_天呐,还能这么玩!用 Python 生成动态 PPT
  13. eclipse配置环境变量
  14. 什么是CTS、CLS、CLR
  15. JavaScript基础思维导图
  16. RibbonControl
  17. 公司网站如何让用户使用QQ第三方登录
  18. Cacti-安装和使用详解
  19. 李小璐晒全家福 贾乃亮赤膊女儿可爱(图)
  20. VMware15.5没有Mac OS选项 unlocker解锁失败 Get vmware tool 卡住(已解决)

热门文章

  1. Gradient Transfer Optimization Model:基于梯度转移优化模型的红外与可见光图像融合
  2. python佛祖镇楼 BUG辟邪 永不怠机
  3. 由明星道德绑架引发的危机公关处理策略分析
  4. Cisco(思科)VLAN的配置(详细)
  5. Linux下plink软件使用方法,#软件工具#解密GWAS的利器--Plink 使用解析
  6. Ubuntu 出现结构需要清理 (structure needs cleaning)
  7. 论文字体楷体_GB2312显示错误
  8. AndroidP 增加蓝牙遥控器对应的kl文件 --hisi平台
  9. 【论文译文】StyleGAN
  10. 关于Python中输入的问题