其实创建一个widget很简单。这里就做了一个简单的demo,作为学习记录。
首先在AndroidManifest.xml中添加如下部分
一个widget其实就是一个receiver
<receiver android:name="WidgetProvider">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<intent-filter>
<action android:name="org.yangzc.widget.fresh"></action>
</intent-filter>
<meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget_provider"></meta-data>
</receiver>
WidgetProvider.java部分代码如下:
provider需要继承自AppWidgetProvider,这个例子是定时更新widget内容。
package org.yangzc.widget;
import java.util.Calendar;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.RemoteViews;
public class WidgetProvider extends AppWidgetProvider {
private String fresh = "org.yangzc.widget.fresh";
private Context context;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {
Log.d("d","onUpdate");
// super.onUpdate(context, appWidgetManager, appWidgetIds);
this.context = context;
for(int i=0; i<appWidgetIds.length; i++){
int appWidgetId = appWidgetIds[i];
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main);
views.setTextViewText(R.id.thread, i+":Sdfsdfsdf");
appWidgetManager.updateAppWidget(appWidgetId, views);
}
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main);
views.setTextViewText(R.id.thread, ":Sdfsdfsdf");
appWidgetManager.updateAppWidget(appWidgetIds[0], views);
new MyThread().start();
}
@Override
public void onReceive(Context context, Intent intent) {
Log.d("d","onReceive");
super.onReceive(context, intent);
String action = intent.getAction();
if(fresh.equals(action)){
RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.main);
Calendar cal=Calendar.getInstance();
System.out.println(cal.getTime().toLocaleString());
views.setTextViewText(R.id.thread, cal.getTime().toLocaleString());
ComponentName thisWidget = new ComponentName(context,WidgetProvider.class);
AppWidgetManager.getInstance(context).updateAppWidget(thisWidget, views);
}
}
class MyThread extends Thread{
public MyThread(){
}
@Override
public void run() {
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Intent intent = new Intent(fresh);
context.sendBroadcast(intent);
}
}
}
}
main.xml
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView android:id="@+id/thread" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="@string/hello" />
</LinearLayout>
appwidget_provider.xml
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minHeight="72px" android:minWidth="72px"
android:updatePeriodMillis="3800000" android:initialLayout="@layout/main">
</appwidget-provider>