文档章节

android开发之widget控件突然停止更新的原因

猴亮屏
 猴亮屏
发布于 2017/05/04 22:50
字数 762
阅读 17
收藏 0
点赞 0
评论 0

      在Android中开发widget控件的时候在appwidget-provider元素中有个属性android:updatePeriodMillis控制widget控件多长时间刷新一次,但是在1.6以后的版本中,谷歌从省电的方面考虑规定,当updatePeriodMillis的设置的值小于半个小时时,就会失效。也就是通过设置这个属性值,最短的更新间隔是半小时。但是我们有时候做的一些应用,比如时钟之类的必须要在极端的时间内刷新,必须另辟蹊径。网上流传的大都是这么几种方法:

  1. 通过自己发送android.appwidget.action.APPWIDGET_UPDATE这个广播刷新,但是他会使所有的桌面widget控件刷新
  2. 通过自己发送自定义的广播刷新

关键在于在哪里发送广播,有这么几种选择:

  1. 在OnEnable中开启定时线程发
  2. 单开一个service发
  3. 用alarm定时发

      后两种是可行的,第一种方法虽然看起来可行但是有一个bug,如果不解决就会发现自己的widget在运行了一段时间后莫名其妙的的停止了运行。我当时发现总是过一段时间莫名其妙的停止运行后很苦恼,找不到原因,但是系统每半小时的android.appwidget.action.APPWIDGET_UPDATE广播还是能正常启动,后来在全局的logcat里发现停止运行前有一个进程向widget的进程发送了一个信号,signal:9,经过查找后在Linux进程通信中发现9号信号就是强制结束进程的信号,可是为什么总是向widget进程发送这个信号呢,后来想起来AppWidgetProvider是BroadCastReceiver继承过来的,而BroadCastReceiver的说明里有这么一段话:

      BroadcastReceiver如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由 Service 来完成 . 这里不能使用子线程来解决 , 因为 BroadcastReceiver 的生命周期很短 , 子线程可能还没有结束,BroadcastReceiver 就先结束了 .BroadcastReceiver 一旦结束 , 此时 BroadcastReceiver 的所在进程很容易在系统需要内存时被优先杀死 , 因为它属于空进程 ( 没有任何活动组件的进程 ). 如果它的宿主进程被杀死 , 那么正在工作的子线程也会被杀死 . 所以采用子线程来解决是不可靠的 。

    关键原因在于widget所在进程属于没有活动组件的空进程,所以被杀,要想不被杀,是他拥有一个活动组件就行,比如service,虽然这样还会被杀死,但是比起之前2、3个小时就被杀掉一次的频率就小多了。而且可以提高service优先级。

综上所述要想而是用线程发送广播的方法来更新widget的同时要注意不能使得widget所在的进程成为空进程。不然非常容易被系统清理掉。

本文转载自:http://blog.csdn.net/bjrxyz/article/details/8606841

共有 人打赏支持
猴亮屏

猴亮屏

粉丝 30
博文 512
码字总数 52840
作品 2
北京
Android工程师
Android --- App Widget 开发

概要: App Widget应用小控件,用户可以通过长按屏幕,然后添加小控件倒桌面,这些小控件一般都是为了显示一些信息在桌面上,同时方便用户通过点击桌面上的小控件来访问你的程序。 基础知识:...

Jumper_Woo
2013/04/06
0
0
Android开发之App Widget的学习及使用

(以下为本人对于官方文档的理解,能力有限,有错还望指出) 1、首先,我们先阅读下官方文档,后面活给出Demo程序 App Widgets(应用程序 小工具,窗口小部件) App Widgets are miniature ...

Angels_安杰
2015/11/16
0
0
Flutter尝鲜:跨平台移动应用开发

开始之前 本人使用Flutter开发的一个图文App《每日图文》,可以同时运行在Android和iOS上,欢迎体验,喜欢的话还不吝Star一下。 叮叮叮~ 传送门 Flutter为何物? 随着移动App开发成本越来越...

开发的猫
06/06
0
0
Android Widget 开发实例:桌面便签程序的实现详解和源码

桌面便签软件是Android上常用软件的一种,比如比较早的Sticky Note,就曾非常流行,而实际上使用android平台对widget开发的支持,桌面便签类软件是非常易于开发的。 本文通过逐步实现一个简单...

simpower
2014/08/31
0
0
Android必备:Android UI控件的了解与学习

看这里:Android必备:Android UI控件的了解与学习 由于工作需要,最近一段时间,需要进行Android App开发的学习,之前简单的进行过Android的了解,对于基本的Android环境的搭建等已经有过整...

