Widgets基础篇(中)

转载 2012年03月24日 11:42:31
文章参照自:http://developer.android.com/guide/topics/appwidgets/index.html
六、如何使用AppWidgetProvider
AppWidgetProvider继承于BroadcastReceiver,它对App Widget的广播进行了简单分类,并封装了处理的统一接口,以方便使用。
AppWidgetProvider只接受和App Widget相关的广播,比如App Widget更新, 被删除, enabled, 和disabled的广播.
当收到以上广播后,将分别调用以下的函数:
当系统以AppWidgetProviderInfo中的updatePeriodMillis定义的频率请求更新App Widget时,将调用该函数。
如果没有定义configuration Activity ,当用户添加该App Widget时,也会调用该函数,此时可以做些初始化工作,比如设置View的事件监听者,启动一个临时Service。如果定义了configuration Activity的话,你需要在configuration Activity完成时,发送Intent到AppWidgetProvider来进行该函数的调用.
当App Widget在App Widget Host(比如Home Screen)移除时,将调用该函数.
如果用户向App Widget Host(比如Home Screen)加入App Widget时,在App widget Host中还没有你的App Widget实例,就会调用该函数.。在该函数中可以做些初始话工作,如果你想打开一个数据库连接或其它对多个App Widget实例,只执行一次的操作。
如果用户把App Widget从App Widget Host(比如Home Screen)中移除时,它是App widget Host中的唯一的该App Widget实例的话,就会调用该函数.在该函数你可以清理在onEnabled(Context)中做的工作,比如清理临时的数据库。
在收到任何广播时,该函数都会被调用,而且在以上几个函数被调用前进行。一般来说你不用重载该函数。AppWidgetProvider已经提供了默认的实现,它对广播进行分类,并调用上面几个其对应的回调函数(即上面的onUpdate()等)。
注意:在Android1.5中,有onDeleted()函数不能被调用的BUG。为解决这个BUG,你可以参照Group post中的描述,重写onReceive()方法以便onDeleted()函数能经常正常调用。其代码请参照示例2.1.
示例2.1:
@Override
public void onReceive(Context context, Intent intent) {
    final String action = intent.getAction();
    if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) {
        final int appWidgetId = extras.getInt
(AppWidgetManager.EXTRA_APPWIDGET_ID,
                AppWidgetManager.INVALID_APPWIDGET_ID);
        if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
            this.onDeleted(context, new int[] { appWidgetId });
        }
    } else {
        super.onReceive(context, intent);
    }

}
onUpdate()是AppWidgetProvider中最重要的回调函数。因为如果你没定义configuration Activity的话,在App Widget被加入到App Widget Host时该函数就会被调用。如果你的App Widget还要与用户进行交互的话,那么才需要设置用户事件的监听者,并处理其事件。如果你的App Widget不需要创建临时的文件或数据库的话,或其他一些需要清理的工作的话,onUpdate()函数可能是唯一的一个需要你重载的回调函数。
如果你想在App Widget中,让用户点击一个按钮就启动一个Activity的话,可以参照如下的代码:
示例3
public class ExampleAppWidgetProvider extends AppWidgetProvider {

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        final int N = appWidgetIds.length;

