@@ -138,3 +138,111 @@ The call to this method should be done within the service code::
138138 from jnius import autoclass
139139 PythonService = autoclass('org.kivy.android.PythonService')
140140 PythonService.mService.setAutoRestartService(True)
141+
142+ Service auto-start
143+ ~~~~~~~~~~~~~~~~~~
144+
145+ To automatically start the service on boot, you need to add signals inside ``AndroidManifest.xml `` that Android sends to applications on boot.
146+ Create file ``receivers.xml `` and write this code::
147+
148+ <receiver android:name=".MyBroadcastReceiver" android:enabled="true" android:exported="true">
149+ <intent-filter>
150+ <action android:name="android.intent.action.BOOT_COMPLETED" />
151+ <action android:name="android.intent.action.QUICKBOOT_POWERON" />
152+ <action android:name="com.htc.intent.action.QUICKBOOT_POWERON" />
153+ </intent-filter>
154+ </receiver>
155+
156+
157+ Next step set path to this file in ``buildozer.spec ``, set setting ``android.extra_manifest_application_xml `` code::
158+
159+ android.extra_manifest_application_xml = %(source.dir)s/xml/receivers.xml
160+
161+ Then need create ``MyBroadcastReceiver.java ``, code::
162+
163+ package com.heattheatr.kivy_service_test;
164+
165+ import android.content.BroadcastReceiver;
166+ import android.content.Intent;
167+ import android.content.Context;
168+ import org.kivy.android.PythonActivity;
169+
170+ import java.lang.reflect.Method;
171+
172+ import com.heattheatr.kivy_service_test.ServiceTest;
173+
174+ public class MyBroadcastReceiver extends BroadcastReceiver {
175+
176+ public MyBroadcastReceiver() {
177+
178+ }
179+
180+ // Start app.
181+ public void start_app(Context context, Intent intent) {
182+ Intent ix = new Intent(context, PythonActivity.class);
183+ ix.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
184+ context.startActivity(ix);
185+ }
186+
187+ // Start service.
188+ public void service_start(Context context, Intent intent) {
189+ String package_root = context.getFilesDir().getAbsolutePath();
190+ String app_root = package_root + "/app";
191+ Intent ix = new Intent(context, ServiceTest.class);
192+ ix.putExtra("androidPrivate", package_root);
193+ ix.putExtra("androidArgument", app_root);
194+ ix.putExtra("serviceEntrypoint", "service.py");
195+ ix.putExtra("pythonName", "test");
196+ ix.putExtra("pythonHome", app_root);
197+ ix.putExtra("pythonPath", package_root);
198+ ix.putExtra("serviceStartAsForeground", "true");
199+ ix.putExtra("serviceTitle", "ServiceTest");
200+ ix.putExtra("serviceDescription", "ServiceTest");
201+ ix.putExtra("pythonServiceArgument", app_root + ":" + app_root + "/lib");
202+ ix.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
203+ context.startService(ix);
204+ }
205+
206+ // Stop service.
207+ public void service_stop(Context context, Intent intent) {
208+ Intent intent_stop = new Intent(context, ServiceTest.class);
209+
210+ context.stopService(intent_stop);
211+ }
212+
213+ // Sinals reciver.
214+ public void onReceive(Context context, Intent intent) {
215+ switch (intent.getAction()) {
216+ case Intent.ACTION_BOOT_COMPLETED:
217+ System.out.println("python MyBroadcastReceiver.java
218+ MyBroadcastReceiver.class onReceive.method: ACTION_BOOT_COMPLETED");
219+ this.service_start(context, intent);
220+ break;
221+ default:
222+ break;
223+ }
224+ }
225+ }
226+
227+ This code start ``service.py `` from ``buildozer.spec `` when get signal ``ACTION_BOOT_COMPLETED ``::
228+
229+ services = Test:./service.py:foreground
230+
231+ For example ``service.py ``::
232+
233+ import os
234+ from time import sleep
235+
236+ from jnius import cast
237+ from jnius import autoclass
238+
239+ PythonService = autoclass('org.kivy.android.PythonService')
240+ CurrentActivityService = cast("android.app.Service", PythonService.mService)
241+
242+ while True:
243+ print("python service running.....", CurrentActivityService.getPackageName(), os.getpid())
244+ sleep(10)
245+
246+ Name out service will be ``ServiceTest ``, prefix ``Service `` + ``Test `` from ``services = Test:./service.py:foreground ``.
247+
248+ You can see how it work in test `project <https://github.com/dvjdjvu/kivy_service_test >`__.
0 commit comments