Widget
,又稱小部件或小工具,是一個在OS裡可以操作App的另一個地方
Android的widget跟iOS的widget在操作上就很不一樣⚠️⚠️⚠️
iOS是在第一個主畫面的左邊會有一個列表,全部的widget都必須集中在這邊
Android則是在任意主畫面的地方都可以新增widget,畫面大小也可任意調整,更靈活也更方便
在開發部分:
雖然在iOS跟Android都是寄生於Host App裡(也就是App刪了,widget也被刪了)☘️☘️☘️
但iOS的widget是一個Target(Today Extension),有自己的bundleID,算是跟App同一級
但Android的widget只是一個component,繼承於BroadcastReceiver
Target source set
這個選項,不然就是你可能在錯誤的地方右鍵new,可能會讓你搬檔案搬到手軟第一個
widget時呼叫加入
widget時就會呼叫The updatePeriodMillis attribute defines how often the App Widget framework should request an update from the AppWidgetProvider by calling the onUpdate() callback method. The actual update is not guaranteed to occur exactly on time with this value and we suggest updating as infrequently as possible—perhaps no more than once an hour to conserve the battery.
-https://developer.android.com/guide/topics/appwidgets#MetaData
3. onDeleted
只要刪除
widget時就會呼叫
4. onDisabled
刪除最後一個
widget時呼叫
5. onReceive
因為是繼承BroadcastReceiver,所以也可以發廣播給它
4. 畫面處理
1. 佈局只支援
FrameLayout、LinearLayout、RelativeLayout、GridLayout
2. 元件只支援
AnalogClock、Button、Chronometer、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView、AdapterViewFlipper(連子類也不行
)
3. 因為現在不是對Activity寫邏輯了,所以什麼findViewByID、onClick都不能用了
跟畫面的溝通就必須要一個RemoteViews
類來處理
RemoteViews views = new RemoteViews(context.getPackageName(), com.example.idla.R.layout.new_app_widget);
views.setTextViewText(com.example.idla.R.id.appwidget_text, widgetText);
appWidgetManager.updateAppWidget(appWidgetId, views);
如果是按鈕,這樣可以點了就開Activity
把PendingIntent.getActivity換成PendingIntent.getBroadcast可以讓widget收到onReceive
remoteView.setOnClickPendingIntent(com.example.idla.R.id.appwidget_btn, PendingIntent.getActivity(context,0,new Intent(context, Lesson22Activity.class),0));
Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.putExtra("message",editText.getText().toString());
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
try {
pendingIntent.send();
} catch (PendingIntent.CanceledException e) {
e.printStackTrace();
}
所以沒辦法先把資料存起來,再讓widget主動去抓最新的資料
但onReceive是拿不到appWidgetIds的
可以去 https://github.com/mark33699/IDLA 看一下順便給顆⭐️
如果你喜歡我的影片別忘了按讚分享加訂閱,開啟紅色的小鈴鐺,我們明天見~