Android BOOT_COMPLETED не отримано, коли програма закрита

Я усвідомлюю, що це питання було задано багато на сайті, проте, я не можу знайти рішення. Мій BOOT_COMPLETED приймач не викликається, коли програма не працює.

Маніфест:


    
    

    
        
            
                
                
            
        

        
            
                
            
        
    

StartUpBootReceiver:

public class StartUpBootReceiver  extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        Log.d("startuptest", "StartUpBootReceiver " + intent.getAction());

        if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
            Log.d("startuptest", "StartUpBootReceiver BOOT_COMPLETED");
        }
    }
}

Якщо програма запущена, і я імітую дзвінок за допомогою

adb shell
am broadcast -a android.intent.action.BOOT_COMPLETED

Подія отримана правильно, однак, якщо додаток закрито, подія не приймається, і вона не отримується при запуску.

Я встановив додаток, а потім запустив його кілька разів, щоб переконатися, що він зареєстрований. Я дуже загубився на цьому, тому будь-яка порада буде високо оцінена.

Редагування: Я бачу в журналах, що всі інші закриті програми (Youtube, FileObserver і т.д.) отримують подію boot_completed, але не моя.

20

7 Відповіді

Починаючи з Android 3.1 , всі програми після встановлення розміщуються в стані " припинено ". зупиняє додаток із програми Налаштування.)

Android stopped state

У стані "припинено" програма не буде працювати з будь-якої причини , за винятком ручного запуску активності. (Значення BroadcastReceviers ( ACTION_PACKAGE_INSTALLED , BOOT_COMPLETED тощо) буде викликано, незалежно від події, для якої вони зареєстровані, до користувач запускає програму вручну .)

Це анти-шкідливе переміщення Google. Google виступає за те, що користувачам слід спочатку запускати діяльність з пускової установки, перш ніж цей додаток може зробити багато. Попередження того, що BOOT_COMPLETED буде доставлено до запуску активності, є логічним наслідком цього аргументу.

Детальніше про це:
http://developer.android.com/about/versions/android-3.1.html#launchcontrols
http://commonsware.com/blog/2011/07/05/boot-completed- regression.html
http://devmaze.wordpress.com/2011/12/05/activating-applications/

82
додано
Але в чому ж сенс реєструвати повний трансляцію завантаження? Як я бачу це, якщо я не можу вжити жодних дій/зробити щось у часі після завантаження пристрою і до запуску програми користувачем, то яку мету вирішить реєстрація завантажувача?
додано Автор Bluesir9, джерело
ця відповідь має бути прочитана, якщо у вас є додаток лише з BroadcastReceiver і Service для нього
додано Автор Akhil Jain, джерело
Ця відповідь заслуговує більшої кількості голосів
додано Автор Arijoon, джерело
Це посилання також охоплює відповідну тему.
додано Автор zgulser, джерело
@ Bluesir9 Я був збентежений, як ви, але після кількох годин читання навколо, я отримав ці ідеї. Програми перебувають у зупиненому стані, коли вони вперше встановлені, але ще не запущені, а коли їх вручну зупиняє користувач (у розділі Керування програмами). Це означає, що користувач повинен запустити програму принаймні Одного разу після установки для активації програми , програма може отримувати всі неявні трансляції з ОС як звичайно.
додано Автор Think Twice Code Once, джерело
подивіться на мою відповідь, щоб отримати більш детальну інформацію: android "> stackoverflow.com/questions/20441308/…
додано Автор Think Twice Code Once, джерело

Я починаю своє додаток, коли BOOT_COMPLETED, так що я знаю, що він працює. Я додаю Log.d , який він не покаже. Я показую Toast . Малі різниці в Manifest.xml


    
         
         
                

