From: Po Lu Date: Mon, 25 Mar 2024 07:42:23 +0000 (+0800) Subject: Port restart-emacs to Android 4.3 and earlier X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=e92d2ac1ff98f24b306142b814bb65fa66adf337;p=emacs.git Port restart-emacs to Android 4.3 and earlier * java/org/gnu/emacs/EmacsService.java (restartEmacs): Run Emacs from an alarm if required. (cherry picked from commit ba96c4ec56a9978fce155c0af34a0412aee817b2) --- diff --git a/java/org/gnu/emacs/EmacsService.java b/java/org/gnu/emacs/EmacsService.java index 07bfb525be9..4e863c750d3 100644 --- a/java/org/gnu/emacs/EmacsService.java +++ b/java/org/gnu/emacs/EmacsService.java @@ -46,9 +46,11 @@ import android.view.KeyEvent; import android.view.inputmethod.CursorAnchorInfo; import android.view.inputmethod.ExtractedText; +import android.app.AlarmManager; import android.app.Notification; -import android.app.NotificationManager; import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; import android.app.Service; import android.content.ClipboardManager; @@ -724,11 +726,29 @@ public final class EmacsService extends Service restartEmacs () { Intent intent; + PendingIntent pending; + AlarmManager manager; intent = new Intent (this, EmacsActivity.class); intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); - startActivity (intent); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) + startActivity (intent); + else + { + /* Experimentation has established that Android 4.3 and earlier + versions do not attempt to recreate a process when it crashes + immediately after requesting that an intent for itself be + started. Schedule an intent to start some time after Emacs + exits instead. */ + + pending = PendingIntent.getActivity (this, 0, intent, 0); + manager = (AlarmManager) getSystemService (Context.ALARM_SERVICE); + manager.set (AlarmManager.RTC, System.currentTimeMillis () + 100, + pending); + } + System.exit (0); }