App Widgets是一种可以嵌入其它应用 并且可以周期性更新的小型应用。例如android的音乐播放器可以加到主界面中显示
添加一个App Widget可通过长按界面 选择Widget直接添加
要建立一个App Widgets 需要以下4个步骤
一,AppWidgetProvideinfo 用于定义appWidgetProvideinfo的元数据,需要定义为XML文件,
一般在res/下面新建个xml目录,然后新建example_appwidget_info.xml ,出现为定义的可删除
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="294dp" android:minHeight="72dp"
android:updatePeriodMillis="86400000"
android:previewImage="@drawable/preview"
android:initialLayout="@layout/example_appwidget"
//可不选 android:configure="com.lin.activity.AppWidgetActivity" //定义一个activity,在添加widget时调用"
android:resizeMode="horizontal|vertical"></appwidget-provider>
主要有以上属性 updatePeriodMills 为执行更新时间,1.5以后默认好像要半小时(测试下基本不能时时更新)
android:previewImage="@drawable/preview"和 android:resizeMode 3.0以上才能使用 定义显示图标
android:initialLayout="@layout/example_appwidget" 为该App Widget页面显示的内容
configure用于定义一个配置的 activity 例如当在主界面中插入MP3播放条时,可以先让用户选择设置的默认皮肤等
二,定义一个 layout来显示App Widget 需要显示的内容,以下为example_appwidget.xml 放在layout文件下
<?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="100dip"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#00ff33"
android:text="what a good day" />
</LinearLayout>
三, 需要在AndMainfest.xml中进行配置
在activity下加入
<receiver android:name="com.lin.activity.ExampleAppWidgetProvider" >
<intent-filter >
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/example_appwidget_info" />
</receiver>
App Widget 是通过广播机制进行传播的
eiver android:name 定义的AppWidgetProvider类
<action android:name 因为通过广播机制实现,所以 默认的action不能变,主要有
android:resource 调用一个appWidget
四, 定义一个AppWidgetProvider 得子类
public class ExampleAppWidgetProvider extends AppWidgetProvider {
//每次删除时调用
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
System.out.println("deleted");
super.onDeleted(context, appWidgetIds);
}
//删除最后一个App Widget时调用
@Override
public void onDisabled(Context context) {
System.out.println("disables");
super.onDisabled(context);
}
//添加第一个App Widget时调用
@Override
public void onEnabled(Context context) {
System.out.println("enabled");
super.onEnabled(context);
}
//每次添加时调用
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("receiver");
super.onReceive(context, intent);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
System.out.println("update");
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
}
以上即可实现一个最基本的App Widget
实现App Widget配置
二 当需要对一个选择的AppWidget进行配置时,只需要在example_appwidget_info.xml中加入
//可不选 android:configure="com.lin.activity.AppWidgetActivity" //定义一个activity,在添加widget时调用"
然后添加个activity 以下为AppWidgetActivity .java
public class AppWidgetActivity extends Activity {
/** Called when the activity is first created. */
private Button finishBtn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
finishBtn=(Button)this.findViewById(R.id.finishBtn);
finishBtn.setOnClickListener(buttonListener);
}
View.OnClickListener buttonListener=new View.OnClickListener() {
@Override
public void onClick(View v) {
//首先需要从Intent 中获得一个发送过来的AppWidgetManager ID,
Intent intent = getIntent();
int mAppWidgetId=0;
Bundle extras = intent.getExtras();
if (extras != null) {
mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
}
//通过AppWidgetManager.getInstance(AppWidgetActivity.this);获得一个实例对象
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(AppWidgetActivity.this);
//获取一个远程layout 然后通过updateAppWidget来更新
RemoteViews views = new RemoteViews(AppWidgetActivity.this.getPackageName(),
R.layout.example_appwidget);
//views.setTextViewText(需要操作的控件ID,设置的值内容)
appWidgetManager.updateAppWidget(mAppWidgetId, views);
//设置一个返回的Intent
Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
setResult(RESULT_OK, resultValue);
finish();
}
};
}
当需要通过App Widget界面上的控件发送消息时,例如Mp3 的播放暂停
可将ExampleAppWidgetInfo.java中的 onUpdate()修改为
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
System.out.println("onUpdate");
for(int i=0;i<appWidgetIds.length;i++){
//创建一个Intent对象
Intent intent=new Intent(context,AndroidTestActivity.class);
// 创建一个PendingIntent对象
PendingIntent pendingIntent=PendingIntent.getActivity(context,0,intent,0);
RemoteViews remoteViews=new RemoteViews(context.getPackageName(),R.layout.appwidget);
remoteViews.setOnClickPendingIntent(R.id.bindBtn,pendingIntent);
appWidgetManager.updateAppWidget(appWidgetIds[i],remoteViews);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
类似于前面点击配置的绑定