0

I want to start a service after reboot. The problem I have is that this does not happen every time (at least the first 20 minnutes). I have study many questions into stackoverflow and try a number of the provided solutions however sometimes the service does not automaticaly start after reboot. Also I have to add another parameter this of the foreground service for android versions O and above. Could someone give me any advice?

AndroidManifest.xml

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

<application
    android:name=".App"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    >
    <activity
        android:name=".Activities.MainActivity"
        ....
    </activity>


    <activity
        ...
    </activity>
    <receiver android:name=".Helpers.BootCompletedIntentReceiver" android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
     <!--  I think that this is also not necessery     <category android:name="android.intent.category.DEFAULT" /> -->
            <action android:name="android.intent.action.QUICKBOOT_POWERON"/>
        </intent-filter>
    </receiver>
    <service
        android:name=".Services.myService"
        android:enabled="true"
        android:exported="true"></service>

</application>

BroadcastReciever

package com.abc.Helpers;

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Build;
    import android.support.v4.content.ContextCompat;
    import android.util.Log;
    import com.abx.Activities.MainActivity;
    import com.abc.Services.myService;
public class BootCompletedIntentReceiver extends BroadcastReceiver {

private static final String TAG = "MyBroadcastReceiver";
@Override
public void onReceive(Context context, Intent intent) {
    if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
        Intent serviceIntent = new Intent(context, myService.class);
        serviceIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            ContextCompat.startForegroundService(context,serviceIntent);
        } else {
            context.startService(serviceIntent);
        }
    } 
}

I also found in a comment here that reciever should be registered into an activity of the application and this is the code in Mainactivity. Do you agree?

     @Override
    protected void onCreate(Bundle savedInstanceState) {
...
final ComponentName onBootReceiver = new ComponentName(getApplication().getPackageName(), BootCompletedIntentReceiver.class.getName());
        if(getPackageManager().getComponentEnabledSetting(onBootReceiver) != PackageManager.COMPONENT_ENABLED_STATE_ENABLED)
            getPackageManager().setComponentEnabledSetting(onBootReceiver,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP);
..
}
  • Can you please elaborate "The problem I have is that this does not happen every time (at least the first 20 minnutes)" – Jitesh Mohite Dec 05 '18 at 03:32
  • I mean that the service does not automatically start (as it should) after reboot every time. Sometimes I was waiting up to twenty minnutes to check if it will start but it didnt. So I was wondering why this happening. Is it normal or something is wrong with my code. – user3101106 Dec 05 '18 at 06:29

0 Answers0