读书人

施用AppWidget进行广播更新

发布时间: 2013-10-08 16:46:23 作者: rapoo

使用AppWidget进行广播更新

施用AppWidget进行广播更新

施用AppWidget进行广播更新

施用AppWidget进行广播更新

使用AppWidget进行广播

android.appwidget包中定义的类:

1、 AppWidgetProvider:定义了AppWidget的基本操作,需要通过子类进行设置;

2、 AppWidgetProviderInfo:AppWidget组件的元数据提供者,例如:组件的大小、更新的时间等;

3、 AppWidgetHostView:创建AppWidget的View显示,些为真正的View,与之对应的还有一个RemoteView;

4、 AppWidgetHost:监听AppWidget的服务以及创建AppWidgetHostView

5、 AppWidgetManager:用于更新相应的AppWidget。

将本程序安装后,按Home键回到手机桌面,长按桌面后出现上下文对话框,此时选择“窗口小部件”,接着找到我们安装的程序,

我这里的程序名称为“桌面显示组件”,这样在我们的手机桌面上就出现了程序的快捷方式,我们一按此快捷方式就可以进行更新了。

本列子说明了如何进行按钮的更新,但是一般不会对按钮进行更新,本列子只为说明更新的方法。

在res/drawable-hdpi下加入一张名为button和一张名为button2的图片以供使用。

定义一个继承AppWidgetProvider的类MyAppWidget,代码如下:

package com.li.appwidget;

import android.annotation.SuppressLint;

import android.app.PendingIntent;

import android.appwidget.AppWidgetManager;

import android.appwidget.AppWidgetProvider;

import android.content.ComponentName;

import android.content.Context;

import android.content.Intent;

import android.widget.RemoteViews;

@SuppressLint("ParserError")

public class MyAppWidget extends AppWidgetProvider {

@Override

public void onReceive(Context context, Intent intent) {

if("com.li.action.MYAPPWIDGET_UPDATE".equals(intent.getAction())){

RemoteViews remote = new RemoteViews(context.getPackageName(),

R.layout.liyewen_appwidget);

remote.setImageViewResource(R.id.img, R.drawable.button2);

remote.setTextViewText(R.id.but, "按钮被更新了"); //更新按钮上的文字

AppWidgetManager appWidgetManager = AppWidgetManager

.getInstance(context);

ComponentName componentName = new ComponentName(

context,MyAppWidget.class);

appWidgetManager.updateAppWidget(componentName, remote);

}

else{

super.onReceive(context, intent);

}

}

@Override

public void onUpdate(Context context, AppWidgetManager appWidgetManager,

int[] appWidgetIds) {

Intent intent = new Intent();

intent.setAction("com.li.action.MYAPPWIDGET_UPDATE");

PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,

intent, PendingIntent.FLAG_UPDATE_CURRENT);

RemoteViews remote = new RemoteViews(context.getPackageName(),

R.layout.liyewen_appwidget);

remote.setOnClickPendingIntent(R.id.but, pendingIntent);

appWidgetManager.updateAppWidget(appWidgetIds, remote);

}

}

在res下新建xml文件夹,并在xml下新建一个资源配置文件liyewen_appwidget.xml,

此文件用于读取AppWidgetProvider的配置信息,代码如下:

<appwidget-provider

xmlns:android="http://schemas.android.com/apk/res/android"

android:minHeight="80dp"

android:minWidth="300dp"

android:updatePeriodMillis="6000"

android:initialLayout="@layout/liyewen_appwidget">

</appwidget-provider>

在layout文件夹中新建布局文件liyewen_appwidget.xml

此布局文件用于以后桌面组件的显示,代码如下:

<RelativeLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:gravity="center_horizontal">

<ImageView

android:id="@+id/img"

android:layout_width="160dp"

android:layout_height="40dp"

android:src="@drawable/button"/>

<Button

android:id="@+id/but"

android:layout_width="160dp"

android:layout_height="40dp"

android:background="#00000000"

android:text="按我更新按钮"

android:textColor="#ffffff"/>

</RelativeLayout >

修改AndroidManifest.xml文件,将之前在res/xml文件夹中配置的文件定义在广播之中。

增加的部分为:

<receiver android:name=".MyAppWidget">

<intent-filter >

<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>

</intent-filter>

<intent-filter >

<action android:name="com.li.action.MYAPPWIDGET_UPDATE"/>

</intent-filter>

<meta-data

android:name="android.appwidget.provider"

android:resource="@xml/liyewen_appwidget"/>

</receiver>

整个AndroidManifest.xml文件为(我用的SDK是最新的,所以AndroidManifest.xml文件会有些不同):

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.li.appwidget"

android:versionCode="1"

android:versionName="1.0" >

<uses-sdk

android:minSdkVersion="8"

android:targetSdkVersion="15" />

<application

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

<activity

android:name=".MyAppWidgetDemo"

android:label="@string/title_activity_my_app_widget_demo" >

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

<receiver android:name=".MyAppWidget">

<intent-filter >

<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>

</intent-filter>

<intent-filter >

<action android:name="com.li.action.MYAPPWIDGET_UPDATE"/>

</intent-filter>

<meta-data

android:name="android.appwidget.provider"

android:resource="@xml/liyewen_appwidget"/>

</receiver>

</application>

</manifest>

主Activity(MyAppWidgetDemo.java)的代码如下:

package com.li.appwidget;

import android.os.Bundle;

import android.app.Activity;

import android.view.Menu;

import android.view.MenuItem;

import android.support.v4.app.NavUtils;

public class MyAppWidgetDemo extends Activity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

}

}

主布局文件main.xml不用做任何修改



读书人网 >移动开发

热点推荐