RECEIVE_BOOT_COMPLETED

Ответить
skif
Сообщения: 1
Зарегистрирован: 18 ноя 2015, 18:33

RECEIVE_BOOT_COMPLETED

Сообщение skif » 18 ноя 2015, 18:42

Всем привет
Делаю обработку сообщения BOOT_COMPLETED

манифест

Код: Выделить всё

    <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" >

        <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true"
            android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
            <intent-filter android:priority="1000" >
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
обработчик

Код: Выделить всё

    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Log.d("AGENT_TAG", "onReceive() " + action);
    }
Если добавляю в приложение активити, то обработчик отрабатывает (во время перезагрузки)
Если удаляю активити и перезагружаюсь, обработчик опять отрабатывает
Если удаляю приложение с устройства (через интерфейс устройства), то после перезагрузки обработчик не отрабатывает
Добавляю активити, опять все работает.
Из обработчика должен запускаться сервис.
Нужно ли для этого обязательно добавлять активити или можно обойтись без нее ?

GRAF_COLLIOSTRO
Сообщения: 115
Зарегистрирован: 08 янв 2015, 14:32

Re: RECEIVE_BOOT_COMPLETED

Сообщение GRAF_COLLIOSTRO » 22 ноя 2015, 13:16

про активити не совсем понял.

сталкивался с бутресивером. проблема была в следующем: по концепции дройда нельзя сразу по загрузке выполнить что-то. это портиворечит общей концепции. вдруг пользователь не хотел этого. нельзя подкачивать ему рекламу и тп и тд.
сам гугл в хелпе рекомендует сделать уведомление. с него только пользователь попадает на активность (какбы намерянно) или запускается сервис.
и у меня ещё была проблема - там отводится очень короткое время и мало ресурсов на выполнение. например простой цикл в ресивере воспринимается дройдом как зависание и вылетает с ошибкой. у меня заработало всё как хотел только когда оставил в загрузчике уведомление.

в интент фильтре у меня ещё <category android:name="android.intent.category.DEFAULT" />

уже не помню, но без него чот не работало.

X-Dron
Сообщения: 3
Зарегистрирован: 13 фев 2016, 13:28

Re: RECEIVE_BOOT_COMPLETED

Сообщение X-Dron » 13 фев 2016, 13:41

У меня так
Манифест

Код: Выделить всё

            <service android:name=".Flip2MuteService" />
            <receiver android:name=".StartFlip2MuteService">
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                    <action android:name="android.intent.action.PHONE_STATE" />
                </intent-filter>
            </receiver>
приемник

Код: Выделить всё

public class StartFlip2MuteService extends BroadcastReceiver
{
    private final String TAG = "Flip2MuteService";

    public void onReceive(Context paramContext, Intent paramIntent)
    {
        if (DEDUG) Log.d(TAG, paramIntent + " Received");
        // принимаются по фильтру интенты "Конец загрузки", "Изменен статус телефона"
        // проверяем чекбокс и, если он установлен запускаем сервис
        SharedPreferences Prefs = paramContext.getSharedPreferences("eg.x_dron.add_services_preferences", 0);
        boolean check_State = Prefs.getBoolean("flip_to_mute", false);
        if (DEDUG) Log.d(TAG, paramIntent.getAction() + " mite=" + check_State);
        String State ="";
        if (paramIntent.getAction().equals("android.intent.action.PHONE_STATE")){
            State = paramIntent.getStringExtra("state");
            if (DEDUG) Log.d(TAG, "Broadcast PHONE_STATE: " + State);
        }
        if (check_State && State.equals("RINGING")) {
            paramContext.startService(new Intent(paramContext, Flip2MuteService.class));
        }
        else {
            paramContext.stopService(new Intent(paramContext, Flip2MuteService.class));
        }
    }
}
Flip2MuteService -сервис

Ответить