RemoteView中的应用除了有通知栏的自定义之外,还有桌面小部件也是通过RemoteView以及AppWidgetProvider来完成的。

实际上AppWidgetProvider是一个广播,即继承于BroadcastReceiver。

public class AppWidgetProvider extends BroadcastReceiver

那么我们其实可以将AppWidgetProvider当成一个特殊的BroadcastReceiver就可以了。

让我们来自定义一个桌面小部件:

首先现在res/layout/ 下创建一个xml文件,命名为appwidget.xml,这个就代表着小部件的样子是什么:

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:src="@drawable/icon1" />

LinearLayout>

接着我们在res/xml下创建appwidget_provider_info.xml:

android:initialLayout="@layout/appwidget"

android:minHeight="84dp"

android:minWidth="84dp"

android:updatePeriodMillis="86400000" >

appwidget-provider>

在上面第一个属性是指小工具使用的初始化布局。第二属性和第三个属性是指最小的宽高,最后一个属性是指更新周期,每隔这么多秒就会被触发。

下面是实现类,要继承于AppWidgetProvider:

public class AppProvider extends AppWidgetProvider{

public static final String TAG = "MyAppProvider";

public static final String CLICK_ACTION = "com.example.remoteview.action.CLICK";

public AppProvider(){

super();

}

//同样是要重写onReceive()

@Override

public void onReceive(final Context context,Intent intent){

super.onReceive(context, intent);

Log.e(TAG, "action = " + intent.getAction());

if(intent.getAction().equals(CLICK_ACTION)){

Toast.makeText(context, "click it", Toast.LENGTH_SHORT).show();

new Thread(new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

//建立Bitmap

Bitmap srcBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon1);

//声明AppWidgetManager

AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

for(int i = 0;i < 37;i++){

//控件图片旋转360度

float degree = (i * 10)%360;

RemoteViews remoteView = new RemoteViews(context.getPackageName(),R.layout.appwidget);

remoteView.setImageViewBitmap(R.id.imageView1,rotateBitmap(context,srcBitmap,degree));

Intent intentClick = new Intent();

intentClick.setAction(CLICK_ACTION);

PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intentClick, 0);

remoteView.setOnClickPendingIntent(R.id.imageView1,pendingIntent);

//updateAppWidget将会调用onUpdate

appWidgetManager.updateAppWidget(new ComponentName(context, AppProvider.class),remoteView);

SystemClock.sleep(30);

}

}

}).start();

}

}

@Override

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

super.onUpdate(context, appWidgetManager, appWidgetIds);

Log.e(TAG, "onUpdate");

final int counter = appWidgetIds.length;

Log.e(TAG, "COUNTER = " + counter);

for(int i = 0;i < counter; i++){

int appWidgetId = appWidgetIds[i];

onWidgetUpdate(context,appWidgetManager,appWidgetId);

}

}

//更新部件函数

private void onWidgetUpdate(Context context,AppWidgetManager appWidgetManager,int appWidgetId){

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

Intent intentClick = new Intent();

intentClick.setAction(CLICK_ACTION);

PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intentClick, 0);

//桌面小部件将会被点击触发,发送PendingIntent

remoteViews.setOnClickPendingIntent(R.id.imageView1, pendingIntent);

appWidgetManager.updateAppWidget(appWidgetId, remoteViews);

}

//变换Bitmap的矩阵

private Bitmap rotateBitmap(Context context,Bitmap srcBitmap,float degree){

Matrix matrix = new Matrix();

matrix.reset();

matrix.setRotate(degree);

Bitmap tmpBitmap = Bitmap.createBitmap(srcBitmap,0,0,srcBitmap.getWidth(),srcBitmap.getHeight(),matrix,true);

return tmpBitmap;

}

}

对了,别忘记了还有继承于BroadcastReceiver我们还是需要注册,注册有点点不一样。如下:

android:resource="@xml/appwidget_provider_info">

meta-data>

intent-filter>

receiver>

第一个Action用来标识点击行为,第二个Action是声明为AppWidget必须存在的action。

这样就完成了桌面小工具的实现了。

