diff --git a/NOTES b/NOTES index f3b7855..b53c37e 100644 --- a/NOTES +++ b/NOTES @@ -770,8 +770,39 @@ you have to click on the icon which is a portrait phone with a green android head on the lower-right corner of it. Upper-right corner. And you have to open a project before it will show you that. Jesus. +... + +Testing with pie, I am able to reproduce the problem with start-on-boot. +Here's some excerpts from logcat: + + 05-26 21:24:26.251 1837 3408 W ActivityManager: Background start not allowed: service Intent { cmp=org.galexander.sshd/.SimpleSSHDService } to org.galexander.sshd/.SimpleSSHDService from pid=3756 uid=10085 pkg=org.galexander.sshd startFg?=false + --------- beginning of crash + 05-26 21:24:26.251 3756 3756 E AndroidRuntime: FATAL EXCEPTION: main + 05-26 21:24:26.251 3756 3756 E AndroidRuntime: Process: org.galexander.sshd, PID: 3756 + 05-26 21:24:26.251 3756 3756 E AndroidRuntime: java.lang.RuntimeException: Unable to start receiver org.galexander.sshd.BootReceiver: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=org.galexander.sshd/.SimpleSSHDService }: app is in background uid UidRecord{5aff37a u0a85 RCVR idle change:uncached procs:1 seq(0,0,0)} + ... + 05-26 21:24:26.251 3756 3756 E AndroidRuntime: Caused by: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=org.galexander.sshd/.SimpleSSHDService }: app is in background uid UidRecord{5aff37a u0a85 RCVR idle change:uncached procs:1 seq(0,0,0)} + ... + 05-26 21:24:26.251 3756 3756 E AndroidRuntime: at android.content.ContextWrapper.startService(ContextWrapper.java:664) + 05-26 21:24:26.251 3756 3756 E AndroidRuntime: at org.galexander.sshd.BootReceiver.onReceive(BootReceiver.java:11) + +So it looks like a pretty intentional rule that you can't start a service +from a boot receiver?? + +And I have the same problem on my Z2 Force (Oreo 8.0) now that I've +updated the SDK. + +This guy says it will allow you to startForegroundService(), so that's +what I'll try... + + https://stackoverflow.com/questions/49572570/android-start-a-service-on-boot-not-working + +Which seems to work! So there is a need for some sort of dance in the +Settings screen to force it to enable foreground services if +start-on-boot is selected, and then we'll be golden. + -XXX - figure out what pie does to the boot event receiver +XXX - some sort of failsafe so start-on-boot && >= OREO implies foreground XXX - upgrade to newest dropbear XXX - test with Android 16, and on my Moto X, and emulated 26, and emulated 28. diff --git a/app/src/main/java/org/galexander/sshd/BootReceiver.java b/app/src/main/java/org/galexander/sshd/BootReceiver.java index 9496580..0cb65ae 100644 --- a/app/src/main/java/org/galexander/sshd/BootReceiver.java +++ b/app/src/main/java/org/galexander/sshd/BootReceiver.java @@ -3,13 +3,19 @@ package org.galexander.sshd; import android.content.BroadcastReceiver; import android.content.Intent; import android.content.Context; +import android.os.Build; public class BootReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { Prefs.init(context); if (Prefs.get_onboot()) { - context.startService(new Intent(context, - SimpleSSHDService.class)); + Intent i = new Intent(context, SimpleSSHDService.class); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + /* Oreo won't allow a background service here */ + context.startForegroundService(i); + } else { + context.startService(i); + } } } }