想写一个根据电量来切换图片的AppWidget,由于监视电量需要另起一个service,我的想法是在添加第一个widget时启动service,在删除最后一个时结束service。

layout<?xml version="1.0" encoding="utf-8"?>

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@+id/container_image"

android:layout_width="match_parent"

android:layout_height="match_parent" />

manifest.xml

android:name=".HelloService">

android:name="android.appwidget.provider"

android:resource="@xml/hello_world_info" />

AppWidgetProvider代码如下:

/**

* 广播接收器

*/

public class HelloWorld extends AppWidgetProvider {

private static String mShuouyang = "shuouyang";

/**

* @param context

* @param appWidgetManager

* @param appWidgetIds 一个桌面程序可能被安放好几个

*/

@Override

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

// There may be multiple widgets active, so update all of them

Log.d(mShuouyang, "广播========onUpdate: =======");

super.onUpdate(context, appWidgetManager, appWidgetIds);

}

@Override

public void onEnabled(Context context) {

Log.d(mShuouyang, "广播======== onEnabled: =======");

Intent mIntent = new Intent(context, HelloService.class);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

context.startForegroundService(mIntent);

} else {

context.startService(mIntent);

}

Log.d(mShuouyang, "广播========启动了Service: =======");

// Enter relevant functionality for when the first widget is created

}

@Override

public void onDisabled(Context context) {

// Enter relevant functionality for when the last widget is disabled

Log.d(mShuouyang, "广播======== onDisabled: =======");

context.stopService(new Intent(context, HelloService.class));//停止service

// context.stopService(mIntent);

}

@Override

public void onReceive(Context context, Intent intent) {

Log.d(mShuouyang, "广播======== onReceive: =======");

super.onReceive(context, intent);

}

}

在service中,注册一个匿名内部类的广播接收器来接收电量后更具电量显示图片public class HelloService extends Service {

private static BroadcastReceiver mBroadcastReceiver;

public HelloService() {

}

@Override

public IBinder onBind(Intent intent) {

// TODO: Return the communication channel to the service.

throw new UnsupportedOperationException("Not yet implemented");

}

@Override

public void onCreate() {

super.onCreate();

mBroadcastReceiver = new BroadcastReceiver() {

private int[] drawables = {

R.drawable.helloworld0,

R.drawable.helloworld1,

R.drawable.helloworld2,

R.drawable.helloworld3,

R.drawable.helloworld4,

R.drawable.helloworld5,

R.drawable.helloworld6,

R.drawable.helloworld7,

R.drawable.helloworld8,

R.drawable.helloworld9,

R.drawable.helloworld10,

};

int percent = 5;//当前电量标志

int level = 0; //当前电量

int scale = 100;//总电量

@Override

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

try {

if (action.equals("android.intent.action.BATTERY_CHANGED")) {

this.level = intent.getExtras().getInt("level", 0);//当前电量

this.scale = intent.getExtras().getInt("scale", 100);//总电量

this.percent = level *10/scale;

Log.d("shuouyang", "服务 onReceive: 获取到了电量信息"+ percent);

}

AppWidgetManager instance = AppWidgetManager.getInstance(context);

ComponentName componentName = new ComponentName(context, HelloWorld.class);

RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.hello_world);

remoteViews.setImageViewResource(R.id.container_image,drawables[this.percent]);

instance.updateAppWidget(componentName,remoteViews);

Log.d("shuouyang", "服务 onReceive: 逻辑通知完成");

}catch (Exception e){

e.printStackTrace();

Toast.makeText(context,"未获取到电量",Toast.LENGTH_SHORT).show();

}

}

};

}

@Override

public void onStart(Intent intent, int startId) {

super.onStart(intent, startId);

IntentFilter intentFilter = new IntentFilter("android.intent.action.BATTERY_CHANGED");

registerReceiver(mBroadcastReceiver,intentFilter);//注册接收电量改变的广播接收器

}

@Override

public void onDestroy() {

Log.d("shuouyang", "服务 onDestroy: 服务被销毁");

unregisterReceiver(mBroadcastReceiver);//解除注册

super.onDestroy();

}

}

启动成功

当我将wigget添加到桌面时,开始几秒(通过AVD的外部控制器修改电量)可以根据此时电量显示指定图片和切换图片,后面就切换不了了,只能显示固定的一张图片。查看log显示,service内部的广播接收器在初始几秒就收了几次广播后就自动onDestroy了。不明白是什么停止了服务,

log如下

20-08-19 13:07:50.614 9319-9319/? D/xxxxxx: 广播======== onReceive: =======

2020-08-19 13:07:50.629 9319-9319/? D/xxxxxx: 广播======== onReceive: =======

2020-08-19 13:07:50.629 9319-9319/? D/xxxxxx: 广播========onUpdate: =======

2020-08-19 13:07:50.629 9319-9319/? D/xxxxxx: 广播========启动了Service: =======

2020-08-19 13:07:50.630 9319-9319/? D/xxxxxx: 服务 onReceive: 获取到了电量信息8

2020-08-19 13:07:50.633 9319-9319/? D/xxxxxx: 服务 onReceive: 逻辑通知完成

2020-08-19 13:07:55.327 9319-9319/com.shu.helloworld D/xxxxxx: 服务 onReceive: 获取到了电量信息7

