app widget 是一个迷你的application 视图,可以被嵌入到其他应用中,例如放到桌面上.可以定期的更新UI。可以包换其他app widget的application叫做app widget host.
定义一个app widget,你需要做下面三步。
新建一个appWidgetProvideInfo 对象:描述app widget的元数据,例如app widget的布局,更新频率。APPWidgetProvideInfo 应该在想xml文件中.
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="40dp"
android:minHeight="40dp"
android:updatePeriodMillis="86400000"
android:previewImage="@drawable/preview"
android:initialLayout="@layout/example_appwidget"
android:configure="com.example.android.ExampleAppWidgetConfigure"
android:resizeMode="horizontal|vertical"
android:widgetCategory="home_screen">
</appwidget-provider>
新建一个APPWidgetProvide 类,定义APPWidget 提供的基本功能,一般是brodcast的子类,可以解释appwidget的更新/使能/删除广播.一般在manifest文件中定义,如下所示
<receiver android:name="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>
AppWIdgetProvide是BroadCastReceive的子类来接受app widget的广播信息.
void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions)
void onDeleted(Context context, int[] appWidgetIds)
void onDisabled(Context context)
void onEnabled(Context context)
void onReceive(Context context, Intent intent)
void onRestored(Context context, int[] oldWidgetIds, int[] newWidgetIds)
void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
如下这个例子只实现了onUpdate方法.
public class ExampleAppWidgetProvider extends AppWidgetProvider {
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
final int N = appWidgetIds.length;
// Perform this loop procedure for each App Widget that belongs to this provider
for (int i=0; i<N; i++) {
int appWidgetId = appWidgetIds[i];
// Create an Intent to launch ExampleActivity
Intent intent = new Intent(context, ExampleActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
// Get the layout for the App Widget and attach an on-click listener
// to the button
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);
views.setOnClickPendingIntent(R.id.button, pendingIntent);
// Tell the AppWidgetManager to perform an update on the current app widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
}
app Widget 是继续remoteView的,因此只支持FrameLayout/LineLayout/RelativeLayout/GridLayout.可以用的组件为
AnalogClock/Button/chronometer/ImageButton/ImageView/ProcessBar/TextView/viewFlipper/ListView/GridView/StackView/AdapterVidwFliper。
可以创建一个app widget configuration Activity来帮忙用户在创建app widget客制化。这个Activity 会自动的装载app widget host,用于用在创建app widget是进行配置,如app widget的颜色,大小。和更新的周期.
这个Activity 必须在manifest文件中添加
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
</intent-filter>
而且必须在APPWidgetPrividerInfo的XML中添加android:configure 属性,致命配置的Activity
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
...
android:configure="com.example.android.ExampleAppWidgetConfigure"
... >
</appwidget-provider>
1:在这个Activity中必须先拿到appwidgetID:
Intent intent = getIntent();
Bundle extras = intent.getExtras();
if (extras != null) {
mAppWidgetId = extras.getInt(
AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
}
2:配置app widget
3:获取APPWidgetManager
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
4:更新app widget
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.example_appwidget);
appWidgetManager.updateAppWidget(mAppWidgetId, views);
发送:
5:发送intent
Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
setResult(RESULT_OK, resultValue);
finish();
定义一个app widget,你需要做下面三步。
新建一个appWidgetProvideInfo 对象:描述app widget的元数据,例如app widget的布局,更新频率。APPWidgetProvideInfo 应该在想xml文件中.
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="40dp"
android:minHeight="40dp"
android:updatePeriodMillis="86400000"
android:previewImage="@drawable/preview"
android:initialLayout="@layout/example_appwidget"
android:configure="com.example.android.ExampleAppWidgetConfigure"
android:resizeMode="horizontal|vertical"
android:widgetCategory="home_screen">
</appwidget-provider>
新建一个APPWidgetProvide 类,定义APPWidget 提供的基本功能,一般是brodcast的子类,可以解释appwidget的更新/使能/删除广播.一般在manifest文件中定义,如下所示
<receiver android:name="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>
AppWIdgetProvide是BroadCastReceive的子类来接受app widget的广播信息.
void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions)
void onDeleted(Context context, int[] appWidgetIds)
void onDisabled(Context context)
void onEnabled(Context context)
void onReceive(Context context, Intent intent)
void onRestored(Context context, int[] oldWidgetIds, int[] newWidgetIds)
void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
如下这个例子只实现了onUpdate方法.
public class ExampleAppWidgetProvider extends AppWidgetProvider {
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
final int N = appWidgetIds.length;
// Perform this loop procedure for each App Widget that belongs to this provider
for (int i=0; i<N; i++) {
int appWidgetId = appWidgetIds[i];
// Create an Intent to launch ExampleActivity
Intent intent = new Intent(context, ExampleActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
// Get the layout for the App Widget and attach an on-click listener
// to the button
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);
views.setOnClickPendingIntent(R.id.button, pendingIntent);
// Tell the AppWidgetManager to perform an update on the current app widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
}
app Widget 是继续remoteView的,因此只支持FrameLayout/LineLayout/RelativeLayout/GridLayout.可以用的组件为
AnalogClock/Button/chronometer/ImageButton/ImageView/ProcessBar/TextView/viewFlipper/ListView/GridView/StackView/AdapterVidwFliper。
可以创建一个app widget configuration Activity来帮忙用户在创建app widget客制化。这个Activity 会自动的装载app widget host,用于用在创建app widget是进行配置,如app widget的颜色,大小。和更新的周期.
这个Activity 必须在manifest文件中添加
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
</intent-filter>
而且必须在APPWidgetPrividerInfo的XML中添加android:configure 属性,致命配置的Activity
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
...
android:configure="com.example.android.ExampleAppWidgetConfigure"
... >
</appwidget-provider>
1:在这个Activity中必须先拿到appwidgetID:
Intent intent = getIntent();
Bundle extras = intent.getExtras();
if (extras != null) {
mAppWidgetId = extras.getInt(
AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
}
2:配置app widget
3:获取APPWidgetManager
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
4:更新app widget
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.example_appwidget);
appWidgetManager.updateAppWidget(mAppWidgetId, views);
发送:
5:发送intent
Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
setResult(RESULT_OK, resultValue);
finish();