From fa0573e1ebf2d3b5f9cd6ece4b092d8f1f0afd65 Mon Sep 17 00:00:00 2001 From: Mikhail Zakharov Date: Tue, 5 Jan 2021 13:39:46 -0500 Subject: [PATCH 1/3] fix sticky --- .../java/org/kivy/android/PythonService.java | 61 +++++++++++-------- .../common/build/templates/Service.tmpl.java | 40 ++++++++++++ 2 files changed, 75 insertions(+), 26 deletions(-) diff --git a/pythonforandroid/bootstraps/common/build/src/main/java/org/kivy/android/PythonService.java b/pythonforandroid/bootstraps/common/build/src/main/java/org/kivy/android/PythonService.java index c9693c3eea..dec7046e97 100644 --- a/pythonforandroid/bootstraps/common/build/src/main/java/org/kivy/android/PythonService.java +++ b/pythonforandroid/bootstraps/common/build/src/main/java/org/kivy/android/PythonService.java @@ -25,14 +25,14 @@ public class PythonService extends Service implements Runnable { private Thread pythonThread = null; // Python environment variables - private String androidPrivate; - private String androidArgument; - private String pythonName; - private String pythonHome; - private String pythonPath; - private String serviceEntrypoint; + public String androidPrivate; + public String androidArgument; + public String pythonName; + public String pythonHome; + public String pythonPath; + public String serviceEntrypoint; // Argument to pass to Python code, - private String pythonServiceArgument; + public String pythonServiceArgument; public static PythonService mService = null; @@ -60,28 +60,35 @@ public void onCreate() { @Override public int onStartCommand(Intent intent, int flags, int startId) { + startIntent = intent; if (pythonThread != null) { Log.v("python service", "service exists, do not start again"); - return START_NOT_STICKY; + return startType(); } + if (intent != null) { + + Bundle extras = intent.getExtras(); + androidPrivate = extras.getString("androidPrivate"); + androidArgument = extras.getString("androidArgument"); + serviceEntrypoint = extras.getString("serviceEntrypoint"); + pythonName = extras.getString("pythonName"); + pythonHome = extras.getString("pythonHome"); + pythonPath = extras.getString("pythonPath"); + boolean serviceStartAsForeground = false; + String foreground = extras.getString("serviceStartAsForeground"); + if (foreground != null) { + serviceStartAsForeground = foreground.equals("true"); + } + pythonServiceArgument = extras.getString("pythonServiceArgument"); + pythonThread = new Thread(this); + pythonThread.start(); - startIntent = intent; - Bundle extras = intent.getExtras(); - androidPrivate = extras.getString("androidPrivate"); - androidArgument = extras.getString("androidArgument"); - serviceEntrypoint = extras.getString("serviceEntrypoint"); - pythonName = extras.getString("pythonName"); - pythonHome = extras.getString("pythonHome"); - pythonPath = extras.getString("pythonPath"); - boolean serviceStartAsForeground = ( - extras.getString("serviceStartAsForeground").equals("true") - ); - pythonServiceArgument = extras.getString("pythonServiceArgument"); - pythonThread = new Thread(this); - pythonThread.start(); - - if (serviceStartAsForeground) { - doStartForeground(extras); + if (serviceStartAsForeground) { + doStartForeground(extras); + } + } else { + pythonThread = new Thread(this); + pythonThread.start(); } return startType(); @@ -153,7 +160,9 @@ public void onDestroy() { @Override public void onTaskRemoved(Intent rootIntent) { super.onTaskRemoved(rootIntent); - stopSelf(); + if (startType() == START_NOT_STICKY) { + stopSelf(); + } } @Override diff --git a/pythonforandroid/bootstraps/common/build/templates/Service.tmpl.java b/pythonforandroid/bootstraps/common/build/templates/Service.tmpl.java index 50c08f08a1..01197ab42e 100644 --- a/pythonforandroid/bootstraps/common/build/templates/Service.tmpl.java +++ b/pythonforandroid/bootstraps/common/build/templates/Service.tmpl.java @@ -3,6 +3,8 @@ import android.content.Intent; import android.content.Context; import org.kivy.android.PythonService; +import org.kivy.android.PythonUtil; +import java.io.File; public class Service{{ name|capitalize }} extends PythonService { @@ -34,6 +36,44 @@ static public void start(Context ctx, String pythonServiceArgument) { ctx.startService(intent); } + @Override + public void run(){ + String package_root = getFilesDir().getAbsolutePath(); + String app_root = package_root + "/app"; + File app_root_file = new File(app_root); + PythonUtil.loadLibraries(app_root_file, + new File(getApplicationInfo().nativeLibraryDir)); + this.mService = this; + + if (androidPrivate == null) { + androidPrivate = package_root; + } + if (androidArgument == null) { + androidArgument = app_root; + } + if (serviceEntrypoint == null) { + serviceEntrypoint ="{{ entrypoint }}"; + } + if (pythonName == null) { + pythonName = "{{ name }}"; + } + if (pythonHome == null) { + pythonHome = app_root; + } + if (pythonPath == null) { + pythonPath = package_root; + } + if (pythonServiceArgument == null) { + pythonServiceArgument = app_root+":"+app_root+"/lib"; + } + nativeStart( + androidPrivate, androidArgument, + serviceEntrypoint, pythonName, + pythonHome, pythonPath, + pythonServiceArgument); + stopSelf(); + } + static public void stop(Context ctx) { Intent intent = new Intent(ctx, Service{{ name|capitalize }}.class); ctx.stopService(intent); From d08ca9115ae52fc24cde1f1f1e7cfe723fafbe0b Mon Sep 17 00:00:00 2001 From: Mikhail Zakharov Date: Wed, 6 Jan 2021 14:54:57 -0500 Subject: [PATCH 2/3] cleanup --- .../main/java/org/kivy/android/PythonService.java | 15 ++++++++------- .../common/build/templates/Service.tmpl.java | 12 +----------- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/pythonforandroid/bootstraps/common/build/src/main/java/org/kivy/android/PythonService.java b/pythonforandroid/bootstraps/common/build/src/main/java/org/kivy/android/PythonService.java index dec7046e97..483e2ac5e8 100644 --- a/pythonforandroid/bootstraps/common/build/src/main/java/org/kivy/android/PythonService.java +++ b/pythonforandroid/bootstraps/common/build/src/main/java/org/kivy/android/PythonService.java @@ -25,14 +25,14 @@ public class PythonService extends Service implements Runnable { private Thread pythonThread = null; // Python environment variables - public String androidPrivate; - public String androidArgument; - public String pythonName; - public String pythonHome; - public String pythonPath; - public String serviceEntrypoint; + protected String androidPrivate; + protected String androidArgument; + protected String pythonName; + protected String pythonHome; + protected String pythonPath; + protected String serviceEntrypoint; // Argument to pass to Python code, - public String pythonServiceArgument; + protected String pythonServiceArgument; public static PythonService mService = null; @@ -65,6 +65,7 @@ public int onStartCommand(Intent intent, int flags, int startId) { Log.v("python service", "service exists, do not start again"); return startType(); } + //when app is closed, OS will restart the service with null intent See #2401 if (intent != null) { Bundle extras = intent.getExtras(); diff --git a/pythonforandroid/bootstraps/common/build/templates/Service.tmpl.java b/pythonforandroid/bootstraps/common/build/templates/Service.tmpl.java index 01197ab42e..edbc177ab5 100644 --- a/pythonforandroid/bootstraps/common/build/templates/Service.tmpl.java +++ b/pythonforandroid/bootstraps/common/build/templates/Service.tmpl.java @@ -3,7 +3,6 @@ import android.content.Intent; import android.content.Context; import org.kivy.android.PythonService; -import org.kivy.android.PythonUtil; import java.io.File; @@ -41,10 +40,6 @@ public void run(){ String package_root = getFilesDir().getAbsolutePath(); String app_root = package_root + "/app"; File app_root_file = new File(app_root); - PythonUtil.loadLibraries(app_root_file, - new File(getApplicationInfo().nativeLibraryDir)); - this.mService = this; - if (androidPrivate == null) { androidPrivate = package_root; } @@ -66,12 +61,7 @@ public void run(){ if (pythonServiceArgument == null) { pythonServiceArgument = app_root+":"+app_root+"/lib"; } - nativeStart( - androidPrivate, androidArgument, - serviceEntrypoint, pythonName, - pythonHome, pythonPath, - pythonServiceArgument); - stopSelf(); + super.run(); } static public void stop(Context ctx) { From df54ad86e3b7e87c3b5291dd70285d7166875722 Mon Sep 17 00:00:00 2001 From: Mikhail Zakharov Date: Wed, 13 Jan 2021 11:14:41 -0500 Subject: [PATCH 3/3] fix STICKY for foreground services --- .../java/org/kivy/android/PythonService.java | 68 ++++++++++--------- .../common/build/templates/Service.tmpl.java | 36 +++------- 2 files changed, 43 insertions(+), 61 deletions(-) diff --git a/pythonforandroid/bootstraps/common/build/src/main/java/org/kivy/android/PythonService.java b/pythonforandroid/bootstraps/common/build/src/main/java/org/kivy/android/PythonService.java index 483e2ac5e8..a8d3426aa8 100644 --- a/pythonforandroid/bootstraps/common/build/src/main/java/org/kivy/android/PythonService.java +++ b/pythonforandroid/bootstraps/common/build/src/main/java/org/kivy/android/PythonService.java @@ -25,14 +25,14 @@ public class PythonService extends Service implements Runnable { private Thread pythonThread = null; // Python environment variables - protected String androidPrivate; - protected String androidArgument; - protected String pythonName; - protected String pythonHome; - protected String pythonPath; - protected String serviceEntrypoint; + private String androidPrivate; + private String androidArgument; + private String pythonName; + private String pythonHome; + private String pythonPath; + private String serviceEntrypoint; // Argument to pass to Python code, - protected String pythonServiceArgument; + private String pythonServiceArgument; public static PythonService mService = null; @@ -60,36 +60,33 @@ public void onCreate() { @Override public int onStartCommand(Intent intent, int flags, int startId) { - startIntent = intent; if (pythonThread != null) { Log.v("python service", "service exists, do not start again"); return startType(); } - //when app is closed, OS will restart the service with null intent See #2401 - if (intent != null) { - - Bundle extras = intent.getExtras(); - androidPrivate = extras.getString("androidPrivate"); - androidArgument = extras.getString("androidArgument"); - serviceEntrypoint = extras.getString("serviceEntrypoint"); - pythonName = extras.getString("pythonName"); - pythonHome = extras.getString("pythonHome"); - pythonPath = extras.getString("pythonPath"); - boolean serviceStartAsForeground = false; - String foreground = extras.getString("serviceStartAsForeground"); - if (foreground != null) { - serviceStartAsForeground = foreground.equals("true"); - } - pythonServiceArgument = extras.getString("pythonServiceArgument"); - pythonThread = new Thread(this); - pythonThread.start(); + //intent is null if OS restarts a STICKY service + if (intent == null) { + Context context = getApplicationContext(); + intent = getThisDefaultIntent(context, ""); + } - if (serviceStartAsForeground) { - doStartForeground(extras); - } - } else { - pythonThread = new Thread(this); - pythonThread.start(); + startIntent = intent; + Bundle extras = intent.getExtras(); + androidPrivate = extras.getString("androidPrivate"); + androidArgument = extras.getString("androidArgument"); + serviceEntrypoint = extras.getString("serviceEntrypoint"); + pythonName = extras.getString("pythonName"); + pythonHome = extras.getString("pythonHome"); + pythonPath = extras.getString("pythonPath"); + boolean serviceStartAsForeground = ( + extras.getString("serviceStartAsForeground").equals("true") + ); + pythonServiceArgument = extras.getString("pythonServiceArgument"); + pythonThread = new Thread(this); + pythonThread.start(); + + if (serviceStartAsForeground) { + doStartForeground(extras); } return startType(); @@ -99,6 +96,10 @@ protected int getServiceId() { return 1; } + protected Intent getThisDefaultIntent(Context ctx, String pythonServiceArgument) { + return null; + } + protected void doStartForeground(Bundle extras) { String serviceTitle = extras.getString("serviceTitle"); String serviceDescription = extras.getString("serviceDescription"); @@ -161,7 +162,8 @@ public void onDestroy() { @Override public void onTaskRemoved(Intent rootIntent) { super.onTaskRemoved(rootIntent); - if (startType() == START_NOT_STICKY) { + //sticky servcie runtime/restart is managed by the OS. leave it running when app is closed + if (startType() != START_STICKY) { stopSelf(); } } diff --git a/pythonforandroid/bootstraps/common/build/templates/Service.tmpl.java b/pythonforandroid/bootstraps/common/build/templates/Service.tmpl.java index edbc177ab5..dd2a025f6d 100644 --- a/pythonforandroid/bootstraps/common/build/templates/Service.tmpl.java +++ b/pythonforandroid/bootstraps/common/build/templates/Service.tmpl.java @@ -3,7 +3,6 @@ import android.content.Intent; import android.content.Context; import org.kivy.android.PythonService; -import java.io.File; public class Service{{ name|capitalize }} extends PythonService { @@ -20,6 +19,11 @@ protected int getServiceId() { } static public void start(Context ctx, String pythonServiceArgument) { + Intent intent = getDefaultIntent(ctx, pythonServiceArgument); + ctx.startService(intent); + } + + static public Intent getDefaultIntent(Context ctx, String pythonServiceArgument) { Intent intent = new Intent(ctx, Service{{ name|capitalize }}.class); String argument = ctx.getFilesDir().getAbsolutePath() + "/app"; intent.putExtra("androidPrivate", ctx.getFilesDir().getAbsolutePath()); @@ -32,36 +36,12 @@ static public void start(Context ctx, String pythonServiceArgument) { intent.putExtra("pythonHome", argument); intent.putExtra("pythonPath", argument + ":" + argument + "/lib"); intent.putExtra("pythonServiceArgument", pythonServiceArgument); - ctx.startService(intent); + return intent; } @Override - public void run(){ - String package_root = getFilesDir().getAbsolutePath(); - String app_root = package_root + "/app"; - File app_root_file = new File(app_root); - if (androidPrivate == null) { - androidPrivate = package_root; - } - if (androidArgument == null) { - androidArgument = app_root; - } - if (serviceEntrypoint == null) { - serviceEntrypoint ="{{ entrypoint }}"; - } - if (pythonName == null) { - pythonName = "{{ name }}"; - } - if (pythonHome == null) { - pythonHome = app_root; - } - if (pythonPath == null) { - pythonPath = package_root; - } - if (pythonServiceArgument == null) { - pythonServiceArgument = app_root+":"+app_root+"/lib"; - } - super.run(); + protected Intent getThisDefaultIntent(Context ctx, String pythonServiceArgument) { + return Service{{ name|capitalize }}.getDefaultIntent(ctx, pythonServiceArgument); } static public void stop(Context ctx) {