Программная регистрация для трансляции BOOT_COMPLETED

Я пытаюсь зарегистрировать свою службу для запуска при загрузке телефона.

Я настроил BOOT_COMPLETED BroadcastReciever в своем классе обслуживания:

public int onStartCommand(Intent intent, int flags, int startId)
{
    startService(intent);

    _bootCompletedReciever = new BroadcastReceiver()
    {
        @Override
        public void onReceive(Context context, Intent intent)
        {
            Log.d(TAG, "Got boot completed");
        }
    };


    IntentFilter filter = new IntentFilter("android.intent.action.BOOT_COMPLETED");
    registerReceiver(_bootCompletedReciever, filter);

    return START_NOT_STICKY;
}

Однако он не вызывается. У меня есть разрешение, установленное в моем манифесте:

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

Знаете ли вы, чего мне не хватает, чтобы эта трансляция запускалась в моем сервисе при загрузке телефона (без регистрации для трансляции в манифесте)?

Ответить

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

public class BootBroadcastReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Intent service = new Intent(context, S_GPS.class);
        context.startService(service);
    }
}

И в манифесте:

<receiver android:name=".BroadcastReceivers.BootBroadcastReceiver" android:enabled="true" android:exported="false">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

person Aggressor    schedule 22.12.2015    source источник


Ответы (2)


Кто запустит вашу службу при загрузке, чтобы вызвать onstartcommand()?
Это не сработает. Вы должны статически зарегистрировать приемник в манифесте и делать то, что хотите, в onReceive() приемника.

Пожалуйста, взгляните на этот сообщение.

person cgr    schedule 22.12.2015

Ресивер, который вы там регистрируете, не может пережить перезагрузку, это невозможно, потому что он регистрируется динамически и регистрация теряется при перезагрузке.

Что вы МОЖЕТЕ сделать, так это зарегистрировать приемник в манифесте, но установить для этого приемника значение DISABLED, используя этот флаг:

android:enabled=["true" | "false"]

Затем вы можете программно включить его с помощью диспетчера пакетов.

context.getPackageManager()
    .setComponentEnabledSetting(ComponentName componentName, int newState, int flags);

Из документов:

componentName   The component to enable
newState        The new enabled state for the component. The legal values for this state are: 
        COMPONENT_ENABLED_STATE_ENABLED, COMPONENT_ENABLED_STATE_DISABLED and COMPONENT_ENABLED_STATE_DEFAULT 
        The last one removes the setting, thereby restoring the component's state to whatever was set in it's manifest (or enabled, by default).
flags           Optional behavior flags: DONT_KILL_APP or 0.

См. документацию менеджера пакетов для получения дополнительной информации.

person Erik Zivkovic    schedule 22.12.2015