12

我将我的活动设置为默认启动器来拦截主页按钮的点击,如下所示:

<activity
    android:name=".ExampleActivity"
    android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <category android:name="android.intent.category.HOME" />        
        <category android:name="android.intent.category.DEFAULT" />               
    </intent-filter>
</activity>

当我的活动ExampleActivity启动时,如果我单击该home键,则会提示我进行选择。如果我选择将此作为默认设置并选择我的活动,我会根据需要卡在我的活动中。

问题是,当我离开活动时,我尝试从默认启动器中删除我的活动,但没有成功。

我试过了:

ComponentName componentName = new ComponentName( 
                    "com.example.exampleactivity", 
                    "com.example.exampleactivity.class");

pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, PackageManager.DONT_KILL_APP);

和:

PackageManager pm = getActivity().getPackageManager();
             ComponentName name = new ComponentName(this, "com.example.exampleactivity.class");
             pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);

但我对 的指定home从未被删除。

有没有人有解决上述问题的工作方法?

我只希望主页按钮不是特定活动的默认设置,而不是我的整个应用程序。当我离开活动时,它应该被删除并恢复为默认值。

4

4 回答 4

17

如果您正在清除其默认值是您的应用程序,您可以简单地调用:

getPackageManager().clearPackagePreferredActivities(getPackageName());

然后,为了显示选择使用哪个启动器的对话框,请使用:

final Intent intent=new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
于 2012-12-22T23:16:11.433 回答
2

这个解决方案是一个聪明的方法: 清除和设置默认家庭应用程序

onResume() 中的代码基本上是这样的:

    ComponentName componentName = new ComponentName(MyActivity.this, FakeHome.class);
    if (!isMyLauncherDefault()) {
        Log.e(TAG, "MyActivity is not default home activity!");

        // toggle fake activity
        PackageManager pm = getPackageManager();
        int flag = ((pm.getComponentEnabledSetting(componentName) == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) ? PackageManager.COMPONENT_ENABLED_STATE_DISABLED
                : PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
        pm.setComponentEnabledSetting(componentName, flag, PackageManager.DONT_KILL_APP);

        // start home activity to enable chooser
        Intent selector = new Intent(Intent.ACTION_MAIN);
        selector.addCategory(Intent.CATEGORY_HOME);
        startActivity(selector);
    }

并且方法 isMyLauncherDefault() 取自这里: 如何检查我的应用程序是否是默认启动器

于 2013-02-16T12:50:44.723 回答
1

您不能覆盖 home 键的行为以适应您的应用程序;这是 Google 的设计决定,以确保用户始终可以返回到静态位置。可能有一些方法可以解决这个问题(如果它们仍然存在),但它们是应用程序不应该依赖的意外错误。

简短的回答:您可以拥有除 home 键之外的任何键。

于 2012-09-26T03:40:14.560 回答
1

看一下android.permission.SET_PREFERRED_APPLICATIONS权限。还有这个方法http://developer.android.com/reference/android/content/pm/PackageManager.html#clearPackagePreferredActivities(java.lang.String)

于 2012-09-26T03:56:00.180 回答