appwidget实现textview显示时间

来源:互联网 发布:isnull sql 编辑:程序博客网 时间:2024/05/17 08:57
activity

package test.widget;

import android.app.Activity;
import android.os.Bundle;

public class Widget_demo_2Activity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.firstappwidget);
}
}

fristappwidget.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>

<TextView
android:id="@+id/tv_msg"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:textSize="20sp"
android:textColor="#ff0000"
>

</TextView>
</LinearLayout>


Menifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="test.widget"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="8" />

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >


<receiver android:name=".MyAppWidgetProvider">
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/appwidget_provider"/>
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>

</receiver>
</application>

</manifest>

manifest中定义的receiver:MyAppWidgetProvider.java

package test.widget;

import java.util.ArrayList;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.net.Uri;
import android.widget.RemoteViews;


public class MyAppWidgetProvider extends AppWidgetProvider{
private static Timer mTimer;
// mAppWidgetArray 保存窗口部件实例的数组
private static ArrayList<int[]> mAppWidgetArray = new ArrayList<int[]>();

private static RemoteViews mRemoteViews;


// 当最后一个窗口部件实例被移除时调用
public void onDisabled(Context context) {
// TODO Auto-generated method stub
super.onDisabled(context);

stopTimerTask();
}



// 当第一个窗口部件实例被创建时调用
public void onEnabled(Context context) {
// TODO Auto-generated method stub
super.onEnabled(context);

startTimerTask(context);
}



// @Override
// public void onUpdate(Context context, AppWidgetManager appWidgetManager,
// int[] appWidgetIds) {
// super.onUpdate(context, appWidgetManager, appWidgetIds);
// int N = appWidgetIds.length;
// System.out.println("MyAppWidgetProvider onUpdate : " + N);
// for(int i = 0 ; i < N ; i++){
// int appWidgetId = appWidgetIds[i];
// System.out.println("appWidgetId : i = " + i + "appWidgetId = " + appWidgetId);
//// RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.firstappwidget);
// mRemoteViews = new RemoteViews(context.getPackageName(),R.layout.firstappwidget);
// System.out.println("views : " + mRemoteViews);
// java.text.DateFormat df = new java.text.SimpleDateFormat("hh:mm:ss");
// String date = df.format(new Date());
// System.out.println("date : " + date);
// mRemoteViews.setTextViewText(R.id.tv_msg, "当前时间:" + date);
// appWidgetManager.updateAppWidget(appWidgetId, mRemoteViews);
// System.out.println("更新。。。");
// updateAppWidget(context, appWidgetManager, appWidgetIds);
// addInstance(appWidgetIds);
// }
//
// }

// 窗口部件实例创建时调用
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
// TODO Auto-generated method stub
super.onUpdate(context, appWidgetManager, appWidgetIds);

updateAppWidget(context, appWidgetManager, appWidgetIds);

addInstance(appWidgetIds);
}

// 窗口部件实例删除时调用
public void onDeleted(Context context, int[] appWidgetIds) {
// TODO Auto-generated method stub
super.onDeleted(context, appWidgetIds);

removeInstance(appWidgetIds);
}

// 更新单个窗口部件实例
public static void updateAppWidget(Context context,
AppWidgetManager appWidgeManger, int []appWidgetIds) {

mRemoteViews = new RemoteViews(context.getPackageName(), R.layout.firstappwidget);

MyTimeAdapter timeAdapter = new MyTimeAdapter();
String timeString = timeAdapter.formatTime();
// String http = "http://192.168.170.34:7080/Analy/action/SynchroDataWeb!getLettersList.action?params={\"loginId\":\"test\"}";
// mRemoteViews.setUri(R.id.webview, "getLettersList", Uri.parse(http));
mRemoteViews.setTextViewText(R.id.tv_msg, timeString);
// mRemoteViews.addView(viewId, nestedView)
// mRemoteViews.setUri(viewId, methodName, value)

appWidgeManger.updateAppWidget(appWidgetIds, mRemoteViews);

}

// 更新所有窗口部件实例
public static void RefreshAllWidget(Context context){

AppWidgetManager appWidgetManger = AppWidgetManager.getInstance(context);
int instanceCount = mAppWidgetArray.size();

for(int i = 0; i < instanceCount; i++){
int[] appWidgetIds = mAppWidgetArray.get(i);
updateAppWidget(context, appWidgetManger, appWidgetIds);
}
}

// 增加窗口部件实例
public static void addInstance(int[] appWidgetIds){
if (mAppWidgetArray != null){
mAppWidgetArray.add(appWidgetIds);
}

}

// 删除窗口部件实例
public static void removeInstance(int[] appWidgetIds){
if (mAppWidgetArray != null){
mAppWidgetArray.remove(appWidgetIds);
}

}

// 开启刷新窗口部件的定时器
public static void startTimerTask(final Context context){

if (mTimer == null){
mTimer = new Timer();

TimerTask mTimerTask = new TimerTask() {

@Override
public void run() {
// TODO Auto-generated method stub
MyAppWidgetProvider.RefreshAllWidget(context);
}
};

mTimer.schedule(mTimerTask, 0, 1000);
}
}

// 关闭刷新窗口部件的定时器
public static void stopTimerTask(){

if (mTimer != null){
mTimer.cancel();
mTimer = null;
}
}

}

menifest中指定的resource:在res文件夹下新建xml文件夹,新建appwidget_provider.xml

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="200dp"
android:minHeight="30dp"
android:updatePeriodMillis="1000"
android:initialLayout="@layout/firstappwidget"/>


说明:在如上xml中定义的android:updatePeriodMillis属性据说在android2.2以下版本才会生效,用来设置每隔多长时间刷新appwidget.
android2.2(包括)以上版本无效,所以在MyAppWidgetProvider中使用Timer、TimerTask来实现时间的刷新
原创粉丝点击