Как запустить приложение при запуске?

Я попытался использовать код примера в этой ссылке, но он кажется устаревшим, и это не сработало. Итак, какие изменения я должен внести и какие файлы для запуска приложения автоматически, когда Android закончит загрузку?

Ответ 1

Сначала вам нужно разрешение в 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);
        }
    }
}

И теперь ваша служба должна запускаться при запуске телефона.

Ответ 2

Вот как запустить активность после перезагрузки устройства 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> не кажутся обязательными. Приложение получает событие без этих значений. См. Пример здесь.

Ответ 3

Слушайте ACTION_BOOT_COMPLETE и делайте то, что вам нужно оттуда. Здесь содержится фрагмент кода.

Update:

Исходная ссылка на ответ не работает, поэтому, основываясь на комментариях, здесь он связан кодом, потому что никто никогда не пропустит код, когда ссылки опущены.

В AndroidManifest.xml(application-part):

<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

Ответ 4

Кроме того, вы можете использовать такое приложение, как AutoStart, если вы не хотите изменять код, чтобы запустить приложение для Android при запуске: AutoStart - нет root

Ответ 5

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

Ответ 6

screenshot

Я хотел бы добавить один пункт в этом вопросе, с которым я столкнулся пару дней. Я пробовал все ответы, но они не работали для меня. Если вы используете версию Android версии 5.1, пожалуйста, измените эти настройки.

Если вы используете версию Android версии 5.1, вам нужно отменить выбор (ограничение на запуск) из настроек приложения.

Настройки > приложение > ваше приложение > Ограничить для запуска (выбор)

Ответ 7

Другой подход - использовать android.intent.action.USER_PRESENT вместо android.intent.action.BOOT_COMPLETED чтобы избежать замедлений во время процесса загрузки. Но это true только в true случае, если пользователь включил блокировку экрана - иначе это намерение никогда не транслируется.

Справочный блог - Проблема с андроидами ACTION_USER_PRESENT Intent