widget包是存放自定义组件

开发自定义组件;

其实Android API开发指南中的App Widgets章节 已经说得很清楚了,下面只是对自己的理解进行一次梳理。

-- 
AppWidget 就是HomeScreen上显示的小部件,提供直观的交互操作。通过在HomeScreen中长按,在弹出的对话框中选择Widget部件来进行创建,长按部件后并拖动到垃圾箱里进行删除。同一个Widget部件可以同时创建多个。

AppWidget的实现主要涉及到以下类: 
AppWidgetProvider 
RemoteViews 
AppWidgetManager

1. 
首先需要提供一个定义了Widget界面布局的XML文件(位于res/layout/..),需要注意的是使用的组件必须是RemoteViews所支持的,目前原生API中支持的组件如下: 
FrameLayout 
LinearLayout 
RelativeLayout

AnalogClock 
Button 
Chronmeter 
ImageButton 
ImageView 
ProgressBar 
TextView

*如果使用了除此之外的组件,则在Widget创建时会导致android.view.InflateExceptionn异常。

PS:这就导致有一些功能或样式无法实现,如很基本的list或文本编辑框都是无法直接实现的。如果想自定义Widget中的View的话只能通过修改framework来提供相应组件的支持。

2. 
然后需要提供一个xml文件来定义Widget的基本属性,放置到res/xml/..目录下。 
如果使用的是Eclipse可按如下操作: 
1) 在res/目录下创建xml/目录 
2)创建xml文件(名字可任意),选择类型为AppWidgetProvider 
3)在弹出的便捷界面进行参数设置

主要设置的参数如下: 
minWidth: 定义Wdiget组件的宽度 
minHeight: 定义Wdiget组件的高度 
updatePeriodMillis: 更新的时间周期 
initialLayout: Widget的布局文件 
configure: 如果需要在启动前先启动一个Activity进行设置,在这里给出Activity的完整类名(后面会说到,与一般Activity的实现有些许差别)

*Widget大小的计算单元格数*74)-2,API上说是为了防止像素计算时的整数舍入导致错所以-2...不是很明白

一个完整的样例: 
Xml代码  收藏代码

<?xml version="1.0" encoding="utf-8"?>  
    <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"  
          android:minWidth="80dp"  
          android:minHeight="32dp"  
          android:updatePeriodMillis="86400000"  
          android:initialLayout="@layout/widget_provider"  
          android:configure="com.demo.widget.MyWidgetConfiguration" >  
    </appwidget-provider>

3. 
xml都定义好后,接下来就是创建一个继承自AppWidgetProvider的子类,AppWidgetProvider实际上就是一个BroadcastReceiver,里面提供了以下函数: 
onReceive(Context, Intent) 
onUpdate(Context , AppWidgetManager, int[] appWidgetIds) 
onEnabled(Context) 
onDeleted(Context, int[] appWidgetIds) 
onDisabled(Context) 
可通过重写以上函数来监听Widget状态的变化并进行相应的处理。

以上函数具体调用情况归纳如下: 
[启动 - 无confiure Activity] 
onReceive 
onEnabled —— 第一个widget被显示 
onReceive 
onUpdate —— 刷新界面

[启动 - 带confiuration Activity] 
onReceive 
onUpdate

[拖动] 
<无状态变化>

[周期更新] 
onReceive 
onUpdate

[删除] 
onReceive 
onDeleted —— widget被删除 
onReceive 
onDisabled —— 最后一个widget被移除

[启动时位置不够] 
onReceive 
onEnabled 
onReceive 
onUpdate 
onReceive 
onDeleted 
onReceive 
onDisabled

*每次状态的变化会触发onReceive,一般该函数是不需要重写的。

简单了解AppWidgetProvider之后,我们来看具体实现。 
这里创建一个MyAppWidgetProvider继承AppWidgetProvider: 
Java代码  收藏代码

public class MyWidgetProvider extends AppWidgetProvider {  
      
          static final String TAG = "widget";  
           
