Android中小部件的使用
来源:互联网 发布:mysql中删除一个字段 编辑:程序博客网 时间:2024/04/29 16:48
定义
Android中提供了AppWidgetProvider类为实现桌面小部件,AppWidgetProvider继承了BroadcastReceiver,所以它本质上是一个广播。
常用方法
AppWidgetProvider类有几个常用的重要方法,它们会自动地在广播接收后的onReceive方法里在特定的条件下被调用,这些方法有:
onEnable 当小部件第一次添加到桌面时调用该方法,小部件可以添加多次但该方法只会在第一次添加时调用。
onUpdate 小部件被添加时或每次自动更新时都会调用一次该方法。
onDeleted 每删除一次桌面小部件就调用一次。
onDisabled 当最后一个该类型的桌面小部件被删除时调用该方法。
示例
1、定义小部件界面
新建XML文件:res/layout/app_widget.xml:
<?xml version="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/sunny" /> <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:textSize="30dp" android:text="天晴"/></LinearLayout>
2、定义小部件配置信息
新建XML文件:res/xml/appwidget_provider_info.xml:
<?xml version="1.0"encoding="utf-8"?><appwidget-providerxmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/app_widget" // 初始化布局文件 android:minHeight="230dp" // 最小尺寸 android:minWidth="225dp" // 最小尺寸 android:updatePeriodMillis="10000" > // 自动更新周期(SDK1.6及以上版本,小于30分钟的话,系统自动当30分钟)</appwidget-provider>
3、定义小部件实现类
public class AppWidgetProvider extendsandroid.appwidget.AppWidgetProvider { public static final String CLICK_ACTION ="com.example.action.CLICK"; private int[] mImageIds = { R.drawable.sunny, R.drawable.rain,R.drawable.cloudy }; private String[] mTexts = { "天晴", "小雨","多云" }; public AppWidgetProvider() { super(); } @Override public void onReceive(final Context context, Intent intent) { super.onReceive(context, intent); if (intent.getAction().equals(CLICK_ACTION)) { AppWidgetManager appWidgetManager =AppWidgetManager.getInstance(context); onWidgetUpdate(context, appWidgetManager, -1, new ComponentName(context,AppWidgetProvider.class)); } } @Override public void onEnabled(Context context) { super.onEnabled(context); } /** * 每次窗口小部件被点击更新都调用一次该方法 */ @Override public void onUpdate(Context context, AppWidgetManagerappWidgetManager, int[] appWidgetIds) { super.onUpdate(context, appWidgetManager, appWidgetIds); final int counter = appWidgetIds.length; for (int i = 0; i < counter; i++) { int appWidgetId = appWidgetIds[i]; onWidgetUpdate(context, appWidgetManager, appWidgetId, null); } } @Override public void onDeleted(Context context, int[]appWidgetIds) { super.onDeleted(context, appWidgetIds); } @Override public void onDisabled(Context context) { super.onDisabled(context); } /** * 小部件更新 * * @param context * @param appWidgeManger * @param appWidgetId * @param provider */ private void onWidgetUpdate(Context context, AppWidgetManagerappWidgeManger, int appWidgetId, ComponentName provider) { // 生成0~2的随机数,用于随机转换天气 Random random = new Random(); int index = random.nextInt(3); // 用于图标点击的意图 Intent intentBroadcast = new Intent(); intentBroadcast.setAction(CLICK_ACTION); PendingIntent pendingIntentBroadcast = PendingIntent.getBroadcast(context,0, intentBroadcast, PendingIntent.FLAG_UPDATE_CURRENT); // 用于文字点击的意图 Intent intentActivity = new Intent(context, MainActivity.class); PendingIntent pendingIntentActivity = PendingIntent.getActivity(context,0, intentActivity, PendingIntent.FLAG_UPDATE_CURRENT); // 定义RemoteViews布局 RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.app_widget); remoteViews.setImageViewBitmap(R.id.imageView1,BitmapFactory.decodeResource(context.getResources(), mImageIds[index])); remoteViews.setTextViewText(R.id.textView1, mTexts[index]); remoteViews.setOnClickPendingIntent(R.id.imageView1,pendingIntentBroadcast); remoteViews.setOnClickPendingIntent(R.id.textView1,pendingIntentActivity); if (appWidgetId == -1 && remoteViews != null) { appWidgeManger.updateAppWidget(provider, remoteViews); } else { appWidgeManger.updateAppWidget(appWidgetId,remoteViews); } }}
4、因为是广播,所以最后别忘了在AndroidManifest.xml中声明小部件
<receiverandroid:name=".AppWidgetProvider" > <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget_provider_info" > </meta-data> <intent-filter> <action android:name="com.example.action.CLICK" /> <actionandroid:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter></receiver>
效果
说明
1、上面示例小部件做了一个演示和当单击图片会随机切换一种天气展示,当单击文字时会打开MainActivity
2、当小部件单击后切换天气展示则是通过更新RemoteView来实现的
3、AndroidManifers.xml中有两个Action,其中第一个Action用于识别小部件的单击行为,而第二个Action是系统的规范,作为小部件的标识而必须存在
4、SDK1.6及以上版本,自动更新最小间隔为30分钟。所以如果您APP需要高频更新小部件,例如像时钟小部件那样,一般需要一分种刷新一次的话,则需要自己通过服务来刷新时间的显示
- Android中小部件的使用
- android中小部件PopupWindow
- Android中TabHost部件使用
- Android RemoteViews的基本使用(下)之窗口小部件
- Android Widget 小部件(二) 使用configure
- Android Widget 小部件(二) 使用configure
- Android 系列 6.13使用卡片小部件
- android 窗口小部件 的实现
- Android 桌面小部件(AppWidgetProvider)的应用
- android 窗体小部件的制作
- XCELSIUS例子---柱形图部件的使用
- Qt部件----按钮,标签,表的使用
- 窗口小部件的使用AppWidget
- Tkinter中使用IDLE的Tree部件
- jQuery UI -- widgets各种部件的使用
- Qt C++ 小部件 QCustomPlot 的使用
- android中小常识
- Android中小功能总结
- Ubuntu16下的ThensorFlow环境配置(GPU加速)
- 全面理解Javascript的面向对象(二)--创建对象与继承
- 日记
- 35 个 Java 代码性能优化总结
- python numpy教程
- Android中小部件的使用
- Android aar的生成与使用说明
- Vue路由开启keep-alive时的注意点
- 过滤器(filter)入门
- 【面试必读(编程基础)】几种常用的设计模式介绍
- POJ2479&OpenJudge1481 Maximum sum
- 页面置换算法
- Python爬虫入门
- 1 最大子列和问题