Як запустити додаток при запуску?


241

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

Відповіді:


315

По-перше, вам потрібен дозвіл у вашому AndroidManifest.xml:

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

Крім того, у вашому AndroidManifest.xmlвизначте свою послугу та послухайте BOOT_COMPLETED дії:

<service android:name=".MyService" android:label="My Service">
    <intent-filter>
        <action android:name="com.myapp.MyService" />
    </intent-filter>
</service>

<receiver
    android:name=".receiver.StartMyServiceAtBootReceiver"
    android:label="StartMyServiceAtBootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

Тоді вам потрібно визначити приймач, який виконає BOOT_COMPLETED і розпочати вашу послугу.

public class StartMyServiceAtBootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            Intent serviceIntent = new Intent(context, MyService.class);
            context.startService(serviceIntent);
        }
    }
}

А тепер ваша послуга повинна працювати, коли телефон запускається.


8
Діяльність: developer.android.com/guide/topics/fundamentals/activities.html Послуги: developer.android.com/guide/topics/fundamentals/services.html Щоб запустити програму, коли телефон фактично запускається, вам потрібно буде зареєструйте послугу, як показано вище, а потім там ви можете використовувати startActivity () для запуску програми. Недоцільно ставити екран перед користувачем, якщо він цього не вимагав.
Шон Шульте

19
Просто хотів додати, що краще використовувати Intent.ACTION_BOOT_COMPLETEDзамість жорсткого кодування рядка у Вашому приймачі. Також при використанні нового Intent(context, MySystemService.class)конструктора слід використовувати новий конструктор.
brianestey

7
Чи є причина перевірки типу наміру, якщо використовується фільтр намірів?
Піджун

1
Чомусь я потрапляю Multiple markers at this line - BroadcastReceiver cannot be resolved to a type - The public type StartMyServiceAtBootReceiver must be defined in its own fileна public classлінію. Будь-які ідеї?
pattyd

3
Що таке MySystemService?
спорт

120

Ось як змусити діяльність починати працювати після перезавантаження пристрою Android:

Вставте цей код у свій AndroidManifest.xmlфайл, всередині <application>елемента ( не в межах <activity>елемента):

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

<receiver
    android:enabled="true"
    android:exported="true" 
    android:name="yourpackage.yourActivityRunOnStartup"
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED">

    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>

</receiver>

Потім створіть новий клас yourActivityRunOnStartup(відповідає android:nameвказаному для <receiver>елемента в маніфесті):

package yourpackage;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class yourActivityRunOnStartup extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
            Intent i = new Intent(context, MainActivity.class);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);
        }
    }

}

Примітка. Виклик i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);важливий, оскільки активність запущена з контексту, який не входить у діяльність. Без цього діяльність не розпочнеться.

Крім того , значення android:enabled, android:exportedі android:permissionв <receiver>тезі , здається , НЕ є обов'язковим. Додаток отримує подію без цих значень. Дивіться приклад тут .


Мені подобається цей "ярлик", щоб уникнути необхідності робити місцевий сервіс. Чи належить цей код до класу, який поширюється Application? Можливо, всерединіonCreate() ?
Хтось десь

2
схоже, що параметр коду має бути в межах onReceive() зBroadcastReceiver
Хто - то де - то

2
Цей код повинен бути в активності, а саме "yourActivityrRunOnStartup", який розширює клас BroadcastReceiver і всередині методу onReceive ().
трило

2
Я намагався дати 10 upvotes, але не міг. Вибачте і дякую.
Сайка

1
Це працювало для мене, але ТОЛЬКО, якщо у фільтрі намірів у мене просто "<дія android: name =" android.intent.action.BOOT_COMPLETED "/>". Якщо я використав інші два, це не вийшло.
емхом4

67

Слухайте ACTION_BOOT_COMPLETE і робіть все необхідне звідти. Тут є фрагмент коду .

Оновлення:

Оригінальна посилання на відповідь знижена, тому на основі коментарів, тут вона посилається кодом, тому що ніхто ніколи не пропустить код, коли посилання не працюють.

В AndroidManifest.xml (частина програми):

<receiver android:enabled="true" android:name=".BootUpReceiver"
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED">

        <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
</receiver>

...

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

...

public class BootUpReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
                Intent i = new Intent(context, MyActivity.class);  //MyActivity can be anything which you want to start on bootup...
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(i);  
        }

}

Джерело: https://web.archive.org/web/20150520124552/http://www.androidsnippets.com/autostart-an-application-at-bootup


Який файл розміщений у цьому коді: BootUpReceiver публічного класу розширює BroadcastReceiver
Джефф Джейнс

Це працює, дякую! (працював на Android 4.0.4 API рівня 15). Так, це 2017 рік, і мені ще належить розробити для Android 4.0.4 .. :(
Лука

2
Не працює на Android 8.0! Хоча працює на Android 4.0.
codezombie

Я використовую той самий код, але його не працює до версії kitkat, я хочу запустити програму, коли запускається Android TV
Ashutosh Tripathi

@AshutoshTripathi це ви виправили?
ralphgabb

10

Крім того, ви можете використовувати таку програму, як AutoStart, якщо ви не хочете змінювати код, щоб запустити програму Android під час запуску: AutoStart - Без кореня


2

Рішення Шона для мене спочатку не працювало (Android 4.2.2). Мені довелося додати фіктивну діяльність до того ж проекту Android і хоча б один раз запустити діяльність вручну на пристрої. Тоді рішення Шона почало працювати, і BroadcastReceiver був повідомлений після наступних перезавантажень.


0

скріншот

Я хотів би додати ще один момент у цьому питанні, з яким я стикався пару днів. Я спробував усі відповіді, але це не працювало для мене. Якщо ви використовуєте Android версії 5.1, будь ласка, змініть ці налаштування.

Якщо ви використовуєте андроїд версії 5.1, тоді вам доведеться відключити (Обмежити для запуску) налаштування програми.

налаштування> додаток> ваше додаток> Обмежити запуск (не вибрати)


3
Я не думаю, що це було колись стандартним. Я ніколи не чув про "Обмежити запуск". Ніколи не бачив його на різних Samsung, Asus, Sony ... Це не має для мене ніякого сенсу. Там написано, що додаток дозволено запускати лише? Що це означає?
Неймовірний

0

Інший підхід - використовувати android.intent.action.USER_PRESENTзамість того, android.intent.action.BOOT_COMPLETEDщоб уникнути повільних спадів під час завантаження. Але це лише в тому випадку, trueякщо користувач увімкнув Екран блокування - інакше цей намір ніколи не транслюється.

Довідковий блог - Проблема з наміром ACTION_USER_PRESENT Android


Інакше кажучи, його не слід використовувати
бехеліт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.