Ответы:
Во-первых, вам нужно разрешение в вашем 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);
}
}
}
И теперь ваш сервис должен быть запущен при запуске телефона.
Intent.ACTION_BOOT_COMPLETED
вместо жесткого кодирования строку в вашем приемнике. Также следует использовать новый Intent(context, MySystemService.class)
конструктор при создании Intent.
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
линию. Любые идеи?
Это как сделать деятельность начинается после андроида перезагрузки устройства:
Вставьте этот код в ваш 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>
теге , кажется , не является обязательным. Приложение получает событие без этих значений. Смотрите пример здесь .
Application
? Может внутри onCreate()
?
onReceive()
изBroadcastReceiver
Слушайте 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 4.2.2). Мне пришлось добавить фиктивное действие в тот же проект Android и запустить действие вручную на устройстве хотя бы один раз. Затем решение Шона начало работать, и BroadcastReceiver был уведомлен после последующих перезагрузок.
Я хотел бы добавить один момент в этот вопрос, с которым я столкнулся пару дней. Я перепробовал все ответы, но они не работали для меня. Если вы используете Android версии 5.1, пожалуйста, измените эти настройки.
Если вы используете Android версии 5.1, то вы должны отменить (Ограничить запуск) в настройках приложения.
настройки> приложение> ваше приложение> Ограничить запуск (отменить выбор)
Другой подход заключается в использовании android.intent.action.USER_PRESENT
вместо того, android.intent.action.BOOT_COMPLETED
чтобы избежать замедления во время процесса загрузки. Но это только в том true
случае, если пользователь включил блокировку экрана - иначе это намерение никогда не передается.
Ссылочный блог - проблема с намерением Android ACTION_USER_PRESENT