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