How to set default app launcher programmatically? How to set default app launcher programmatically? android android

How to set default app launcher programmatically?


This is actually possible with a little workaround:

Create an empty Activity that acts as a launcher called FakeLauncherActivity. Add it to your manifest as a disabled component:

<activity    android:name="com.path.to.your.FakeLauncherActivity"    android:enabled="false">    <intent-filter>        <action android:name="android.intent.action.MAIN" />        <category android:name="android.intent.category.HOME" />        <category android:name="android.intent.category.DEFAULT" />    </intent-filter></activity>

Check whether your desired launcher activity is the default one (with the isMyAppLauncherDefault() from your question).

If not, offer the user to choose the preferred launcher activity like this:

public static void resetPreferredLauncherAndOpenChooser(Context context) {    PackageManager packageManager = context.getPackageManager();    ComponentName componentName = new ComponentName(context, com.path.to.your.FakeLauncherActivity.class);    packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);    Intent selector = new Intent(Intent.ACTION_MAIN);    selector.addCategory(Intent.CATEGORY_HOME);    selector.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    context.startActivity(selector);    packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, PackageManager.DONT_KILL_APP);}

This method temporarily enables FakeLauncherActivity, which leads to a change in the set of available launcher activities, which forces Android to forget its default launcher. You will see something like...

521-735/system_process I/PackageManager﹕ Result set changed, dropping preferred activity for Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 } type null

... in your log.

The method then simply opens a launcher intent where you can see all installed launchers and the buttons "Always" / "Just once".Finally, the method disables FakeLauncherActivity again so that it doesn't display in the list.

You could repeat that as often as you want and only let the user proceed if your desired launcher activity is set as default.


The isMyAppLauncherDefault() function in the question doesn't always work for some reason.This code might be better for determining what is the default package for the HOME screen.

Intent intent = new Intent(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_HOME);ResolveInfo resolveInfo = getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);String currentHomePackage = resolveInfo.activityInfo.packageName;


I want the user to be forced into selecting ALWAYS instead of JUST ONCE when that dialog comes up

That is not possible, except perhaps on rooted devices, barring some security flaw in Android.

When I do this I am not receiving the choice between my app and the stock launcher

Correct. If a default has already been chosen, this will simply launch the default.

I tried using startActivity(Intent.createChooser(intent, "Please set launcher settings to ALWAYS")); and I get the choices between my app and the stock launcher, however, I don't get the options ALWAYS or JUST ONCE.

Correct. createChooser() forces a choice, but does not allow setting a default.