使用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不用做任何修改