android开发之Widget AppWidgetProvider 桌面短信

今天学习了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;

	// 每次更新都调用一次该方法
	@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三类的使用,方法也不多,就是配置麻烦了点,稍不注意就错了。希望对大家有帮助......

你可能感兴趣的:(android,Date,String,layout,action,encoding)