          /** 
           * 更新 
           */  
          public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds){  
                Log.i(TAG, "onUpdate");  
          }  
           
          /** 
           * 第一个Widget组件启动时触发 
           */  
          public void onEnabled(Context context){  
                Log.i(TAG, "onEnabled");  
          }  
           
          /** 
           * 最后一个Widget组件关闭时触发 
           */  
          public void onDisabled(Context context){  
                Log.i(TAG, "onDisabled");  
          }  
           
          /** 
           * 任一Widget组件被删除时触发 
           */  
          public void onDeleted(Context context, int[] appWidgetIds){  
                Log.i(TAG, "onDeleted");  
          }  
           
          /** 
           * 以上函数触发前会先触发该函数,一般不需要重写 
           */  
          public void onReceive(Context context, Intent intent){  
                Log.i(TAG, "onReceive");  
                super.onReceive(context, intent);  
          }  
           
    }

其中onUpdate顾名思义是对Widget进行更新的,前面定义的更新周期就是作用于该函数的。 
Widget的更新与Activity不同,必须借助于RemoteViews和AppWidgetMananger。具体实现如下: 
Java代码  收藏代码

public void onUpdate(Context context, AppWidgetMananger appWidgetManager, int[] appWidgetIds){  
        int N = appWidgetIds.length; // 可能启动了多个Widget,appWidgetIds记录了这些Widget的ID  
        for(int i=0; i<N; i++){  
            RemoteViews  views = new RemoteViews(getPackageName(), R.layout.widget_views);  
            appWidgetManager.updateAppWidget(appWidgetIds[i], views);  
        }  
    }

其中需要注意的是,虽然RemoteViews参数都是一样的,但是对于每个Widget最好都新创建一个再进行传递,否则会导致一些错误。具体可参考AppWidget RemoteViews 内存溢出 。

其他函数的可以根据需要实现。

由于无法获取到RemoteViews创建的界面中的元素,对于Widget中组件的操作只能通过RemoteViews所提供的有限的函数进行,常用的有: 
setOnClickPendingIntent(int viewId, PendingIntent pendingIntent) 
setProgressBar(int viewId, int max, int progress, boolean indeterminate) 
setTextViewText(int viewId, CharSequence text) 
setViewVisibility(int viewId, int visibility) 
详细函数列表可参考API中的RemoteViews类 。

4. 
最后,更新AndroidManifest.xml。 
AppWidgetProvider对应一个receiver属性: 
Xml代码  收藏代码

<receiver android:name="MyWidgetProvider">  
                <intent-filter>  
                    <action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>  
                </intent-filter>  
                <meta-data android:resource="@xml/widget_property" android:name="android.appwidget.provider"></meta-data>  
            </receiver>

5. 
提供Configuration Activity 
Configuration Activity是一个在Widget启动前先启动的Activity,方便用户对Widget的属性进行设置。

在res/xml/...下对应的"属性文件"中添加configure字段指定启动的Activity,并在AndroidManifest.xml中该Activity下提供一个action为android.appwidget.action.APPWIDGET_CONFIGURE 的IntenFilter。

需要注意的是, 
如果设置了Configure属性,则必须在指定的Activity中进行如下处理: 
1.在onCreate中setContentView()函数前添加setResult(RESULT_CANCLE) ,这样如果在Activity初始化完成前按下了BACK按键,则Widget不会启动; 
2.在setContentView()函数之后(不一定要在onCreate中,在Activity退出前即可),添加如下设置以指定需要启动的Widget: 
Java代码  收藏代码

int mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);  
    Intent resultValue = new Intent();  
    resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);  
    setResult(RESULT_OK, resultValue);

否则会导致退出Activity后Widget不启动。

>> Widget创建步骤汇总: 
1.定义Widget布局XML -> res/layout/... 
2.定义Widget属性文件(xml) -> res/xml/... 
3. 创建AppWidgetProider子类,实现onUpdate()等函数,在manifest中注册receiver,添加一个action为 android.appwidget.action.APPWIDGET_UPDATE 的IntentFilter,并添加如下<meta- data>标识: 
Xml代码  收藏代码

<meta-data android:resource="@xml/<属性文件xml>" android:name="android.appwidget.provider"></meta-data>

4. 创建Coniguration Activity(注意处理好setResult),添加到属性文件中的Configure属性,在manifest中注册activity,添加一个 action为android.appwidget.action.APPWIDGET_CONFIGURE 的IntentFilter

最后附上一个完整的例子, 
实现思路如下: 
1. 提供一个Configuration Activity,这里只简单显示一行文字; 
2.退出后Widget启动; 
3.点击Widget中的按钮会启动一个Activity

