Android-запуск службы во время загрузки - PullRequest
105 голосов
/ 30 декабря 2010

Мне нужно запустить сервис во время загрузки. Я много искал. Они говорят о Broadcastreceiver. Поскольку я новичок в разработке для Android, я не получил четкого представления об услугах на Android. Пожалуйста, предоставьте некоторый исходный код.

Ответы [ 8 ]

191 голосов
/ 30 декабря 2010

Ваш получатель:

public class MyReceiver extends BroadcastReceiver {   

    @Override
    public void onReceive(Context context, Intent intent) {

     Intent myIntent = new Intent(context, YourService.class);
     context.startService(myIntent);

    }
}

Ваш AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.broadcast.receiver.example"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">

        <activity android:name=".BR_Example"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    <!-- Declaring broadcast receiver for BOOT_COMPLETED event. -->
        <receiver android:name=".MyReceiver" android:enabled="true" android:exported="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

    </application>

    <!-- Adding the permission -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

</manifest>
94 голосов
/ 30 декабря 2010

Создайте BroadcastReceiver и зарегистрируйте его для получения ACTION_BOOT_COMPLETED . Вам также необходимо разрешение RECEIVE_BOOT_COMPLETED .

Чтение: Прослушивание и трансляция глобальных сообщений, и настройка сигналов тревоги

32 голосов
/ 22 июня 2011

Можно зарегистрировать свой собственный сервис приложений для запуска автоматически, когда устройство было загружено. Вам это нужно, для Например, когда вы хотите получать push-события от http-сервера и хочу сообщить пользователю, как только происходит новое событие. Пользователь не нужно начинать действие вручную, прежде чем служба запустится ...

Это довольно просто. Сначала дайте вашему приложению разрешение RECEIVE_BOOT_COMPLETED. Далее вам необходимо зарегистрировать BroadcastReveiver. Мы называем это BootCompletedIntentReceiver.

Ваш Manifest.xml должен выглядеть следующим образом:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.jjoe64">
 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
 <application>
  <receiver android:name=".BootCompletedIntentReceiver">
   <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED" />
   </intent-filter>
  </receiver>
  <service android:name=".BackgroundService"/>
 </application>
</manifest>

В качестве последнего шага вы должны реализовать Receiver. Этот приемник просто запускает фоновый сервис.

package com.jjoe64;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;

import com.jjoe64.BackgroundService;

public class BootCompletedIntentReceiver extends BroadcastReceiver {
 @Override
 public void onReceive(Context context, Intent intent) {
  if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
   Intent pushIntent = new Intent(context, BackgroundService.class);
   context.startService(pushIntent);
  }
 }
}

С http://www.jjoe64.com/2011/06/autostart-service-on-device-boot.html

15 голосов
/ 22 июня 2015

В большинстве решений, опубликованных здесь, отсутствует важная часть: выполнение без блокировки от пробуждения может привести к гибели вашей Службы до завершения ее обработки. Видел это решение в другой ветке, отвечая и здесь.

Поскольку WakefulBroadcastReceiver устарел в API 26, рекомендуется для уровней API ниже 26

Вам нужно получить замок от пробуждения. К счастью, библиотека поддержки дает нам класс для этого:

public class SimpleWakefulReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // This is the Intent to deliver to our service.
        Intent service = new Intent(context, SimpleWakefulService.class);

        // Start the service, keeping the device awake while it is launching.
        Log.i("SimpleWakefulReceiver", "Starting service @ " + SystemClock.elapsedRealtime());
        startWakefulService(context, service);
    }
}

затем в вашем Сервисе обязательно снимите блокировку от пробуждения:

    @Override
    protected void onHandleIntent(Intent intent) {
        // At this point SimpleWakefulReceiver is still holding a wake lock
        // for us.  We can do whatever we need to here and then tell it that
        // it can release the wakelock.

...
        Log.i("SimpleWakefulReceiver", "Completed service @ " + SystemClock.elapsedRealtime());
        SimpleWakefulReceiver.completeWakefulIntent(intent);
    }

Не забудьте добавить разрешение WAKE_LOCK и зарегистрировать получателя в манифесте:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

...

<service android:name=".SimpleWakefulReceiver">
    <intent-filter>
        <action android:name="com.example.SimpleWakefulReceiver"/>
    </intent-filter>
</service>
4 голосов
/ 22 декабря 2016

Вы должны зарегистрироваться для BOOT_COMPLETE, а также для REBOOT

<receiver android:name=".Services.BootComplete">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <action android:name="android.intent.action.REBOOT"/>
        </intent-filter>
    </receiver> 
1 голос
/ 06 июня 2013

Также зарегистрируйте созданный вами сервис в Манифесте и разрешении на использование как

<application ...>
   <service android:name=".MyBroadcastReceiver">
        <intent-filter>
            <action android:name="com.example.MyBroadcastReciver"/>
        </intent-filter>
   </service>
</application>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

, а затем в программе Braod Cast Reciever позвоните в ваш сервис

public class MyBroadcastReceiver extends BroadcastReceiver 
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Intent myIntent = new Intent(context, MyService.class);
        context.startService(myIntent);
    }
}
0 голосов
/ 20 ноября 2018

Проверка Pls JobScheduler для API выше 26

WakeLock был лучшим вариантом для этого, но устарел на уровне API 26 Просьба проверить эту ссылку , если вы считаете, API-уровни выше 26
https://developer.android.com/reference/android/support/v4/content/WakefulBroadcastReceiver.html#startWakefulService(android.content.Context,%20android.content.Intent)

Там написано

Начиная с Android O, ограничения проверки фона делают этот класс более бесполезным. (Как правило, запуск службы после получения трансляции небезопасен, поскольку у вас нет никаких гарантий того, что ваше приложение находится на переднем плане в данный момент и, следовательно, имеет право на это.) Вместо этого разработчики должны использовать * 1022. * android.app.job.JobScheduler для планирования задания, и для этого не требуется, чтобы приложение удерживало блокировку включения при этом (система позаботится о сохранении блокирования включения для задания).

как говорится cosider JobScheduler
https://developer.android.com/reference/android/app/job/JobScheduler

если что-то сделать, чем запустить и сохранить его, вы можете получить трансляцию ACTION_BOOT_COMPLETED

Если речь идет не о переднем плане, пожалуйста, проверьте, может ли служба специальных возможностей сделать

другой вариант - запустить действие с широковещательного приемника и завершить его после запуска службы в onCreate (), поскольку более новые версии Android не позволяют запускать службы с приемников

0 голосов
/ 03 октября 2013

Сначала зарегистрируйте получателя в файле manifest.xml:

    <receiver android:name="com.mileagelog.service.Broadcast_PowerUp" >
        <intent-filter>
            <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
            <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
        </intent-filter>
    </receiver>

, а затем напишите сообщение для этого получателя, например:

public class Broadcast_PowerUp extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();

    if (action.equals(Intent.ACTION_POWER_CONNECTED)) {
        Toast.makeText(context, "Service_PowerUp Started",
                Toast.LENGTH_LONG).show();


    } else if (action.equals(Intent.ACTION_POWER_DISCONNECTED)) {



        Toast.makeText(context, "Service_PowerUp Stoped", Toast.LENGTH_LONG)
        .show();
    }
  }
}
...