iT邦幫忙

2022 iThome 鐵人賽

DAY 24
0

Shortcut(捷徑) 比較單純,按下去就發送特定 intent,通常是開啟特定程式的特定 Acitivity,幾乎不佔用資源
Widget(小工具) 跟 APP 類似,有自己的生命週期、布局,能在背景執行,所以自由度比起 shortcut 高很多,但相對的會佔用資源。

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 Glance

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>

上一篇
Day 23 - Material Design
系列文
關於我用 Compose UI 造新輪子這檔事24
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言