Shortcut(捷徑) 比較單純,按下去就發送特定 intent,通常是開啟特定程式的特定 Acitivity,幾乎不佔用資源
Widget(小工具) 跟 APP 類似,有自己的生命週期、布局,能在背景執行,所以自由度比起 shortcut 高很多,但相對的會佔用資源。
在 res/xml
底下建立 shortcuts.xml
,可以自訂 intent 跳轉到指定 Activity。
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:shortcutId="myfcu"
android:enabled="true"
android:icon="@mipmap/ic_redirect"
android:shortcutShortLabel="@string/redirect_myfcu_short_label">
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="at.mikuc.openfcu"
android:targetClass="at.mikuc.openfcu.MainActivity">
<extra
android:name="redirect_service"
android:value="MYFCU" />
</intent>
</shortcut>
</shortcuts>
在 Activity 底下加入自訂捷徑 XML。
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
Jetpack Compose 可以用 Kotlin composable function 繪製主程式 UI,Jetpack Glance 則是用一樣的方式繪製小工具 UI,不過在它還在 1.0.0-alpha05,可能會有 bug 要多加注意。
加入函式庫
implementation("androidx.glance:glance-appwidget:1.0.0-alpha05")
建立一個白色背景會顯示 Hello Glance 的小工具。
Compose 跟 Glance 有共享部份程式碼,但兩者 composable function 並不相通,引入時要注意。
class GreetingsWidget(private val name: String): GlanceAppWidget() {
@Composable
override fun Content() {
Box(
contentAlignment = Alignment.Center,
modifier = GlanceModifier.fillMaxSize()
.background(Color.White)
) {
Text(text = "Hello $name")
}
}
}
class GreetingsWidgetReceiver : GlanceAppWidgetReceiver() {
override val glanceAppWidget = GreetingsWidget("Glance")
}
在 res/xml
底下建立 my_widget.xml
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="48dp"
android:minHeight="48dp"
android:previewImage="@mipmap/ic_launcher"
android:resizeMode="horizontal|vertical"
android:targetCellHeight="1"
android:targetCellWidth="1"
android:widgetCategory="home_screen" />
在 AndroidManifest.xml
的 Application 裡加入小工具的 broadcast receiver,綁定 GreetingsWidgetReceiver
並設置 my_widget
小工具。
<receiver
android:name=".GreetingsWidgetReceiver"
android:enabled="@bool/glance_appwidget_available"
android:exported="false">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/my_widget" />
</receiver>