android remoteview 缓存,关于RemoteView的一点愚见(实现桌面小部件)相关推荐

  1. android 仿苹果 小组件,安卓仿ios14桌面小部件

    安卓仿ios14桌面小部件,是一个可以让安卓手机的界面看起来像苹果界面的软件,功能非常强大,它可以提供多种不同主题的壁纸桌面,随心选择,设置后的效果还是非常不错的,很有高级感,操作简单,上手也很快. ...

  2. Android Widget——实现桌面小部件

    前言 在Android手机中,我们经常会看到各种桌面小部件,天气.音乐播放器.时间表盘等,这些都是桌面小部件的实例.本篇主要介绍桌面小部件开发的一些最基础的知识. Widget介绍 Widget并没有 ...

  3. 【Android界面实现】AppWidght全面学习之电量监控小部件的实现详解

    前几天翻看之前下载的各种资料,无意中发现了一款AppWidght应用的源代码,想起之前一直想研究这块,却一直没机会,于是花费了两天时间,把这款桌面电量监控小插件的实现研究了一下,收获颇丰,特此把学到的 ...

  4. 手机bootstrap搜索框_这些桌面小部件,Android 手机可不能错过

    在开源.可玩性较高的安卓系统上,小部件呈现了与 iOS 不一样的魅力.它高度的灵活自由,使得安卓手机用户,更能对自己的手机桌面进行个性化的定制. 可在细数当下众多的安卓小部件里,哪些能在保持实用性的同 ...

  5. Android AppWidget(桌面小部件)

    使用Android Studio 开发桌面小部件,闲来无事,自己动手做一个 AppWidget是应用程序窗口小部件(Widget)是微型的应用程序视图 官方文档链接:http://www.androi ...

  6. kwgt 歌词_这8款Android桌面小部件,能让你的Android好用很多倍

    安卓手机一直以来以其可玩性高而受到欢迎,即使是简单的桌面小部件,也有人能玩出花来.强大如 Zooper Widget 和 KWGT 等复杂且定制性极强的美化类桌面插件应用,抑或是朴实无华但又必不可少的 ...

  7. Android桌面小部件AppWidget:音乐播放器桌面控制部件Widget(3)

     Android桌面小部件AppWidget:音乐播放器桌面控制部件Widget(3) Android桌面小部件AppWidget比较常用的场景就是音乐播放器,音乐播放器虽然通常在后台播放,但需要 ...

  8. Android AppWidget(桌面小部件-音乐播放动画)

    桌面小部件基础篇:Android AppWidget (桌面小部件) 音乐播放 (动画实现)     一个音乐播放的柱状图(不会上传动图,自行脑补) 思路方案: 1,自定义View,widget 仅支 ...

  9. android 日期选择图标,android – 如何删除QCalendarWidget中的选定日期矩形和小部件中的小图标...

    我正在编写自己的QCalendarWidget实现.我希望日期可以选择,但我不想看默认选择矩形.它看起来像这样: 我的代码: in constructor: setSelectionMode(Sing ...

最新文章

  1. mysql sql语句编码_SQL语句实用例子 MySQL编码设置
  2. 第四课.Python函数(一)
  3. 关于虚拟空间与物理空间思想的解析
  4. 怎么在表单提交前检查数据输入。
  5. BMP图片的解析,关于压缩方式
  6. 形态分类法的迭代次数与成键的稳定性
  7. mysql qadir_MySQL 及 SQL 注入
  8. 反模式:神仙大类和黄金大锤
  9. [贪心专题]CF549G,CF351E,CF226D,CF1276C,CF1148E,CF798D
  10. Sentinel(二十三)之使用Apollo存储规则
  11. JavaScript 代码规范
  12. python爬虫中文乱码_解决Python爬虫处理文件时候中文名称出现乱码问题
  13. 【Python3网络爬虫开发实战】1.5.2-PyMongo的安装
  14. 判断是否为长按_【物流知识】物流配送合理化判断7大标志
  15. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_03-freemarker测试环境搭建
  16. 如何使用ps制作一寸照
  17. awr报告分析 mysql_生成awr报告
  18. 2021-07-12淘宝首页首次尝试
  19. java SE部分以及数据库学习笔记
  20. seems to be corrupted. Trying one more time

热门文章

  1. 开发中各类环境英文缩写
  2. QML AbstractButton | Button | ButtonGroup | Action
  3. vue、Layout 布局、Layout 属性事件、vue Layout 全部布局、vue Layout 全部属性事件
  4. Netflix Conductor 快速入门
  5. 写一个nodejs 网络请求
  6. 图的关键路径(AOE网络)
  7. 小型商业用房火灾预防的措施
  8. ofbiz 新建模块
  9. Bootstrap笔记(十四) 常用类别 - 间距
  10. Android中EditText输入字数统计和限制