Я попытался использовать код примера в этой ссылке, но он кажется устаревшим, и это не сработало. Итак, какие изменения я должен внести и какие файлы для запуска приложения автоматически, когда 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);
}
}
Ответ 4
Кроме того, вы можете использовать такое приложение, как AutoStart, если вы не хотите изменять код, чтобы запустить приложение для Android при запуске: AutoStart - нет root
Ответ 5
Решение Sean для меня не работало (Android 4.2.2). Мне пришлось добавить фиктивную активность к одному и тому же проекту Android и хотя бы один раз запустить его вручную на устройстве. Затем решение Sean начало работать, и BroadcastReceiver был уведомлен после последующих перезагрузок.
Ответ 6
Я хотел бы добавить один пункт в этом вопросе, с которым я столкнулся пару дней. Я пробовал все ответы, но они не работали для меня. Если вы используете версию Android версии 5.1, пожалуйста, измените эти настройки.
Если вы используете версию Android версии 5.1, вам нужно отменить выбор (ограничение на запуск) из настроек приложения.
Настройки > приложение > ваше приложение > Ограничить для запуска (выбор)
Ответ 7
Другой подход - использовать android.intent.action.USER_PRESENT
вместо android.intent.action.BOOT_COMPLETED
чтобы избежать замедлений во время процесса загрузки. Но это true
только в true
случае, если пользователь включил блокировку экрана - иначе это намерение никогда не транслируется.
Справочный блог - Проблема с андроидами ACTION_USER_PRESENT Intent