2

我有一个自定义启动器。当我安装它时,我第一次打开它并使用以下代码为启动器加载意图选择器:

Intent localIntent = new Intent(Intent.ACTION_MAIN);
localIntent.addCategory(Intent.CATEGORY_HOME);
localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(localIntent);

我的应用程序将显示所有启动器。然后我选择另一个启动器,即不是启动器的那个,并将其设置为默认值。然后下次运行上面的代码时,意图选择器不会出现,我无法更改默认启动器。这是我试图解决的问题:

private void callIntenChoiceLauncher(Context c) 
{
    PackageManager p = getPackageManager();
    ComponentName cN = new ComponentName(c, RunDefaultLauncher.class);
    p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

    Intent selector = new Intent(Intent.ACTION_MAIN);
    selector.addCategory(Intent.CATEGORY_HOME);        
    c.startActivity(selector);

    p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
}

它不工作。

4

2 回答 2

1

在这段代码中:

c.startActivity(selector);
p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

当你打电话时startActivity(),活动不会立即开始。这样做只是告诉 Android 框架,您希望在框架获得控制权的下一个可能时间启动另一个活动。在下一行中,您禁用该组件,以便当 Android 框架启动 Activity 时,您的启动器组件已再次被禁用。

调用startActivity() 不是同步的。

于 2013-09-09T12:17:09.883 回答
0

假设您想在选择器显示后禁用主页活动,以便默认启动器对主页按钮做出反应,直到您启用活动:

请勿在 startActivity 后禁用您的家庭活动。这应该在onDestroy()您的家庭活动中完成。

修改onCreate()您的家庭活动:

public void onCreate(Bundle savedInstanceState) {
    /*check some flag in sharedPreferences or elsewhere 
    to determine if the activity was launched as part of the chooser process
    */
    finish();
}

将 onDestroy() 添加到您的家庭活动中:

public void onDestroy() {
    //Disable the activity again
    PackageManager p = getPackageManager();
    ComponentName cN = new ComponentName(c, RunDefaultLauncher.class);
    p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
}

如果您不想在显示选择器后禁用您的家庭活动,请不要调用p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

于 2018-04-25T08:24:24.567 回答