Can't Launch App on Phone Reboot Android (Tried all possible solutions on internet)

72 Views Asked by At

I do get the log printed in broadcast receiver but Activity is not launched.

Note : This works on Android 8 but on Android 10,11 and onwards it doesn't work

Here is the code for Broadcast Receiver

class MyReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
    if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
        // Start your app here
        Log.e("BootReceiver", "Boot completed. Starting MainActivity.")

        val launchIntent = Intent(context, MainActivity::class.java)
        launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        context.startActivity(launchIntent)

        }
    }
}

And code of Menifest is (I have registered the receiver in menifest and added all possible permissions and filters action in it):

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

<application
    android:allowBackup="true"
    android:dataExtractionRules="@xml/data_extraction_rules"
    android:fullBackupContent="@xml/backup_rules"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/Theme.MyAutoStartApp"
    tools:targetApi="31">
    <activity
        android:name=".MainActivity"
        android:exported="true"
        android:label="@string/app_name"
        android:theme="@style/Theme.MyAutoStartApp">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <receiver
        android:name=".MyReceiver"
        android:enabled="true"
        android:exported="false">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            <action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
            <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>

</application>
1

There are 1 best solutions below

0
kipo On

Some restrictions were introduced in android 10 which makes it less straight forward than before. If you want to launch an activity on boot on android 10 onwards you'll have to request and get from the user the SYSTEM_ALERT_WINDOW permission during runtime. You can do so with the following piece of code:

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && !Settings.canDrawOverlays(this)) {
        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
        startActivityForResult(intent, 0);
    }

After getting the permission from the user your code that currently only launches an activity after boot on android 9 and below should work on android 10 and above as well.