28
додано
@Ketan ці два значення вірні за замовчуванням - якщо щось почало працювати, то ви просто включили "run in background" на meizu flyme, або додали додаток до захищеного на huawei або будь-що, що дивно трапляється на сучасних телефонах. За винятком можливо пріоритету = 999.
додано Автор Boris Treukhov, джерело
Спасибі, це зробило трюк. android: enabled = "true" android: exported = "true" також потрібно, щоб Android знав про цей приймач.
додано Автор Ketan, джерело
Але це не типові значення. developer.android.com/guide/topics/manifest/…> a>
додано Автор MZB, джерело
Ви отримаєте Log.d на іншій консолі процесу на моніторі Android, оскільки exported = "true" робить приймачем новий процес
додано Автор Samuel Robert, джерело
Я залишив тег Default
додано Автор user346443, джерело

Кожна відповідь тут додається невелика частина інформації, так ось резюме всього цього:

Щоб переконатися, що ви отримаєте BOOT_COMPLETED, виконайте такі дії:

  1. Add your receiver to manifest (don't forget the flags):

    
        
            
            
        
    
    
  2. Add permission:

  3. After installing your app, it needs to be lunch at least once, manually by the user, in order to receive Boot complete event.(More details)

25
додано
Хороший. Я пропустив дозвіл
додано Автор Ton, джерело
це не потрібно
додано Автор user3290180, джерело
Але чому потрібне значення за замовчуванням?
додано Автор JacksOnF1re, джерело
Я бачу, що [принаймні на Зефірлі], якщо я Змогу Закрити моє додаток, тоді BroadcastReceiver onReceive ніколи не спрацьовує. Хіба це правда, і якщо так, то чи є щось навколо цього?
додано Автор swooby, джерело

боровся з тією ж проблемою, тому що ви використовуєте Log.d , щоб відстежувати програму в logcat, на жаль, при перезавантаженні телефону програма отримує BOOT_Complete ви не бачите його, тому що це не реєстрація в logcat.

спробуйте зробити Toast з текстом замість Log.d , щоб переконатися, що BOOT_COMPLETED є або не отримано.

сподіваюся на цю довідку.

1
додано
Виклики "Тост" також не відображаються.
додано Автор user346443, джерело

В основному вам потрібні android: enabled = "true" android: exported = "true" прапори в маніфесті, щоб отримати трансляцію.


        
            
            
        
    
1
додано

Тут ви знайдете версію C# , якщо ви її хочете. Мої тести показують, що він працює досить бездоганно, і запуск досить швидкий. Хоча слід зазначити, що додавання його як у C# , так і в AndroidManifest.xml розбиває його (принаймні для мене).

Я також додав кілька приємних і корисних прикладів, які я хотів, щоб я дізнався від когось, а не вивчав його сам, читаючи документальні фільми та ін.

[BroadcastReceiver(Enabled = true, Exported = true, DirectBootAware = true, Name = "com.nevaran.startup.StartUpBootReceiver")]
[IntentFilter(new string[] {
    Intent.ActionBootCompleted
    , Intent.ActionLockedBootCompleted
    , Intent.ActionMyPackageReplaced
    , Intent.ActionUserInitialize
    , "android.intent.action.QUICKBOOT_POWERON"
    , "com.htc.intent.action.QUICKBOOT_POWERON"
})]
public class BootReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
         if(    intent.Action.Equals(Intent.ActionBootCompleted)
             || intent.Action.Equals(Intent.ActionLockedBootCompleted)
             || intent.Action.Equals(Intent.ActionUserInitialize)
             || intent.Action.Equals("android.intent.action.QUICKBOOT_POWERON")
             || intent.Action.Equals("com.htc.intent.action.QUICKBOOT_POWERON")
           )
        {
            //run code here only if its started by the chosen actions
        }
        //some code that doesnt care about which action is triggered by
    }
}
1
додано

Якщо ви хочете дізнатися фактичну причину, чому BOOT_COMPLETE не працює або не отримує. Я запропоную вам перейти на сайт OFFICIAL Android. Вони пояснили точне рішення.

Android developer - BOOT_COMPLETE

0
додано
android_jobs_ua
android_jobs_ua
120 учасників

Публикуем вакансии и запросы на поиск работы по направлению Android. Здесь всё: full-time, part-time, remote и разовые подработки.

Mobile Dev Jobs UA
Mobile Dev Jobs UA
20 учасників

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin, RN и т.д.