        // Perform this loop procedure for each App Widget that belongs to this provider
        for (int i=0; i<N; i++) {
            int appWidgetId = appWidgetIds[i];

            // Create an Intent to launch ExampleActivity
            Intent intent = new Intent(context, ExampleActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

            // Get the layout for the App Widget and attach an on-click listener
            // to the button
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);
            views.setOnClickPendingIntent(R.id.button, pendingIntent);

            // Tell the AppWidgetManager to perform an update on the current app widget
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }
}
在这个AppWidgetProvider中我们只重载了onUpdate()一个回调函数。在该函数中,我们定了一个用于启动一个Activity的PendingIntent,并通过setOnClickPendingIntent(int, PendingIntent)该PendingIntent附在App Widget的一个按钮上 。注意我们是在一个循环中appWidgetIds这个数组的每项依次进行操作的,该数组包括了通过该AppWidgetProvider创建的所有App Widget实例的id.通过该方法用户可以创建App Widget的多个实例,并同时对它们进行更新。然而,只有一个App Widget实例的updatePeriodMillis的schedule来对所有的该App Widget的实例的更新进行管理。比如,一个App Widget的更新schedue是2小时一次,我首先添加了它的一个实例,然后隔了一个小时,又添加它的一个实例,这时它的更新还是通过第一个App Widget的更新schedue来处理,第二个将被忽略掉(他们将每隔两小时更新,而不是两个更新schedue叠加变成每隔一小时)
注意:因为AppWidgetProvider扩展自BroadcastReceiver, 所以,你不能保证回调函数完成调用后,AppWidgetProvider还在继续运行。
(关于BroadcastReceiver的生命周期的更多内容请参考BroadcastReceiver),如果你的App Widget的初始化需要多达几秒的时间(比如需要进行WEB请求),而且希望AppWidgetProvider的进程能够长久运行,那么你可以考虑在onUpdate() 中启动一个Service。
在这个Service,你可以更新你的App Widget,这样就不用担心AppWidgetProvider因为ANR错误而被迫关闭。
关于在App Widget中使用Service的示例请参考《Widgets基础篇附件1(WordWidget.java)
关于App Widget的简单使用请参考Widgets基础篇附件2(ExampleAppWidgetProvider.java)
七、接收App Widget的broadcast Intents广播
AppWidgetProvider扩展自BroadcastReceiver,它对App Widget的广播进行了简单分类,并封装了处理的统一接口,以方便使用。
你可以自己实现一个BroadcastReceiver,重写它的onReceive(Context, Intent) 方法,在里面处理以下的几个Intent:

Widgets基础篇(中)

文章参照自:http://developer.android.com/guide/topics/appwidgets/index.html 六、如何使用AppWidgetProvider AppW...
  • hudashi
  • hudashi
  • 2011年12月11日 10:47
  • 918

Java 之JNI基础篇(一)

JNI,即Java Native Interface。它其实就是一套java与本地代码交互的接口或者说是一个协议。通俗的比喻,就是中国人讲中国话,日本人讲日本话,于是中国人碰到日本人,各说各话,无法交...
  • yingshukun
  • yingshukun
  • 2018年01月13日 18:51
  • 10028

Widgets基础篇(下)

文章翻译整理自:http://developer.android.com/guide/topics/appwidgets/index.html 八,如何编写App Widget Configurat...
  • hudashi
  • hudashi
  • 2011年12月11日 10:47
  • 1319

JAVA语言程序设计(基础篇)第十版

Queue类 import java.util.Arrays; public class Queue { private int[] element; private int size=8; Queu...
  • summerdream_
  • summerdream_
  • 2017年07月04日 09:06
  • 713

Widgets基础篇(上)

文章参照自:http://developer.android.com/guide/topics/appwidgets/index.html 一、前言 所谓App Widgets就是微型应用程序...
  • hudashi
  • hudashi
  • 2011年12月11日 10:46
  • 1865

Widgets基础篇

一、前言 所谓App Widgets就是微型应用程序的意思,它可以嵌入在其他应用程序(如主屏幕),并能定期更新其View。 这些View被当成用户界面的小部件,您可以使用App Widget pr...
  • sergeycao
  • sergeycao
  • 2012年11月17日 09:48
  • 400

java语言程序设计基础篇第十一章编程练习题

1package yongheng; import java.util.Scanner;public class Main { public static void main(String a...
  • gyhguoge01234
  • gyhguoge01234
  • 2016年09月08日 22:19
  • 2350

Java语言程序设计(基础篇)原书第十版 课后习题 第三章

// 3.11 Scanner input = new Scanner(System.in); System.out.print("Enter a month and a year:");...
  • zjjoebloggs
  • zjjoebloggs
  • 2015年10月06日 21:58
  • 7682

Java语言程序设计(基础篇)原书第十版 课后习题 第四章

import java.util.Scanner; public class Code_Practice_4 { public static void main(String[] args) {...
  • zjjoebloggs
  • zjjoebloggs
  • 2015年10月12日 09:24
  • 3494

鸟哥的Linux私房菜 基础学习篇(第三版)

第零章 计算器概论 1 计算机:辅助人脑的好工具 接收用户指令与数据,经由中央处理器的数学与逻辑单元运算处理后,以产生或存储成有用的信息。 1.1 计算器的五大单元 输入单元,CPU控制单元,CPU算...
  • niuzhihuan
  • niuzhihuan
  • 2015年08月03日 20:17
  • 1020
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Widgets基础篇(中)
举报原因:
原因补充:

(最多只允许输入30个字)