最近在学习android的appwidget,看了一些文章,决定做一个相册幻灯片来练手,下面写写过程来给大家共享:

  1. 在项目的res/xml/下建立一个appwidget_info.xml文件,内容如下:

        <?xml version="1.0" encoding="utf-8"?><appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"android:initialLayout="@layout/appwidget"android:minHeight="800dp"android:minWidth="240dp"android:updatePeriodMillis="300000" ></appwidget-provider>

    在这里定义appwidget的基本信息,宽度,高度,以及刷新的频率等

  2. 在layout/下建立appwidget的layout文件
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"android:padding="20dp" ><Buttonandroid:id="@+id/button1"android:layout_width="120dp"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:text="播放图片" /><ImageViewandroid:id="@+id/imageView1"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="#FFFF"android:padding="2dp"android:scaleType="fitXY"android:src="@drawable/p1" /></LinearLayout>

    这个layout比较简单,里面仅仅包含一个button和一个imageview,设置 android:padding="2dp"来让图片有一个简单的边框样式

  3. 建立MyAppWidgetProvider继承AppWidgetProvider,重写父类的生命周期函数,这里的原理google一下有很多,就不多写了。首先重写onUpdate,这个方法在appwidget第一次加载时会被调用,在这里我们主要使用ContentResolver查询出本机所有图片;接下来新建一个PendingIntent将图片路径的集合封装到其中,最后将pendingIntent设置给button
    Intent intent = new Intent("com.jaredluo.appwidget.change");
    intent.putExtra("path", pathStrArr);//设置pending,发送广播,注意设置
    //PendingIntent.FLAG_UPDATE_CURRENT
    //否则onRecieve函数中接收不到intent中的数据
    PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);for (int j = 0; j < appWidgetIds.length; j++) {//RemoteView是appwidget中很重要的一个类,基本上对appwidget中
    //所有控件的操作都要基于RemoteView来操作
    RemoteViews remoteView = new RemoteViews(context.getPackageName(),R.layout.appwidget);remoteView.setOnClickPendingIntent(R.id.button1, pIntent);appWidgetManager.updateAppWidget(appWidgetIds[j], remoteView);remoteView = null;
    }

    由于appwidget与主程序处于不同的进程中,所以通讯都需要依靠PendingIntent。

  4. 接下来在onReceive中接收我们刚才设置给button的广播,首先新开一个线程控制图片的播放,接下来在Handler中为ImageView设置图片源
    final RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.appwidget);
    String path = paths[msg.getData().getInt("i")];
    remoteViews.setImageViewBitmap(R.id.imageView1,BitmapUtil.getBitmap(path, 200, 200));
    appWidgetManager.updateAppWidget(componentName,remoteViews);

    这里需要注意一个问题,我在把图片设置给appwidget时,跑不了几张图片就会出现!!! FAILED BINDER TRANSACTION !!!这个错误,最先以为是图片太大造成的,结果压缩图片也无果;后面在网上搜索一番发现:Binder data size limit is 512K 由于传输图片到appwidget进程中的Binder最大数据量是512k,并且RemoteView也不会每次清理,所以如果每次都使用同一个RemoteView进行传输会因为溢出而报错。最后每次都新建一个RemoteView问题才解决掉。

    看看最后的效果,点击播放图片按钮,图片就开始更替:

代码还有很多问题和不完善,接下来有空会继续修改。

转载于:https://www.cnblogs.com/jaredlam/archive/2012/05/01/2478334.html

