DB restore: restart via AlarmManager (startActivity+exit raced, app just closed)
This commit is contained in:
parent
ae90b4368b
commit
492c54990f
2 changed files with 28 additions and 4 deletions
|
|
@ -39,4 +39,16 @@
|
|||
- Схема-совместимость: миграции в db.js идемпотентны (ALTER ... IF NOT EXISTS), старый бэкап
|
||||
подтянется вверх, новый в старое приложение - лишние колонки безвредны.
|
||||
|
||||
## На роутере всё ещё 0.1.464 (build 464). Новый бэкап-билд (465) на роутер не выкатывал.
|
||||
## Проверка на теле + фиксы
|
||||
- Экспорт сперва падал: `vacuum: unable to open database: /data/user/...`. Причина - я взял
|
||||
корень как `app_data_dir().parent().parent()` (на Android app_data_dir САМ = корень -> ../..
|
||||
уводит в непишемый `/data/user`). ЭТО УЖЕ ЧИНИЛИ функцией `native_root()`. Исправил на
|
||||
`native_root()` (как save-команды/rebuild_roads), убрал data_dir-дубли. Записано в память
|
||||
`reference_android_native_root`. Подтверждено на теле: корень `/data/user/0/dev.baldav.app`
|
||||
писабелен, там baldav.db + точки + командные файлы -> native_root резолвится туда.
|
||||
- Экспорт + импорт (восстановление) пользователь проверил на теле - работают.
|
||||
- Авто-рестарт после импорта не срабатывал: `startActivity()+exit(0)` - гонка (процесс умирает
|
||||
до подъёма активити). Исправлено: relaunch через AlarmManager+PendingIntent ПОСЛЕ смерти
|
||||
процесса (ProcessPhoenix-паттерн) + finishAffinity.
|
||||
|
||||
## На роутере всё ещё 0.1.464 (build 464). Бэкап-билды на роутер не выкатывал.
|
||||
|
|
|
|||
|
|
@ -557,10 +557,22 @@ class MainActivity : TauriActivity() {
|
|||
}
|
||||
cmd == "restartapp" -> {
|
||||
// Relaunch the process so the staged DB (pending_restore.db) is swapped in onCreate.
|
||||
// startActivity()+exit() races (the new activity doesn't come up before the process
|
||||
// dies — measured: app just closed, no restart). Schedule the relaunch via AlarmManager
|
||||
// so it fires AFTER this process is gone (the ProcessPhoenix approach).
|
||||
Log.d("BalDav", "Restarting app (DB restore)")
|
||||
val intent = packageManager.getLaunchIntentForPackage(packageName)
|
||||
intent?.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
startActivity(intent)
|
||||
try {
|
||||
val intent = packageManager.getLaunchIntentForPackage(packageName)
|
||||
if (intent != null) {
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
val piFlags = android.app.PendingIntent.FLAG_CANCEL_CURRENT or
|
||||
(if (Build.VERSION.SDK_INT >= 23) android.app.PendingIntent.FLAG_IMMUTABLE else 0)
|
||||
val pi = android.app.PendingIntent.getActivity(this, 0, intent, piFlags)
|
||||
val am = getSystemService(ALARM_SERVICE) as android.app.AlarmManager
|
||||
am.set(android.app.AlarmManager.RTC, System.currentTimeMillis() + 300, pi)
|
||||
}
|
||||
} catch (e: Exception) { Log.e("BalDav", "restart schedule failed", e) }
|
||||
finishAffinity()
|
||||
Runtime.getRuntime().exit(0)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue