Как мне запустить мое приложение при запуске? - PullRequest
217 голосов
/ 18 июня 2011

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

Ответы [ 7 ]

297 голосов
/ 18 июня 2011

Во-первых, вам нужно разрешение в вашем 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);
        }
    }
}

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

108 голосов
/ 10 апреля 2014

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

55 голосов
/ 18 июня 2011

Слушайте 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

10 голосов
/ 08 августа 2012

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

2 голосов
/ 12 ноября 2013

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

0 голосов
/ 30 августа 2017

screenshot

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

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

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

0 голосов
/ 14 мая 2014

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...