Android在代码中设置新的默认主页

时间:2014-06-24 08:28:35

标签: android xamarin

我有一个应用程序,我想将其设置为默认主屏幕,但我遇到了一个奇怪的问题。

我有一个允许用户选择默认主屏幕的设置。

我使用以下代码来允许他们选择默认活动:

Intent selector = new Intent(Intent.ActionMain);
selector.AddCategory(Intent.CategoryHome);
selector.AddCategory(Intent.CategoryDefault);
selector.SetComponent(new ComponentName("android", "com.android.internal.app.ResolverActivity"));

StartActivity(selector);

当前没有设置默认值,我运行该代码并选择我的应用作为默认值,并告诉它始终使用它。

现在,我再次运行代码,并告诉它使用不同的Activity(不是我的)并始终使用它。

问题是,如果默认设置它永远不会切换到任何不同的东西。

我已经看过其他应用程序允许你这样做,所以我错过了一些东西,我只是不知道是什么。

我在三星Galaxy S4上测试了这一点,API级别设置为14。

2 个答案:

答案 0 :(得分:3)

好的,我找到了问题的答案。

答案在这里: http://www.trustydroid.com/2014/05/19/force-show-default-app-chooser-dialog/

您应该记住的一件事是组件名称必须正确。显然在API14下,如果类名不正确,它会忽略组件(并且行为类似)。因此,它通过启用组件,启动选择器,然后禁用组件的动作。但是,它永远不会保存新的默认值。

在我尝试在API19下编译之后,操作系统抛出了一个异常,这导致我解决了我在使用它时遇到的问题(这是一个不正确的类名)。

一旦我理顺了,它就完全符合我的要求。

为了完整起见,这里是代码:

像这样创建一个FakeActivity:

[Activity(Label = "FakeLauncher", Enabled = false)]
[IntentFilter(new[] { Intent.ActionMain }, Categories = new[] { Intent.CategoryHome, Intent.CategoryDefault })]
public class FakeLauncher : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        // Create your application here
    }
}

然后,您想要更改默认主页,请运行以下代码:

 ComponentName componentName = new ComponentName(Application.PackageName, "<fake activity class name>");
 PackageManager.SetComponentEnabledSetting(componentName, Android.Content.PM.ComponentEnabledState.Enabled, Android.Content.PM.ComponentEnableOption.DontKillApp);

 Intent tempIntent = new Intent(Intent.ActionMain);
 tempIntent.AddCategory(Intent.CategoryHome);

 StartActivity(tempIntent);

 PackageManager.SetComponentEnabledSetting(componentName, Android.Content.PM.ComponentEnabledState.Disabled, Android.Content.PM.ComponentEnableOption.DontKillApp);

答案 1 :(得分:1)

如果您仍然收到组件名称不正确的例外

Unhandled Exception:
Java.Lang.IllegalArgumentException: Component class FakeLauncher does not exist in com.application.name

您可以获得正确的&#34;假活动类名称&#34;在Xamarin这样:

string className = Java.Lang.Class.FromType(typeof(FakeLauncher)).Name;

组件名称可以非常随机,如下所示:md546c42bb6607ccd24974e44efa088a043.FakeLauncher