Відповіді:
По-перше, вам потрібен дозвіл у вашому 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)
конструктора слід використовувати новий конструктор.
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
лінію. Будь-які ідеї?
Ось як змусити діяльність починати працювати після перезавантаження пристрою 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>
тезі , здається , НЕ є обов'язковим. Додаток отримує подію без цих значень. Дивіться приклад тут .
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, будь ласка, змініть ці налаштування.
Якщо ви використовуєте андроїд версії 5.1, тоді вам доведеться відключити (Обмежити для запуску) налаштування програми.
налаштування> додаток> ваше додаток> Обмежити запуск (не вибрати)
Інший підхід - використовувати android.intent.action.USER_PRESENT
замість того, android.intent.action.BOOT_COMPLETED
щоб уникнути повільних спадів під час завантаження. Але це лише в тому випадку, true
якщо користувач увімкнув Екран блокування - інакше цей намір ніколи не транслюється.
Довідковий блог - Проблема з наміром ACTION_USER_PRESENT Android