Android Starting Service at Boot Time , How to restart service class after device Reboot?

AndroidServiceBackground ServiceAutostartBootcompleted

Android Problem Overview


I need to start a service at boot time. I searched a lot. They are talking about Broadcastreceiver. As I am new to android development, I didn't get a clear picture about services on Android. Please provide some source code.

Android Solutions


Solution 1 - Android

Your receiver:

public class MyReceiver extends BroadcastReceiver {   

    @Override
    public void onReceive(Context context, Intent intent) {
    
     Intent myIntent = new Intent(context, YourService.class);
     context.startService(myIntent);

    }
}

Your 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>

Solution 2 - Android

Solution 3 - Android

> It's possible to register your own application service for starting > automatically when the device has been booted. You need this, for > example, when you want to receive push events from a http server and > want to inform the user as soon a new event occurs. The user doesn't > have to start the activity manually before the service get started... > > It's quite simple. First give your app the permission > RECEIVE_BOOT_COMPLETED. Next you need to register a BroadcastReveiver. > We call it BootCompletedIntentReceiver. > > Your Manifest.xml should now look like this: > > http://schemas.android.com/apk/res/android" > package="com.jjoe64"> > > > > > > > > > > > > As the last step you have to implement the Receiver. This receiver > just starts your background service. > > 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); > } > } > }

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

Solution 4 - Android

Most the solutions posted here are missing an important piece: doing it without a wake lock runs the risk of your Service getting killed before it is finished processing. Saw this solution in another thread, answering here as well.

Since WakefulBroadcastReceiver is deprecated in api 26 it is recommended for API Levels below 26

You need to obtain a wake lock . Luckily, the Support library gives us a class to do this:

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);
    }
}

then, in your Service, make sure to release the wake lock:

    @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);
    }

Don't forget to add the WAKE_LOCK permission and register your receiver in the manifest:

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

Solution 5 - Android

you should register for BOOT_COMPLETE as well as 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> 

Solution 6 - Android

Also register your created service in the Manifest and uses-permission as

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

and then in braod cast Reciever call your service

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

Solution 7 - Android

To Restart service in Android O or more ie OS >28 Use this code KOTLIN VERSION

  1. Add permission in manifest

  2. Create a Class and extend it with BroadcastReceiver

    import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.os.Build import android.util.Log import androidx.core.content.ContextCompat

    class BootCompletedReceiver : BroadcastReceiver() { override fun onReceive(context: Context, arg1: Intent?) { Log.d("BootCompletedReceiver", "starting service...") if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { ContextCompat.startForegroundService(context, Intent(context, YourServiceClass::class.java)) } else { context.startService(Intent(context, YourServiceClass::class.java)) } } }

  3. Declare in Manifest file like this under application tag

Solution 8 - Android

First register a receiver in your manifest.xml file:

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

and then write a broadcast for this receiver like:

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();
	}
  }
}

Solution 9 - Android

Pls check JobScheduler for apis above 26

WakeLock was the best option for this but it is deprecated in api level 26 Pls check this link if you consider api levels above 26
https://developer.android.com/reference/android/support/v4/content/WakefulBroadcastReceiver.html#startWakefulService(android.content.Context,%20android.content.Intent)

It says

> As of Android O, background check restrictions make this class no longer generally useful. (It is generally not safe to start a service from the receipt of a broadcast, because you don't have any guarantees that your app is in the foreground at this point and thus allowed to do so.) Instead, developers should use android.app.job.JobScheduler to schedule a job, and this does not require that the app hold a wake lock while doing so (the system will take care of holding a wake lock for the job). >

so as it says cosider JobScheduler
https://developer.android.com/reference/android/app/job/JobScheduler

if it is to do something than to start and to keep it you can receive the broadcast ACTION_BOOT_COMPLETED

If it isn't about foreground pls check if an Accessibility service could do

another option is to start an activity from broadcast receiver and finish it after starting the service within onCreate() , since newer android versions doesnot allows starting services from receivers

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionharishView Question on Stackoverflow
Solution 1 - AndroidVladimir IvanovView Answer on Stackoverflow
Solution 2 - AndroidPeter KnegoView Answer on Stackoverflow
Solution 3 - AndroidappsthatmatterView Answer on Stackoverflow
Solution 4 - AndroidphreakheadView Answer on Stackoverflow
Solution 5 - AndroidRaafat AlhmidiView Answer on Stackoverflow
Solution 6 - AndroidSoftEyeView Answer on Stackoverflow
Solution 7 - AndroidQuick learnerView Answer on Stackoverflow
Solution 8 - AndroidManoj TarkarView Answer on Stackoverflow
Solution 9 - AndroidHarshView Answer on Stackoverflow