Broadcastreceiver на Android 7.1.1 иногда не работает

Я создал приложение, которое устанавливает полную яркость экрана, если получено намерение SCREEN_ON. Я использую это приложение, потому что экран моего телефона немного сломан, и иногда возникают проблемы, если экран включен. Мое приложение работает хорошо, только вот случайно не работает. Несмотря на то, что моя служба все еще работает в фоновом режиме, яркость экрана не меняется. Я создал резервную копию, чтобы при изменении режима полета вызывался метод changeBrightness (). Это всегда срабатывает. Я предполагаю, что проблема как-то связана с IntentFilter, потому что это разница между намерением SCREEN_ON и намерением AIRPLANEMODE_CHANGED.

Моя фоновая служба:

public class UpdateService extends Service {
public int counter = 0;
BroadcastReceiver screenReceiver;

public UpdateService(Context applicationContext) {
    super();
}

public UpdateService() {
}

@Override
public void onCreate(){
    IntentFilter filter = new IntentFilter();
    filter.addAction(Intent.ACTION_SCREEN_ON);
    filter.addAction(Intent.ACTION_SCREEN_OFF);
    filter.setPriority(100);
    BroadcastReceiver mReceiver = new Receiver();
    registerReceiver(mReceiver, filter);
    screenReceiver = mReceiver;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);

    if (intent != null) {
        boolean screenOff = intent.getBooleanExtra("screen_state", true);

        if (screenOff == false) {
            changeBrightness();
        }
    }
    return START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
    Intent broadcastIntent = new Intent("RestartSensor");
    unregisterReceiver(screenReceiver);
    sendBroadcast(broadcastIntent);
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}


public void changeBrightness()(...)

BroadcastReceiver:

public class Receiver extends BroadcastReceiver {
private boolean screenOff;
Intent i;

@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
        screenOff = true;
    } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
        Log.d("Info", "Screen on, start service!");
        screenOff = false;
    } else if (intent.getAction().equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)) {
        screenOff = false;
    } else if (intent.getAction().equals("RestartService")) {
        screenOff = true;
        Log.d("Info", "RestartService received");
    }

    context.startService(new Intent(context, UpdateService.class).putExtra("screen_state", screenOff));
    screenOff = true;
    Log.d("Info", "bottom onReceive");
}

}

Наконец, манифест:

<?xml version = "1.0" encoding = "utf-8"?>

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

<application
    android:allowBackup = "true"
    android:icon = "@mipmap/ic_launcher"
    android:label = "@string/app_name"
    android:supportsRtl = "true"
    android:theme = "@style/AppTheme">
    <activity android:name = ".MainActivity">
        <intent-filter>
            <action android:name = "android.intent.action.MAIN" />
            <action android:name = "android.intent.action.BOOT_COMPLETED" />
            <category android:name = "android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <service
        android:name = ".UpdateService"
        android:enabled = "true"></service>

    <receiver
        android:name = ".Receiver"
        android:enabled = "true"
        android:exported = "true"
        android:label = "RestartServiceWhenStopped">
        <intent-filter>
            <action android:name = "RestartSensor" />
            <action android:name = "android.intent.action.AIRPLANE_MODE" />
            <action android:name = "android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
</application>

Любая помощь будет оценена по достоинству. Заранее благодарим за любой ответ!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
473
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема исчезла после того, как я добавил в свое приложение "плитку быстрых настроек". С помощью этой плитки я мог запустить свой метод «changeBrightness» без использования плитки режима полета. Я предполагаю, что система иногда убивала мою службу, но теперь, когда у меня есть плитка, привязанная к моей программе, она больше не может этого делать.

Хотелось бы еще услышать какие-нибудь идеи по теме. Может быть, однажды я избавлюсь от плитки.

Другие вопросы по теме