Запуск фонового сервиса на Android 7.1 - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть опыт разработки, но новичок в Android разработке. Для Android 7.1 по какой стратегии вы бы настроили фоновую службу (цель состоит в том, чтобы она могла пинговать сервер каждые N секунд). Это для корпоративного проекта, а не для публичного c потребления, потому что это звучит как плохое требование для публичного c использования.

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

На данный момент я обнаружил, что на старых версиях ОС Android можно запустить фоновую службу в отдельном процессе, инициированном Broadcast Receiver в событии Boot Completed. Но с более свежими версиями Android ОС, похоже, ограничивает это событие трансляции. Я получил этот тип кода, работающего с Xamarin, но, похоже, он не работает на Android 7.1 (событие широковещательной загрузки завершено не получено).

Одна документация Android предлагает использовать планировщик заданий, но это кажется, работает только во время работы приложения, и кажется, что оно перестает работать, когда ОС идет дремать. Похоже, что ОС Android претерпела значительные изменения после публикации, например, в 2011/2014 годах, и это довольно странное требование, поэтому размещение здесь.

Пример кода (Xamarin C#): (Это для Android 7.1)

BroadcastReceiver

public class MyBroadcastReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        //Toast.MakeText(context, "Broadcaster receiver", ToastLength.Long).Show(); //no breakpoint hit or toast appears
        Intent startServiceIntent = new Intent(context, typeof(DemoService));
        context.StartService(startServiceIntent);
    }
}

AndroidManifest. xml

<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme">
    <receiver android:name="MyNamespace.MyBroadcastReceiver" android:enabled="true" android:exported="true" android:label="BootReceiver">
        <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
    <service android:name="md5a0cbbf8da641ae5a4c781aaf35e00a86.DemoService" android:directBootAware="true" />
</application>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

1 Ответ

0 голосов
/ 07 февраля 2020

Вам необходимо добавить приложение в белый список на каждом устройстве из управления питанием. Затем создайте службу переднего плана, которая запускает поток и выполняет операцию каждые несколько секунд. Эта комбинация должна помочь вам преодолеть ограничения в дозе и обслуживании.

BOOT_COMPLETED все еще должен работать как положено. Трансляции были ограничены 7 и 8, но этого явно не было.

JobScheduler не подходит для чего-то, что должно запускаться каждые несколько секунд. Каждые несколько минут, да. Не секунды.

Обратите внимание, что время автономной работы этих устройств будет плохим. Сомнительно, что у них будет целый день.

...