Android桌面组件Widge开发是一种很小的应用程序,每一个Widget就是一个BroadcastReceiver,然而最重要尤其是相关注册, 下面是本次代码核心注册
</activity>
<activity android:name=".TargetActivity" android:label="TargetActivity"></activity>
<receiver android:name="AppwidgetTest">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<intent-filter>
<action android:name="zzy.appwidget03.UPDATE_APP_WIDGET" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/appwidget_info" />
</receiver>
</application>
注册其中 metadata来描述Widget的细节,appwidget_info是我门要要编写描述Widget下面将会提到解释TargetActivity使我新建的一个Activity 用来当我点击桌面widget中的Button时跳转的页面的Activity 其余 的都是必不可少的申明!
。
首先 现在新建一个XMl包在Layout中,里面添加一个XMl文件 为appwidget_info文件用来设置桌面上的widget里面的内容设置桌面组件的属性:
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="100dp"
android:minHeight="50dp"
android:updatePeriodMillis="86400000"
android:initialLayout="@layout/appwidget"
>
</appwidget-provider>
android:minWidth,android:minHeight,android:updatePeriodMillis
分别是指桌面组件的最小宽度和最小高度,最后一个表示其自动更新的时间
上面的appwidget是在layout中新建的一个XML文件 具体设置
桌面组件的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/widgetTextId"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="widget test"
android:background="#000000"
/>
<ImageView
android:id="@+id/imageId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon_sina"
/>
<Button
android:id="@+id/button1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="测试按钮"
/>
<Button
android:id="@+id/button2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="更换图片"
/>
</LinearLayout>
然后要建立一个widget,创建一个类,让其继承AppWidgetProvider,在AppWidgetProvider中有许多方法onUpdate,onDelete,onEnabled,onDisabled方法要知道这些方法 的用处:代码
public class AppwidgetTest extends AppWidgetProvider
{
private static final String UPDATE__ACTION="zzy.appwidget03.UPDATE_APP_WIDGET";
public void onReceive(Context context, Intent intent)
{
// TODO Auto-generated method stub
String action=intent.getAction();
if (action.equals(UPDATE__ACTION))
{
//先得到remoteView
RemoteViews remoteViews=new RemoteViews(context.getPackageName()
, R.layout.appwidget);
//更新图面显示
remoteViews.setImageViewResource(R.id.imageId,R.drawable.icon_twitter);
remoteViews.setTextViewText(R.id.widgetTextId, "你好");
AppWidgetManager appWidgetManager=AppWidgetManager.getInstance(context);
// 得到整个widget
ComponentName componentName=new ComponentName(context,AppwidgetTest.class);
//开始更新widget
appWidgetManager.updateAppWidget(componentName, remoteViews);
}
else {
super.onReceive(context, intent);
}
}
其中这次我是通过广播机制,当我们点击下面方法中的Button(变换图片)的时候,我设置此时的按钮当以广播的形式发送,通过上面Activity中receive()方法来接受Intent类型 先得到整个Widget 然后通过updateAppWidget方法构建一个remoteVtew用来对整个组件的更新,上面的代码最终要的还有ComponentName来表示应用程序组件的名字
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
Intent intent=new Intent();
Intent intent2=new Intent(context,TargetActivity.class);
intent.setAction(UPDATE__ACTION);
//设置pendingIntent 得到相关Intent信息
PendingIntent pendingIntent=PendingIntent.getBroadcast(context,-1, intent, 0);
PendingIntent pendingIntent2=PendingIntent.getActivity(context,0, intent2, 0);
//得到当前从context 得到设置的桌面组件
RemoteViews remoteViews=new RemoteViews(context.getPackageName(),R.layout.appwidget);
//设置监听器 第一个为button1 第二个人设置调专页面的pendingIntent
remoteViews.setOnClickPendingIntent(R.id.button2, pendingIntent);
remoteViews.setOnClickPendingIntent(R.id.button1, pendingIntent2);
//更新AppWidget
//第一个参数用于指定被更新AppWidget的ID
appWidgetManager.updateAppWidget(appWidgetIds,remoteViews);
System.out.println("onupdate");
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
System.out.println("onDeleted");
super.onDeleted(context, appWidgetIds);
}
@Override
public void onDisabled(Context context) {
System.out.println("onDisabled");
super.onDisabled(context);
}
@Override
public void onEnabled(Context context) {
System.out.println("onEnabled");
super.onEnabled(context);
}
}
上面的代码是AppWidget组基本的应用 也是我们必须掌握的内容,定义俩个按钮,分别对俩个按钮设置俩个Intent,然后是PendingIntent的应用,个人感觉这个PendingIntent的应用就像是对Intent的包裹一样,当我们用到的时候再将其拿出来应用,俩个PendingIntent分别对应着俩个不同Action。RemoteViews被包装成一个layout和一些特定的内容发送并显示到桌面上。
最后,整体感觉AppWidget 用处就是像那个播放歌曲的后台显示信息或者是日历事件一类,然后自己可以对拖到桌面上显示的那个进行操作。