【原创】Android学习appwidget制作一个桌面相册幻灯片相关推荐

  1. android led闪烁功能,如何在Android应用层中制作一个LED指示灯效果

    如何在Android应用层中制作一个LED指示灯效果 发布时间:2020-12-08 16:12:59 来源:亿速云 阅读:86 作者:Leah 本篇文章给大家分享的是有关如何在Android应用层中 ...

  2. python制作一个桌面小工具

    python实现一个桌面小工具,制作一个桌面的便签提醒工具 参考代码:https://github.com/cosven/memo 参考链接:https://www.jb51.net/article/ ...

  3. python软件桌面图标_python制作一个桌面便签软件

    # 2014.10.15 更新了memo.zip, 网盘的exe:修复:1.隔日启动不能正常加载json,加入:1.隐藏任务栏图标,2.通过垃圾桶进行窗口移动. # 2014.10.8 10.36更新 ...

  4. 基于C#制作一个桌面宠物

    此文主要基于C#制作一个桌面宠物,可自定义宠物素材图片及打开外部exe的快捷菜单. 实现流程 1.1.创建项目 1.2.准备素材 1.3.控件设置 (1)PictureBox控件 (2)timer控件 ...

  5. 用 Python 制作一个桌面宠物,好玩

    今天,我们来分享一个宠物桌面小程序,全程都是通过 PyQT 来制作的,对于 Python GUI 感兴趣的朋友,千万不要错过哦! 我们先来看看最终的效果,对于一个小小的娱乐项目来说,还是不错啦! 本文 ...

  6. 用 Python 制作一个桌面宠物,好玩!

    今天,我们来分享一个宠物桌面小程序,全程都是通过 PyQT 来制作的,对于 Python GUI 感兴趣的朋友,千万不要错过哦! 我们先来看看最终的效果,对于一个小小的娱乐项目来说,还是不错啦! 本文 ...

  7. python小工具开发_使用Python制作一个桌面小工具

    今天,我们制作一个有意思的小工具,利用Python获取历史上的今天发生的事情. [分析] 个人总结了一下,"历史上的今天"有很多调用接口.有很多调用接口都是收费的或者就是免费但限制 ...

  8. 树莓派学习手记——制作一个空调遥控器(红外接收、发射的实现)

    CSDN广告邮件太多了,邮箱已经屏蔽了CSDN,留言请转SegmentFault:https://segmentfault.com/a/1190000014135418 使用树莓派搭配红外管,进行接收 ...

  9. 树莓派学习手记——制作一个空调遥控器(红外接收、发射的实现) 1

    使用树莓派搭配红外管,进行接收.发射红外信号是很方便的,同时红外信号也有很广泛的用途.这次我们将总结使用树莓派制作一个空调红外遥控器的过程. 准备工具 红外接收管(参考型号HS0038B) 红外发射管 ...

最新文章

  1. R语言原生hist函数绘制直方图实战
  2. 将标签one-hot化的方法
  3. php 判断来源 微信客户端_PHP判断手机端、PC端 、微信代码实例
  4. 百分制转化为五级制java_javav 的日志-编写存储过程,将百分制成绩,转换成绩等级’A’,’B’,’C’,’D’,’E’...
  5. 山寨版项目管理经验小结
  6. LeetCode 第 207 场周赛(245/4115,前5.95%)
  7. vue 将行转换成对象_Vue简化版实现
  8. oracle java 映射_java程序访问映射后的oracle
  9. android 点击文本框 不调用键盘,Android点击EditText文本框之外任何地方隐藏键盘的解决办法...
  10. cxp文件查看 欧姆龙_欧姆龙PLC CXP编程软件外文手册
  11. linux文件的复制需要什么权限,linux下复制文件需要什么样权限
  12. 贪吃蛇游戏//html+js//
  13. 使用 Vue 和 epub.js 制作电子书阅读器
  14. [转载]SAP报表开发工具——Report Painter
  15. 计算机模糊,电脑显示不清晰_如果计算机显示器模糊或不清楚,该怎么办
  16. SEO搜索引擎优化总结
  17. [P4]源码管理 - perforce(p4)的分支与集成
  18. https web service(转)
  19. 感受5.12汶川大地震
  20. 中国直接针对消费者的疾病风险和健康DNA测试行业市场供需与战略研究报告

热门文章

  1. 多人游戏用 TCP 还是UDP
  2. 中南大学 计算机硕士论文格式,中南大学硕士、博士学位论文格式的统一要求.pdf...
  3. 视频教程-UE4堡垒之夜FPS逆向安全开发设计-其他
  4. tendaac18虚拟服务器,千兆智能路由如何快速设置?以腾达AC18为例
  5. 我的装机必备软件总结
  6. java获取某一年某一月的最后一天
  7. java rtmp m3u8_RTMP、HLS(M3U8)协议直播视频流网页播放云播放的实现方法
  8. 【个人原创项目】开发问答社区-V1.0
  9. Python深度学习实战PyQt5信号与槽的连接
  10. 小学教师计算机培训课程感言,2016年小学教师浅谈信息技术应用体验心得体会...