Android-запуск службы во время загрузки

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

Ответ 2

Ваш приемник:

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>

Ответ 3

Можно зарегистрировать свою собственную службу приложений для запуска автоматически при загрузке устройства. Вам это нужно, поскольку например, когда вы хотите получать 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>

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

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

Ответ 4

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

Поскольку 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>

Ответ 5

вам следует зарегистрироваться для 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> 

Ответ 6

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

<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"/>

а затем в приложении Trader, вызывающем вашу услугу

public class MyBroadcastReceiver extends BroadcastReceiver 
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Intent myIntent = new Intent(context, MyService.class);
        context.startService(myIntent);
    }
}

Ответ 7

Сначала зарегистрируйте получателя в файле 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();
    }
  }
}

Ответ 8

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

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

В нем говорится:

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

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

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

Если речь идет не о планшетах переднего плана, проверьте, может ли служба доступности