Как мне запустить мое приложение при запуске?
Я попытался использовать пример кода в этой ссылке, но он кажется устаревшим, и он не работал. Итак, какие изменения мне нужно внести и в какие файлы автоматически запускать мое приложение после завершения загрузки Android?
10 ответов
Во-первых, вам нужно разрешение в вашем 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);
}
}
}
И теперь ваш сервис должен быть запущен при запуске телефона.
Вот как можно запустить действие после перезагрузки устройства 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>
тег не кажется обязательным. Приложение получает событие без этих значений. Смотрите пример здесь.
Слушайте 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);
}
}
Кроме того, вы можете использовать приложение, такое как AutoStart, если вы не хотите изменять код, для запуска приложения Android при запуске: AutoStart - без рута
Для Android 10 есть фоновые ограничения.
Для Android 10 и всех версий Android выполните следующие действия, чтобы запустить приложение после перезагрузки или включить мобильный телефон.
Добавьте эти два разрешения в Android Manifest
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
Добавьте это в свой тег приложения
<receiver
android:name=".BootReciever"
android:enabled="true"
android:exported="true"
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>
Добавьте этот класс, чтобы начать работу при загрузке
public class BootReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Objects.equals(intent.getAction(), Intent.ACTION_BOOT_COMPLETED)) {
Intent i = new Intent(context, SplashActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}}
Нам нужно разрешение на рисование оверлея для Android 10
так что добавьте это в свое первое действие
private fun requestPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.canDrawOverlays(this)) {
val intent = Intent(
Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + this.packageName)
)
startActivityForResult(intent, 232)
} else {
//Permission Granted-System will work
}
}
}
Для пользователя flutter вы можете создать файл с именем в папке пакета. например.
android/app/src/main/kotlin/com/your_company/package
.
MainActivityReceiver.kt
:
package com.your_company.package
import android.content.BroadcastReceiver
import android.content.Context;
import android.content.Intent;
class MainActivityReceiver: BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
val i = Intent(context, MainActivity::class.java)
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(i)
}
}
}
Измените свой
AndroidManifest.xml
файл относятся к первому ответу.
Решение Шона изначально не работало для меня (Android 4.2.2). Мне пришлось добавить фиктивное действие в тот же проект Android и запустить действие вручную на устройстве хотя бы один раз. Затем решение Шона начало работать, и BroadcastReceiver был уведомлен после последующих перезагрузок.
Это мешало моему приложению, пожалуйста, сделайте это - оно появляется, и пользователь устанавливает флажок, чтобы дать разрешение
// To start app after boot
private void startSystemAlertWindowPermission(){
try{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if(! Settings.canDrawOverlays(this)) {
Log.i(TAG, "[startSystemAlertWindowPermission] requesting system alert window permission.");
startActivity(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:"+getPackageName())));
}
}
}catch (Exception e){
Log.e(TAG, "[startSystemAlertWindowPermission] error:", e);
}
}
Я хотел бы добавить один момент в этот вопрос, с которым я столкнулся пару дней. Я попробовал все ответы, но они не работали для меня. Если вы используете Android версии 5.1, пожалуйста, измените эти настройки.
Если вы используете Android версии 5.1, то вам нужно отменить (Ограничить запуск) в настройках приложения.
настройки> приложение> ваше приложение> Ограничить запуск (отменить выбор)
Другой подход заключается в использовании android.intent.action.USER_PRESENT
вместо android.intent.action.BOOT_COMPLETED
чтобы избежать замедлений во время процесса загрузки. Но это только true
если пользователь включил блокировку экрана - иначе это намерение никогда не передается.
Ссылочный блог - проблема с намерением Android ACTION_USER_PRESENT