(转自:http://quding0308.iteye.com/blog/1164276)

转载于:https://www.cnblogs.com/jenson138/p/4347206.html

android widget包说明与应用相关推荐

  1. android 项目编译报错 符号: 类 shape 位置: 程序包 android.widget

    错误 android 项目编译报错 符号: 类 shape 位置: 程序包 android.widget 详细错误 Compiling with JDK Java compiler API. D:\A ...

  2. android java包_android SDk中常用的java包介绍

    下面是android SDK中API中的主要java包的功能简介: android.app :提供高层的程序模型.提供基本的运行环境 android.content :包含各种的对设备上的数据进行访问 ...

  3. Android Java包

    下面简短介绍一下Android SDK中重要的包. android.app:实现Android的应用程序模型.主要的类包括Application(表示开始和结束语义),以及众多与Activity相关的 ...

  4. 一个Demo学会用Android兼容包新控件

    2019独角兽企业重金招聘Python工程师标准>>> 前言 伟大的Google为Android推出了一系列的兼容包,最新的就是Design Support Library了,这里我 ...

  5. android jar包 权限,Android系统启动执行jar程序

    看雪里有人问到android是不是只能执行apk程序? 除了原生程序和脚本外,android是可以启动执行封装java程序的jar包的. 实现流程如下: 第一步新建java程序 public clas ...

  6. Android SDK包功能介绍,中文开发API

    Android 包索引 这些是API包. 查看全部 API classes . android 包含平台中包含的应用程序使用的资源类,并定义系统功能的应用程序权限. android.accessibi ...

  7. Android通过包名启动应用微信qq淘宝

    step1: 获取应用列表,亲测可用,找了几个小时才找到能用的 package com.example.myapplicationimport android.content.pm.PackageMa ...

  8. Android V7包学习笔记更新中.....

    关于V4 V7 V13 VX包介绍转自这里 1, Android Support V4, V7, V13是什么? 本质上就是三个java library. 2, 为什么要有support库? 如果在低 ...

  9. android.process修复,如何修复“ Android Widget”的“ process is bad”错误?

    如何修复" Android Widget"的" process is bad"错误? 我已经开发了一个Android Widget,并且运行良好. 我添加了一些 ...

  10. android:绘图 (android.graphics包)

    android:绘图 View:组件,理解为画布 Drawable:所有可见对象的描述,理解为:素材类 Bitmap:图片类 Canvas:画笔 Paint:画笔样式与颜色.特效的集合 近期很多网友对 ...

最新文章

  1. Codeforces 989C (构造)
  2. Python入门7_抽象进阶
  3. 封装类(Merry May Day to all you who are burried in work ~)---2017-05-01
  4. 《移动网页设计与开发 HTML5+CSS3+JavaScript》—— 1.4  真正的HTML5
  5. win32,使用PDFlib生成PDF文件
  6. JasperReport 默认打印机打印/指定打印机打印
  7. MATLAB实现偏最小,偏最小二乘法 matlab程序
  8. word总页数不包含封面_word2007插入页码怎么让总页数不算封面
  9. Wireshark网络流量分析工具
  10. 数据组织与存储(五)
  11. c语言怎么对大数求余,C语言:大数取余
  12. 微信如何做好服务器,如何用免费服务器做微信JS开发
  13. dwg格式转换成jpg图片
  14. 前端 - bootstrap树形菜单
  15. matlab课表编排程序实例,编排课程表的一点心得
  16. 关于pyrit安装失败最新解决
  17. java8 stream collectors.joining
  18. 安装 xorg-macros
  19. 纯js写的手机版古诗填空游戏
  20. 七.【Python3.8+Django3.0从零开始系列】Django3.0+Python3.8连接MySql8.0及遇到的问题解决

热门文章

  1. opendds协议服务器,OpenDDS 开发手册
  2. amesim2020安装
  3. ADB下载及常用命令
  4. autocad不能画图_学了这50条CAD技巧,画图速度提10倍!
  5. Mongodb(芒果DB)之服务搭建
  6. mangodb与mysql的区别
  7. 各种品牌进入Bios方式
  8. 苹果电脑驱动下载查询
  9. dcp9020cdn硒鼓!错误_打印机硒鼓错误是什么意思?故障解决【详解】
  10. SQL盲注及python脚本编写