Start ForegroundService on Boot api 29

Viewed 262

I try to start a ForegroundService by an BroadcastReceiver on Boot. I have tried this on a device with Android 8 and on an emulated Android 10 device. Both work fine. The problem is, that this code does not work on my Android 10 Galaxy S9. I have debugged everything, my BroadcastReceiver and the OnStartCommand method but also if the BroadcastReceiver runs the code fine, the OnStartCommand method does not start running. I have a mainActivity in which the user has to apply this Process so the app gets opened once before the BroadcastReceiver should work. I tried almost every solution i found here but nothing worked for me. I don't understand why this is working on some devices but not on each. I hope someone can help me!

My min API is 26.

BroadcastReceiver

public class Restarter extends BroadcastReceiver {
   

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



        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

            Intent intentt = new Intent (context, MyService.class);
            intentt.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startForegroundService(intentt);                

        } else {
            Intent intentt = new Intent (context, MyService.class);
            intentt.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startService(intentt);
        }
    }
}

Service

public class MyService extends Service {

    public static final String CHANNEL_ID = "exampleServiceChannel";
    

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("WhereAreWe", "create");
        createNotificationChannel();
    }

    private void createNotificationChannel() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel serviceChannel = new NotificationChannel(
                    CHANNEL_ID,
                    "Foreground Service Channel",
                    NotificationManager.IMPORTANCE_DEFAULT


            );
            NotificationManager manager = getSystemService(NotificationManager.class);
            manager.createNotificationChannel(serviceChannel);
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);
        Log.d("WhereAreWe", "StartCommand");
        SharedPreferences check = getSharedPreferences("Checked", Context.MODE_PRIVATE);

        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O){

            Intent intents = new Intent(this, MainActivity.class);
            intents.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intents, 0);
            NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "newid")
                .setSmallIcon(R.drawable.ic_android)
                .setContentTitle("Foreground Service")
                .setContentText("Example text")
                .setOngoing(true)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .setContentIntent(pendingIntent);

            startForeground(1, builder.build());
        }else{
                startForeground(1, new Notification());
        }
    }
    
}

Manifest

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.MyApplication">
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <application
        .
        .
        .
        <receiver
            android:name=".Restarter"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="restartservice" />
                <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>

        <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true"
            android:stopWithTask="false" />
    </application>
</manifest>
0 Answers
Related