Запуск службы Kivy при загрузке (Android)

Я пытаюсь запустить службу kivy app при загрузке.

Я уверен, что мой сервис в порядке, потому что он работает, когда я запускаю свое приложение. Но при загрузке у меня проблема.

Я прочитал эту статью и попытался сделать это:

package net.saband.myapp;

import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.Context;
import org.kivy.android.PythonActivity;

public class MyBroadcastReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        Intent ix = new Intent(context, PythonActivity.class);
        ix.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(ix);
    }
}

Он работает, но запускает приложение, но не службу. Поэтому я изучил некоторые вопросы в StackOverflow и изменил код для этого:

package net.saband.myapp;

import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.Context;
import net.saband.myapp.ServiceMyservice;

public class MyBroadcastReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        Intent ix = new Intent(context, ServiceMyservice.class);
        ix.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startService(ix);
    }
}

... и получил ошибку:

10-21 19:16:44.784  1513  1569 I ActivityManager: Start proc 6334:net.saband.myapp:service_myservice/u0a116 for service net.saband.myapp/.ServiceMyservice
10-21 19:16:44.786  6334  6334 I art     : Late-enabling -Xcheck:jni
10-21 19:16:44.885  6334  6334 D AndroidRuntime: Shutting down VM
10-21 19:16:44.888  6334  6334 E AndroidRuntime: FATAL EXCEPTION: main
10-21 19:16:44.888  6334  6334 E AndroidRuntime: Process: net.saband.myapp:service_myservice, PID: 6334
10-21 19:16:44.888  6334  6334 E AndroidRuntime: Theme: themes:{}
10-21 19:16:44.888  6334  6334 E AndroidRuntime: java.lang.RuntimeException: Unable to start service [email protected] with Intent { cmp=net.saband.myapp/.ServiceMyservice }: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference

Не могли бы вы объяснить мне, что случилось, и что мне делать, чтобы начать сервис? Спасибо!

ОБНОВЛЕНО

По запросу @Juggernaut я добавляю свой служебный код:

from time import sleep

if __name__ == '__main__':
    while True:
        print "myapp service"
        sleep(5)

Это работает, когда я запускаю приложение, потому что приложение вызывает службу:

def __start_service(self):
    if platform == 'android':
        service = autoclass('net.saband.myapp.ServiceMyservice')
        mActivity = autoclass('org.kivy.android.PythonActivity').mActivity
        argument = ''
        service.start(mActivity, argument)

ОБНОВЛЕНО (AndroidManifest)

Вот некоторые строки из моего AndroidManifest.xml.

  • У меня есть разрешение RECEIVE_BOOT_COMPLETED:

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

  • У меня есть приемник:

    <receiver android:name=".MyBroadcastReceiver" android:enabled="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver>

  • У меня зарегистрирована услуга:

    <service android:name="net.saband.myapp.ServiceMyservice" android:process=":service_myservice" />

По рекомендации @mariachi я попытался изменить android:enabled="true" to android:enabled="false" в приемнике и добавить android:exported="false" в службу. В этом случае при запуске устройства ничего не происходит: ошибок нет, нет службы.

Ответ 1

OMG! Я нашел решение, решив мою другую проблему с сервисом kivy. Достаточно просто добавить некоторые дополнительные услуги. Вот рабочий код:

package net.saband.myapp;

import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.Context;
import net.saband.myapp.ServiceMyservice;

public class MyBroadcastReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        String package_root = context.getFilesDir().getAbsolutePath();
        String app_root =  package_root + "/app";
        Intent ix = new Intent(context, ServiceMyservice.class);
        ix.putExtra("androidPrivate", package_root);
        ix.putExtra("androidArgument", app_root);
        ix.putExtra("serviceEntrypoint", "./service/main.py");
        ix.putExtra("pythonName", "myservice");
        ix.putExtra("pythonHome", app_root);
        ix.putExtra("pythonPath", package_root);
        ix.putExtra("pythonServiceArgument", app_root+":"+app_root+"/lib");
        ix.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startService(ix);
    }
}

Ответ 2

Кажется, что служба или активность, которые вы пытаетесь запустить, не инициализируются. Вы не вставляли свой AndroidManifest, поэтому я напишу, что он должен был иметь.

Во-первых, вы должны иметь разрешение, добавленное для запуска при загрузке:

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

Во-вторых, вы должны определить получателя в манифесте:

    <receiver android:name=".MyBroadcastReceiver"
              android:enabled="false">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
    </receiver>

В-третьих, вы должны определить свой сервис или активность, которые вы пытаетесь запустить, например:

    <activity android:name=".PythonActivity" />
    <service android:name=".ServiceMyservice" android:exported="false"/>