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

241

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

Poojan
источник

Ответы:

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)конструктор при создании Intent.
Брианестей
7
Есть ли причина для проверки типа намерения, если используется фильтр намерений?
Pijusn
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

Это как сделать деятельность начинается после андроида перезагрузки устройства:

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

thrylos
источник
Мне нравится этот «ярлык», чтобы не делать локальный сервис. Этот код принадлежит к классу, который расширяется Application? Может внутри onCreate()?
Кто-то где-то
2
это похоже , что пункт кода должна быть в пределах onReceive()изBroadcastReceiver
Кто - то где - то
2
Этот код должен находиться в действии, а именно «yourActivityrRunOnStartup», которое расширяет класс BroadcastReceiver и внутри метода onReceive ().
Thrylos
2
Я пытался дать 10 голосов, но не смог. Извините и спасибо.
Сайка
1
Это сработало для меня, но ТОЛЬКО если, если у меня в фильтре намерений был только "<action android: name =" android.intent.action.BOOT_COMPLETED "/>". Если я использовал два других, это не сработало.
emhomm4
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 .. :(
Luca
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, пожалуйста, измените эти настройки.

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

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

Маниш Ядав
источник
3
Я не думаю, что это когда-либо было стандартом. Я никогда не слышал о «Ограничить запуск». Никогда не видел это на разных Samsung, Asus, Sony ... Это не имеет никакого смысла для меня. Там написано, что приложение разрешено только запускать? Что это значит?
Невероятное
0

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

Ссылочный блог - проблема с намерением Android ACTION_USER_PRESENT

user2627118
источник
Таким образом, другими словами, это не должно использоваться
behelit