2020-08-19 13:07:55.329 9319-9319/com.shu.helloworld D/xxxxxx: 服务 onReceive: 逻辑通知完成

2020-08-19 13:07:55.620 9319-9319/com.shu.helloworld D/xxxxxx: 服务 onDestroy: 服务被销毁

android service什么时候销毁,阳光沙滩-android 通过AppWidgetProvider 启动的Service会自动销毁问题...相关推荐

  1. Android 双开沙箱 VirtualApp 源码分析(四)启动插件 Service

    上一章:Android 双开沙箱 VirtualApp 源码分析(三)App 启动 原生 Service 创建过程 首先有必要了解一下原生 framework 对 Service 的创建,因为在 VA ...

  2. android 组件导出,阳光沙滩-android组件化项目,build生成的文件重复的情况

    1.最近弄一个组件化的项目练手.项目第一次run可以跑起来,等我杀死stop项目后,过一段时间在再次run想跑项目,就会报如下错误 这个component_base_back 3.xml文件是第二次r ...

  3. 关于android的sqlite问题,阳光沙滩-android studio的sqlite使用出现问题,是什么情况呢?...

    这是我觉得可能可以参考的log 2020-03-24 21:21:55.623 10006-10006/? E/SQLiteLog: (1) near ",": syntax er ...

  4. 【Android开发日记】第一个任务Android Service!Service靴+重力感应器+弹出窗口+保持执行...

    前言: 近期在写一个小程序,需求是手机摇一摇就弹窗出来.第一次使用了Service,学习了两天,实现了Service弹窗,开机启动,Service启动和销毁,Service保持一直执行. 满足了自己的 ...

  5. Android实训案例(七)——四大组件之中的一个Service初步了解,实现通话录音功能,抽调接口...

    Service Service的奇妙之处.在于他不须要界面,一切的操作都在后台操作,所以非常多全局性(手机助手,语音助手)之类的应用非常长须要这个.我们今天也来玩玩 我们新建一个project--Se ...

  6. 基于控件核心技术探讨---金阳光自动化测试Android(2)---2013年5月

    本文转载来自:金阳光老师的csdn博客文章:http://blog.csdn.net/haorenmin2008 第一讲分享了下安卓自动化一些概况和一些自动化框架现状和技术能够解决什么样的问题.这次课 ...

  7. android init.rc中启动的service 默认是disable的,后续如何启动此服务

    如果 android init.rc中启动的service 默认是disable的,如何才能启动此服务呢? init.rc中可以直接启动service 附带的参数决定启动程序的状态,例如数据业务中配置 ...

  8. Android复习10【Service与Thread的区别、Service的生命周期、Service生命周期解析(相关方法详解、启动方式的不同、绑定)、音乐播放器+服务】

    音乐播放器Android代码下载:https://wws.lanzous.com/ifqzihaxvij 目   录 Service与Thread的区别 Service的生命周期 Service生命周 ...

  9. android emulator虚拟设备分析第三篇之pipe上的qemud service

    一.概述 本篇和第二篇是强相关的,需要结合第二篇一起看. 以boot-properties为例,注意不需要看ANDROID-QEMUD.TXT,这个是和guest os中的qemud进行相关的,已废弃 ...

最新文章

  1. pt-tools系统:pt-kill 实战
  2. Spark安装与学习
  3. 数据中台(三)数据中台设计与数据资产管理
  4. vue axios 跨域_SpringBoot+Vue从零开始搭建系统(三)前后端整合二
  5. (47)VHDL实现8位奇偶校验电路(for loop语句)
  6. 那么多编程语言,为什么要选择C++?
  7. MYSQL 触发器 实践案例
  8. java猜成语,成语疯狂猜-疯狂猜成语下载-javaweb下载站
  9. K210基础实验—获取,修改像素值
  10. 硬盘克隆 计算机更换硬盘,换硬盘数据怎么办 看一招本地磁盘对拷
  11. < span >标签的使用
  12. KeilMDK编译错误Error: L6218E: Undefined symbol __aeabi_assert (referred from xxx.o).
  13. 计算机动漫游戏与制作,计算机动漫与游戏制作标准规范.doc
  14. D7写的金税清成助力核心代码
  15. 四舍五入VS银行家舍入 (四舍六入五取偶)
  16. python中的pil模块_初学python的PIL模块
  17. java实现最近搜索词条
  18. 简单操作实现Siri控制ESP8266引脚电平--1
  19. 比尔及梅琳达·盖茨基金会宣布追加最高 1 亿美元捐款,支持抗击新型冠状病毒疫情!...
  20. OpenWrt 刷机后的网络配置

热门文章

  1. linux xunsou_IT外包 网络综合布线 机房建设整改 弱电集成安防-_295
  2. Pr 从入门到精通(合集)
  3. 鹊华秋色(2009-06-10)
  4. BI报表分析控件Wyn,助力数据可视化
  5. [人脸活体检测] 人脸活体检测简介
  6. 《笨方法学 Python 3》35.分支和函数
  7. 统一信息管理平台服务器,4A统一安全管控平台
  8. C语言职工管理系统(带有报告)
  9. 数据可视化分析教学课件——FineBI实验册节选====企业产品销售分析
  10. 事业单位计算机面试基础知识,求事业单位面试题目(计算机岗位)