1.创建一个APP Widget必要的元素
AppWidgetProviderInfo对象
AppWidgetProvider类
View Layout(视图布局)
RemoteView
5个Intent :
l ACTION_APPWIDGET_UPDATE,
l ACTION_APPWIDGET_DELETED,
l ACTION_APPWIDGET_ENABLED,
l ACTION_APPWIDGET_DISABLED,
l ACTION_APPWIDGET_CONFIGUR
2.APP Widget Action消息简介
l ACTION_APPWIDGET_UPDATE:当一个Widget被加入到桌面时,更新时间到了或是Widget配置Activity返回完成时,该Action被放入Intent以广播形式发送出来,这个广播消息告诉APP Widget框架需要更新Widget,然后框架就自动调用AppWidgetProvider的(OnUpdateContext,AppWidgetManager,int[])方法进行更新。
l ACTION_APPWIDGET_DELETED:当一个App Widget从App Widget host中被删除时,此Action被放入Intent以广播形式发送出去,这个广播消息告诉APP Widget框架,有Widget已经从APPWidgetHost中删除,然后框架自动调用AppWidgetProvider 的onDeleted(Context,int[])方法进行删除相应的Widget。
l ACTION_APPWIDGET_ENABLED:当一个实例App Widget首次被创建时,该Action被放入Intent以广播形式发送出来,然后框架自动调用AppWidgetProvider的onEnable(Context)方法,这个广播消息告诉APP Widget框架,有Widget实例已经被创建,状态为可用状态。
l ACTION_APPWIDGET_DISABLED:当最后一个App Widget实例被从App Widget host中删除时,该Action被放入Intent以广播形式发送出来,然后框架自动调用AppWidgetProvider的onDisable(Context)方法,这个广播消息告诉APP Widget框架,所有的Widget实例已经被删除,状态为不可用状态。
l ACTION_APPWIDGET_CONFIGUR:当AppWidgetProviderInfo对象指定了添加APP Widget时候的配置Activity(在xml中指定android:configure属性,其对应的是包中的一个Activity,作为配置功能的Activity),那么,在添加APP Widget到桌面时,该Action被放入Intent以正常形式启动一个Activity-- startActivity(intent)方式传递,开启配置Activity,当然,这个配置Activity也必须指定相应的Action过滤器。如:
<activity android:name="WidgetConfig">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
u 在开发过程中,我们只需要对AppWidgetProvider添加一个过滤Action的过滤器,该Action就是ACTION_APPWIDGET_UPDATE,而其他的Action,系统会自动过滤。
3.Android测试:无法使用System.out.println(""),但Android提供了下面两种方法。
l Android的Log机制:
下面介绍用Log的常规方法和另类方法进行跟踪测试。
Log有5类打印信息:有两种构造函数
Log.e("mydreamy", "nihao");//打印出错误日志信息
Log.d("mydreamy", "nihao");//打印出调试日志信
Log.i("mydreamy", "nihao",new Throwable());//打印出信息日志
Log.v(String Tag,String message,Throwable tr);//打印出详细日志信息
Log.w(String Tag,String message);//打印出警告日志信息
运行结果
.........
另外如果Log信息太多,会造成我们想要的信息找起来比较困难。这里可以在LogCat中添加过滤器,方法很简单就不介绍了。如图:
另外如果你不想在测试中反复删除Log测试语句(或把他注释掉,如://Log.e("mydreamy","nihao");则你可以把Log跟踪语句单独抽出来,写成个工具类,用一个静态Boolean变量作为开关:
import android.util.Log;
//封装好的LogCat工具类
public class LogUtil {
//锁,是否关闭Log日志输出
public static boolean LogOFF=false;
//五种Log日志类型
//调试日志类型
public static final int DEBUG=111;
//错误日志类型
public static final int ERROR =112;
//信息日志类型
public static final int INFO =113;
//详细信息日志类型
public static final int VERBOSE =114;
//警告日志类型
public static final int WARN =115;
//显示,打印日志
public static void LogShow(String Tag,String Message,int Style){
// TODO Auto-generated constructor stub
if(!LogOFF)
switch (Style) {
case DEBUG:{
Log.d(Tag, Message);
}
break;
case ERROR:{
Log.e(Tag, Message);
}
break;
case INFO:{
Log.i(Tag, Message);
}
break;
case VERBOSE:{
Log.v(Tag, Message);
}
break;
case WARN:{
Log.w(Tag, Message);
}
break;
default:
break;
}
}
}
当需要在某个类中测试时只要添加
LogUtil.LogShow("mydreamy", "nihao", LogUtil.DEBUG);
方法就行了,当测试通过只需要改一下LogUtil.LogOFF=true;
当然为了在logcat中查看方便,我们同样可以添加过滤器。
l 另外,还可以用Toast来打印输出文字,来测试。
如:
Toast.makeText(context, text, duration);