top of page

ソフトウェア更新したらウィジェットのバックグラウンド更新が止まった話

更新日:2024年12月22日



手持ちのGalaxyS20のソフトウェアをアップデートしたところ、ウィジェットが更新されなくなる事象を確認。

アップデートver:SP1A.210812.016.SC51AaOMU1CVK3


原因がはっきりしないが、Manifestのreceiverに

android:process=":remote" 

を入れたら正常に受信できるようになった。


これはプロセス名をデフォルトから変更するオプションであり、他のサイトには意味のない構文であるという記事が多数あるので入れていなかったが、実は意味があるのか?と思ったり。




AndroidManifest.xml

<receiver android:name=".PressureAlertWidget"
    android:process=":remote"
    android:exported="true">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>

    <meta-data
        android:name="android.appwidget.provider"
        android:resource="@xml/pressure_alert_widget_info" />
</receiver>





※2023/8/25 追記:


targetSdkを34に上げたところ、またウィジェットが更新されない状況が再発した。


色々試したが、プロジェクトのbuild.gradleで、kotlinバージョンを最新にしたところ、なぜか問題が解消した。

buildscript {
    ext.kotlin_version = "1.6.21"
    repositories {
        google()
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:7.1.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'com.google.gms:google-services:4.3.15'

    }
}


やっぱりなぜ解消されたのかよくわからない。。。なぜkotlinバージョン。


とりあえず、ウィジェットが更新されない事象が発生した際は試していただくと良いかもしれないです。




※2024/12/22 さらに追記:


また、久しぶりにAndroidStudioを起動して、アプリのレイアウトをいじったりしていたら検証機のウィジェットが更新できなくなっていることに気付く。


今回はkotlinバージョンを上げてもダメだったが、AlarmManagerの起動設定を変更したらうまくいった。

変えたのは下記のオレンジ色の部分

val manager: AppWidgetManager = AppWidgetManager.getInstance(this)
for (appWidgetID: Int in manager.getAppWidgetIds(ComponentName(this, PressureAlertWidget::class.java)))
{
    widgetCount = true
}
if (widgetCount) {
    alarmMgr = this.getSystemService(ALARM_SERVICE) as AlarmManager

    alarmIntent = Intent(this, AlarmReceiver::class.java).let { intent ->
        PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_IMMUTABLE)
    }

    // Hopefully your alarm will have a lower frequency than this!
    alarmMgr?.setInexactRepeating(
        AlarmManager.RTC_WAKEUP,
        SystemClock.elapsedRealtime() + AlarmManager.INTERVAL_FIFTEEN_MINUTES,
        AlarmManager.INTERVAL_FIFTEEN_MINUTES,
        alarmIntent
    )
}
        else {
    alarmMgr?.cancel(alarmIntent)
}

旧:AlarmManager.ELAPSED_REALTIME


新:AlarmManager.RTC_WAKEUP





色々方法があるものですね。ただこれといった決まりがないのが辛いところ。

AndroidOSは日進月歩で進化を続けているので、仕様が変わることはよくあることなのだと思います。

こまめに動作確認して対応を続けていくしかないでしょうね。




Comments


bottom of page