【问题标题】:Setting multiple home launcher apps doesn't work设置多个家庭启动器应用程序不起作用
【发布时间】:2013-03-05 02:30:46
【问题描述】:

背景信息:我想创建一个儿童锁应用程序。因此,当用户在应用程序中时,我需要禁用所有键(包括 Home 键)。我基本上想要一个与this one类似的应用程序。

问题:如果我将另一个应用程序设置为默认主页启动器(即在 HTC 中的 Home Sense UI 或三星手机中的类似内容),然后将我的应用程序设置为默认主页启动器,然后按 Home 键将我带回主屏幕(即使我将我的应用程序设置为默认主启动器!)。现在,如果我没有将任何其他应用程序设置为默认主页启动器,只有我自己的应用程序,那么没有问题,当我在我的应用程序中并按 Home 键时,我会停留在应用程序中。

为什么当我在将我的应用程序设置为默认应用程序之前设置一个默认主页应用程序时,Home 键不起作用(即离开我的应用程序)?但是当我只将我的应用程序设置为默认值时,Home 键有效(即留在我的应用程序中)。

以下是我的测试应用程序的示例代码:

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.testspinner"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.testspinner.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

MainActivity.java:

public class MainActivity extends Activity {

    private PackageManager pm;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        this.pm = getPackageManager();
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public boolean isHomeActivity() {
        final IntentFilter filter = new IntentFilter(Intent.ACTION_MAIN);
        filter.addCategory(Intent.CATEGORY_HOME);

        List<IntentFilter> filters = new ArrayList<IntentFilter>();
        filters.add(filter);

        final String myPackageName = getPackageName();
        List<ComponentName> activities = new ArrayList<ComponentName>();
        final PackageManager packageManager = (PackageManager) getPackageManager();

        packageManager.getPreferredActivities(filters, activities, null);

        for (ComponentName activity : activities) {
            if (myPackageName.equals(activity.getPackageName())) {
                return true;
            }
        }
        return false;
    }

    protected void onResume() {
        super.onResume();
        if (!isHomeActivity()) {
            Intent localIntent = new Intent(Intent.ACTION_MAIN);
            localIntent.addCategory(Intent.CATEGORY_HOME);
            localIntent.setComponent(new ComponentName("android",
                    "com.android.internal.app.ResolverActivity"));
            startActivity(localIntent);
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
        case KeyEvent.KEYCODE_BACK: {
            finish();
        }
        }
        return false;
    }
}

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</RelativeLayout>

【问题讨论】:

    标签: android android-event android-launcher


    【解决方案1】:

    你可以在 Github 上查看这个项目:https://github.com/Neamar/Summon

    这是一个可以正常工作的替代主页应用程序。

    我看不出是什么造成了您所描述的行为。这可能是特定于设备的问题。

    您是否在设置应用后尝试重新启动?

    【讨论】:

    • 我实际上有 4 部手机供我测试:HTC Desire (Android 2.2)、HTC One S (Android 4)、三星 Galaxy S2 X 和三星 Galaxy S3。所有这些手机都有同样的问题。我知道,这个问题很奇怪,没有意义。我去看看 Github 上的项目。
    • 我查看了 Summon 应用程序,那个应用程序略有不同……它还有更多问题。如果在初始启动期间,我没有将其设置为主启动器,则将其设置为主启动器的提示永远不会在后续启动中弹出,因此您只有一次机会将其设置为默认启动器,之后您可以't.....
    【解决方案2】:

    如果您使用的是某些版本的 Android,您实际上必须清除已设置为默认的应用的默认值。我遇到了和你一样的问题。然后我在应用市场上查看了名为 Home Switcher for Froyo 的应用。在该应用程序中,如果设置了默认值,Home Switcher 会显示默认启动器的应用程序设置屏幕,并告诉用户选择“清除默认值”按钮。这是我知道的唯一方法。

    因此,在您的应用中,您必须检查一些不同的东西。

    1. 如果没有设置默认启动器,请设置你的(就像你上面说的那样它已经工作了)

    2. 如果设置了默认值,启动其应用设置,提示用户选择“清除默认值”,然后让他们按下主页按钮并选择您的应用

    我希望这会有所帮助,我不知道我是否是询问代码示例的最佳人选,因为我的应用程序仍然有点错误,但我可以为您指出一些堆栈溢出的答案:

    https://stackoverflow.com/a/4772481/1817139

    https://stackoverflow.com/a/10344985/1817139

    祝你好运,如果你遇到困难,请给我发电子邮件(lus u s_v [i] r at yahoo)- 忽略括号和空格

    【讨论】:

    • 感谢您的有用提示!虽然,我现在宁愿避免对我的应用程序执行此操作,但如果这是解决此问题的唯一方法,那么我将不得不这样做。我会再挖几天,如果我找到另一种解决方法,我一定会分享!
    猜你喜欢
    • 2018-08-01
    • 2013-10-29
    • 2012-10-21
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多