Realfighter
2015/02/26
0
0
android 打包自己的自定义组件成JAR包

在项目开发过程中,我们难免会用到自己去制作自定义的VIEW控件,之后我们别的项目如果需要的话就直接将其复制到对应的项目中使用,虽说这么做是一个解决问题的方法,但毕竟不是很好。 原因是...

刘遇安
2013/04/19
0
3
Android开发指南-窗口小部件(App Widgets)

http://blog.csdn.net/iefreer/article/details/4626274# 应用程序窗口小部件App Widgets 应用程序窗口小部件(Widget)是微小的应用程序视图,可以被嵌入到其它应用程序中(比如桌面)并接收...

鲜鲜
2014/09/16
0
0
android LinearLayout

LinearLayout是线性布局控件,它包含的子控件将以横向或竖向的方式排列,按照相对位置来排列所有的widgets或者其他的containers,超过边界时,某些控件将缺失或消失。因此一个垂直列表的每一行...

amigos_wu
2012/06/07
0
0
android 自定义checkbox与文字的距离设置

改变checkbox默认的文字与选框之间的距离两种方案,刚刚开始接触checkbox 的时候由于不熟悉控件,使用了组合控件:一个未设定text的CheckBox和一个TextView来达到目的。后来发现只需要设定C...

NotFoundException
2014/05/13
0
0
android之appwidget(一)简单appwidget

什么是appwidget? 即application widget。 应用程序控件,就是在桌面显示的控件。AppWidget就是我们平常在桌面上见到的那种一个个的小控件,利用这个小控件可以给用户提供一些方便快捷的操作...

守夜之星
2012/08/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

shell及python脚本方式登录服务器

一、问题 在工作过程中,经常会遇见需要登录服务器,并且因为安全的原因,需要使用交互的方式登录,而且shell、python在工作中也经常用到,并且可以提供交互的功能。都是利用了expect、spawn...

yangjianzhou
7分钟前
0
0
upstream sent too big header while reading...

nginx 报错:1736 upstream sent too big header while reading response header from upstream 1. 一般处理 location ~ \.php$ { #增加下面两句 fastcgi_buffer_size 128k; ......

dubox
17分钟前
0
0
Python解析配置文件模块:ConfigPhaser

import configparser as pa# [SectionA]# a = aa# b = bb# c = cc# [SectionB]# optionint = 1# optionfloat = 1.1# optionstring = string#https://www.cnblogs.com/a......

易野
24分钟前
0
0
Java基础——面向对象

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 Object的方法: clone() Object 克隆 to Strin...

凯哥学堂
26分钟前
0
0
rabbitmq学习记录(八)消息发布确认机制

RabbitMQ服务器崩了导致的消息数据丢失,已经持久化的消息数据我们可以通过消息持久化来预防。但是,如果消息从生产者发送到vhosts过程中出现了问题,持久化消息数据的方案就无效了。 Rabbit...

人觉非常君
30分钟前
0
0
毕业5年,我是怎么成为年薪30W的运维工程师

#转载# 我在大学读的是计算机专业,但大学毕业之后,进入到一家私企进行工作,工作的内容类似于网管,会经常的去修电脑,去做水晶头等内容。刚开始工作,也没想太多,最想的是丰富自己的工作...

Py爱好
37分钟前
1
0
大数据基础知识,大数据学习,涉及的知识点

一、什么是大数据 一种规模大到在获取、存储、管理、分析方面大大超出了传统数据库软件工具能力范围的数据集合,具有海量的数据规模、快速的数据流 转、多样的数据类型和价值密度低四大特征。...

董黎明
52分钟前
0
0
Linux CentOS 7上安装极点五笔

话说几天前在新买的惠普笔记本上成功地安装了Linux CentOS 7操作系统、Nvidia Quandro P600驱动程序及X Window,并在VMware下安装Red Hat教学环境,彻底跳出Windows的苦海,但仍然有一件事不...

大别阿郎
今天
17
0
2018年7月20日集群课程

一、集群介绍 集群,简单地说是指一组(若干个)相互独立的计算机,利用高速通信网络组成一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器。 ...

人在艹木中
今天
0
0
spark开发机中调试snappy

目的 在Idea中的点击运行,使spark可以直接读取snappy 自己编译hadoop,以支持snappy的压缩。 自己编译的目的就是要得到支持snappy文件读写的动态链接库。如果可以在网上下载,可以跳过自行编...

benny周
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部