您的位置:首页 > 移动开发 > Android开发

Android桌面组件Widge开发及应用

2012-07-10 10:44 225 查看
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
用处就是像那个播放歌曲的后台显示信息或者是日历事件一类,然后自己可以对拖到桌面上显示的那个进行操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: