今天学习了AppWidgetProvider 这个东西,很好耍,和大家分享一下,它主要用于开发桌面程序,可以看看。
下面讲下怎样实现:
1,编写一个类继承AppWidgetProvider 类
AppWidgetProvider 类继承了BroadcastRecevier类,可以复写onUpdate、onReceive、onEnabled、onDisabled、onDeleted方法,其中这红色两个方法最为常用,onReceive方法就是接收广播的方法。
其中还有很重要的类是:
AppWidgetManager:负责管理 AppWidget ,向 AppwidgetProvider 发送通知,它有哪些方法这里就不在叙述了。
RemoteViews :一个可以在其他应用进程中运行的类,向 AppWidgetProvider 发送通知。
2,配置AndroidManifest.xml
在<receiver>里注册一下,这个几乎不的变的
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/widget_provider" />
当然你要用到广播接收方法的话还必须在同一个receiver中注册广播
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>
</intent-filter>
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
3,建立文件res/xml,放widget_provider.xml
这个主要是指定该程序的大小,样式等。
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="294dp" android:minHeight="100dp"
android:updatePeriodMillis="10000" android:initialLayout="@layout/main"
/>
<!-- android:initialLayout="@layout/main"此句为指定桌面组件的布局文件。
-->
4,剩下就简单了,写个布局文件配置程序里面的结构。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:background="@drawable/bg">
<TextView android:id="@+id/sender"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/sender"
android:textSize="12px"
android:textColor="#7779e5" />
<TextView android:id="@+id/msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/msg"
android:textSize="12px" />
<TextView android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/time"
android:textSize="12px" />
</LinearLayout>
下面就看看是怎么实现短信在桌面实现的:直接上代码。
AppWidgetProvider 类
import java.text.SimpleDateFormat;
import java.util.Date;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.RemoteViews;
public class TextWidget extends AppWidgetProvider {
public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
RemoteViews remoteviews;
// 每次更新都调用一次该方法
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
// 每删除一个就调用一次
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
super.onDeleted(context, appWidgetIds);
}
// 当最后一个该Widget删除时调用该方法
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
}
// 当Widget第一次被添加到桌面时调用该方法,可添加多次但只是第一次调用
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
}
// 每接收一次广播消息就调用
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(SMS_RECEIVED_ACTION)) {
Bundle bundle = intent.getExtras();
Object[] pdus = (Object[]) bundle.get("pdus");
for (Object pdu : pdus) {
SmsMessage message = SmsMessage.createFromPdu((byte[]) pdu);
String sender = message.getOriginatingAddress();
String content = message.getMessageBody();
Date date = new Date(message.getTimestampMillis());
SimpleDateFormat farmat = new SimpleDateFormat();
String time = farmat.format(date);
if (remoteviews == null) {
remoteviews = new RemoteViews(context.getPackageName(),
R.layout.main);
}
remoteviews.setTextViewText(R.id.sender, sender);
remoteviews.setTextViewText(R.id.msg, content+"\n");
remoteviews.setTextViewText(R.id.time, "接收时间"+time);
AppWidgetManager appWidgetManger = AppWidgetManager
.getInstance(context);
int[] appIds = appWidgetManger
.getAppWidgetIds(new ComponentName(context,
TextWidget.class));
appWidgetManger.updateAppWidget(appIds, remoteviews);
}
}
super.onReceive(context, intent);
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.apps" android:versionCode="1" android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<receiver android:name=".TextWidget" android:label="@string/app_name">
<!-- 这个是接收广播时的过滤器 Android定义的 -->
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>
</intent-filter>
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/widget_provider" />
</receiver>
</application>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
</manifest>
总结:其实桌面程序也不难,主要就是AppWidgetProvider、AppWidgetManager和RemoteViews三类的使用,方法也不多,就是配置麻烦了点,稍不注意就错了。希望对大家有帮助......