android开发之Widget AppWidgetProvider 桌面短信

来源:互联网 发布:淘宝有香烟黑鬼买吗 编辑:程序博客网 时间:2024/05/20 03:04

今天学习了AppWidgetProvider 这个东西,很好耍,和大家分享一下,它主要用于开发桌面程序,可以看看。

下面讲下怎样实现:

1,编写一个类继承AppWidgetProvider 类

        AppWidgetProvider 类继承了BroadcastRecevier类,可以复写onUpdate、onReceiveonEnabled、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;// 每次更新都调用一次该方法@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {super.onUpdate(context, appWidgetManager, appWidgetIds);}// 每删除一个就调用一次@Overridepublic void onDeleted(Context context, int[] appWidgetIds) {super.onDeleted(context, appWidgetIds);}// 当最后一个该Widget删除时调用该方法@Overridepublic void onDisabled(Context context) {super.onDisabled(context);}// 当Widget第一次被添加到桌面时调用该方法,可添加多次但只是第一次调用@Overridepublic void onEnabled(Context context) {super.onEnabled(context);}// 每接收一次广播消息就调用@Overridepublic 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三类的使用,方法也不多,就是配置麻烦了点,稍不注意就错了。希望对大家有帮助......

原创粉丝点击