BroadcastReceiver не запускается при загрузке - программно - PullRequest
0 голосов
/ 21 сентября 2019

Я пытаюсь запустить мое приложение, если пользователь желает этого при загрузке.У меня есть флажок, чтобы отключить / зарегистрировать приемник вещания.Если я объявляю получателя в манифесте, мое приложение всегда запускается при загрузке, что является нежелательным поведением.Я попытался также getApplicationcontext().registerReceiver без удачи.Я что-то упустил?

    final BroadcastReceiver startMyActivityAtBootReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {

            Log.i("LockState", "broadcast receiver called started");
            if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
                Intent activityIntent = new Intent(context, MainActivity.class);
                activityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(activityIntent);
            }
        }
    };

    if (switch4.isChecked()){
        LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(startMyActivityAtBootReceiver, new IntentFilter("android.intent.action.BOOT_COMPLETED"));
        Log.i("LockState", "broadcastreceiver registered");
    }
    else {
        LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(startMyActivityAtBootReceiver);
        Log.i("LockState", "broadcastreceiver unregistered");
    }

    switch4.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            SharedPref.write(Constants.LAUNCH_AT_START, isChecked);
            Log.i("LockState", "launch app at start: " + isChecked);

            if (isChecked) {
                LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(startMyActivityAtBootReceiver, new IntentFilter("android.intent.action.BOOT_COMPLETED"));
                Log.i("LockState", "broadcastreceiver registered");
            } else {
                LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(startMyActivityAtBootReceiver);
                Log.i("LockState", "broadcastreceiver unregistered");
            }
        }
    });

Спасибо за ваше время.

Ответы [ 2 ]

1 голос
/ 21 сентября 2019

Должен быть объявлен в манифесте.Вы идете об этом неправильно.Вместо того, чтобы разрешать пользователю включать / отключать широковещательный приемник для загрузки, вы должны обрабатывать эту опцию в самом приемнике.Запустите действие или нет, основываясь на сохраненном значении предпочтения пользователя из флажка.

    @Override
    public void onReceive(Context context, Intent intent) {
        // Handle user preference
        if (!isUserPreferenceEnabled()) return;

        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            Intent activityIntent = new Intent(context, MainActivity.class);
            activityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(activityIntent);
        }
    }
1 голос
/ 21 сентября 2019

LocalBroadcastManager отправлять широковещательные передачи содержимого для локальных объектов в рамках вашего процесса, загрузочный приемник будет работать над отправкой глобальных трансляций.

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

Пример:

switch4.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            SharedPref.write(Constants.LAUNCH_AT_START, isChecked);
            Log.i("LockState", "launch app at start: " + isChecked);
        }
    });

И создать приемник вещания в отдельном классе и зарегистрироваться в AndroidManifest.xml.

AndroidManifest.xml:

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

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

MyBootReceiver.java:

public class MyBootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        if (Check your prefernce) {
                Intent activityIntent = new Intent(context, MainActivity.class);
                activityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(activityIntent);
          }
    }
}
...