diff --git a/doc/source/services.rst b/doc/source/services.rst index 8b5d9a7851..d202190056 100644 --- a/doc/source/services.rst +++ b/doc/source/services.rst @@ -138,3 +138,111 @@ The call to this method should be done within the service code:: from jnius import autoclass PythonService = autoclass('org.kivy.android.PythonService') PythonService.mService.setAutoRestartService(True) + +Service auto-start +~~~~~~~~~~~~~~~~~~ + +To automatically start the service on boot, you need to add signals inside ``AndroidManifest.xml`` that Android sends to applications on boot. +Create file ``receivers.xml`` and write this code:: + + + + + + + + + + +Next step set path to this file in ``buildozer.spec``, set setting ``android.extra_manifest_application_xml`` code:: + + android.extra_manifest_application_xml = %(source.dir)s/xml/receivers.xml + +Then need create ``MyBroadcastReceiver.java``, code:: + + package com.heattheatr.kivy_service_test; + + import android.content.BroadcastReceiver; + import android.content.Intent; + import android.content.Context; + import org.kivy.android.PythonActivity; + + import java.lang.reflect.Method; + + import com.heattheatr.kivy_service_test.ServiceTest; + + public class MyBroadcastReceiver extends BroadcastReceiver { + + public MyBroadcastReceiver() { + + } + + // Start app. + public void start_app(Context context, Intent intent) { + Intent ix = new Intent(context, PythonActivity.class); + ix.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(ix); + } + + // Start service. + public void service_start(Context context, Intent intent) { + String package_root = context.getFilesDir().getAbsolutePath(); + String app_root = package_root + "/app"; + Intent ix = new Intent(context, ServiceTest.class); + ix.putExtra("androidPrivate", package_root); + ix.putExtra("androidArgument", app_root); + ix.putExtra("serviceEntrypoint", "service.py"); + ix.putExtra("pythonName", "test"); + ix.putExtra("pythonHome", app_root); + ix.putExtra("pythonPath", package_root); + ix.putExtra("serviceStartAsForeground", "true"); + ix.putExtra("serviceTitle", "ServiceTest"); + ix.putExtra("serviceDescription", "ServiceTest"); + ix.putExtra("pythonServiceArgument", app_root + ":" + app_root + "/lib"); + ix.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startService(ix); + } + + // Stop service. + public void service_stop(Context context, Intent intent) { + Intent intent_stop = new Intent(context, ServiceTest.class); + + context.stopService(intent_stop); + } + + // Sinals reciver. + public void onReceive(Context context, Intent intent) { + switch (intent.getAction()) { + case Intent.ACTION_BOOT_COMPLETED: + System.out.println("python MyBroadcastReceiver.java + MyBroadcastReceiver.class onReceive.method: ACTION_BOOT_COMPLETED"); + this.service_start(context, intent); + break; + default: + break; + } + } + } + +This code start ``service.py`` from ``buildozer.spec`` when get signal ``ACTION_BOOT_COMPLETED``:: + + services = Test:./service.py:foreground + +For example ``service.py``:: + + import os + from time import sleep + + from jnius import cast + from jnius import autoclass + + PythonService = autoclass('org.kivy.android.PythonService') + CurrentActivityService = cast("android.app.Service", PythonService.mService) + + while True: + print("python service running.....", CurrentActivityService.getPackageName(), os.getpid()) + sleep(10) + +Name out service will be ``ServiceTest``, prefix ``Service`` + ``Test`` from ``services = Test:./service.py:foreground``. + +You can see how it work in test `project `__. diff --git a/pythonforandroid/bootstraps/common/build/build.py b/pythonforandroid/bootstraps/common/build/build.py index 0b6b9832f0..93ec611799 100644 --- a/pythonforandroid/bootstraps/common/build/build.py +++ b/pythonforandroid/bootstraps/common/build/build.py @@ -944,6 +944,9 @@ def create_argument_parser(): ap.add_argument('--extra-manifest-xml', default='', help=('Extra xml to write directly inside the element of' 'AndroidManifest.xml')) + ap.add_argument('--extra-manifest-application-xml', default='', + help='Extra xml to write directly inside the element of' + 'AndroidManifest.xml') ap.add_argument('--extra-manifest-application-arguments', default='', help='Extra arguments to be added to the tag of' 'AndroidManifest.xml') diff --git a/pythonforandroid/bootstraps/sdl2/build/templates/AndroidManifest.tmpl.xml b/pythonforandroid/bootstraps/sdl2/build/templates/AndroidManifest.tmpl.xml index 3353c0a0d5..38115442ce 100644 --- a/pythonforandroid/bootstraps/sdl2/build/templates/AndroidManifest.tmpl.xml +++ b/pythonforandroid/bootstraps/sdl2/build/templates/AndroidManifest.tmpl.xml @@ -58,6 +58,9 @@ android:theme="{{args.android_apptheme}}{% if not args.window %}.Fullscreen{% endif %}" android:hardwareAccelerated="true" android:extractNativeLibs="true" > + + {{ args.extra_manifest_application_xml }} + {% for l in args.android_used_libs %} {% endfor %} diff --git a/pythonforandroid/bootstraps/service_library/build/templates/AndroidManifest.tmpl.xml b/pythonforandroid/bootstraps/service_library/build/templates/AndroidManifest.tmpl.xml index f667651780..84f14110b4 100644 --- a/pythonforandroid/bootstraps/service_library/build/templates/AndroidManifest.tmpl.xml +++ b/pythonforandroid/bootstraps/service_library/build/templates/AndroidManifest.tmpl.xml @@ -8,6 +8,9 @@ + + {{ args.extra_manifest_application_xml }} + {% for name in service_names %} + + {{ args.extra_manifest_application_xml }} + {% for l in args.android_used_libs %} {% endfor %} diff --git a/pythonforandroid/bootstraps/webview/build/templates/AndroidManifest.tmpl.xml b/pythonforandroid/bootstraps/webview/build/templates/AndroidManifest.tmpl.xml index 1b83cd83e3..db4296ebe1 100644 --- a/pythonforandroid/bootstraps/webview/build/templates/AndroidManifest.tmpl.xml +++ b/pythonforandroid/bootstraps/webview/build/templates/AndroidManifest.tmpl.xml @@ -51,6 +51,9 @@ android:extractNativeLibs="true" {% if debug %}android:debuggable="true"{% endif %} > + + {{ args.extra_manifest_application_xml }} + {% for l in args.android_used_libs %} {% endfor %} pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy