1,
掌握Widget的用:
Widget的用途,能夠添加到手機桌面的程序
2,
Widget的特點和用法步驟:
特點:快捷,方便,個性化,可自定義功能,可及時控制更新Widget顯示內容
3,
用法步驟流程圖
- 繪制Widget布局
- 配置Widget的基本屬性
- 定義AppWidgetProvider
- 提供Configuration Activity
4,
Android Widget實現一個基礎的時鍾功能
效果:
- 可以自動更新時間
- 可以添加和刪除時鍾Widget
5,
完整代碼:
package com.example.widget;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;
/**
* 類似廣播,是桌面小組件Widget的Provider
*/
public class widget extends AppWidgetProvider {
static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
int appWidgetId) {
CharSequence widgetText = context.getString(R.string.appwidget_text);
// Construct the RemoteViews object
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
views.setTextViewText(R.id.tv, widgetText);
// Instruct the widget manager to update the widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
//刷新widget的時候執行,remoteView和AppWidgetManager
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
// There may be multiple widgets active, so update all of them
for (int appWidgetId : appWidgetIds) {
updateAppWidget(context, appWidgetManager, appWidgetId);
}
}
//第一個widget添加到屏幕上執行
@Override
public void onEnabled(Context context) {
// Enter relevant functionality for when the first widget is created
super.onEnabled(context);
//啟動Service
context.startService(new Intent(context, TimerService.class));
}
//最后一個widget被從屏幕移除執行
@Override
public void onDisabled(Context context) {
// Enter relevant functionality for when the last widget is disabled
super.onDisabled(context);
context.stopService(new Intent(context, TimerService.class));
}
//Widget被從屏幕移除
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
super.onDeleted(context, appWidgetIds);
}
//這個方法一般不會重寫,無論操作中間(上面)的哪些方法,都會執行onReceive
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
}
}
service:
package com.example.widget;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Intent;
import android.os.IBinder;
import android.widget.RemoteViews;
import androidx.annotation.Nullable;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TimerService extends Service {
//java.util.Timer下的定時器
private Timer timer;
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
updateViews();
}
}, 0, 1000);
}
private void updateViews() {
String time = sdf.format(new Date());
RemoteViews rv = new RemoteViews(getPackageName(), R.layout.widget);
rv.setTextViewText(R.id.tv, "黃朝陽666 : " + time);
AppWidgetManager manager = AppWidgetManager.getInstance(getApplicationContext());
ComponentName cn = new ComponentName(getApplicationContext(), widget.class);
manager.updateAppWidget(cn, rv);
}
@Override
public void onDestroy() {
super.onDestroy();
timer = null;
}
}
6,
添加和刪除天氣Widget:
7,
8,
