【问题标题】:Build a Android custom launcher构建一个 Android 自定义启动器
【发布时间】:2017-07-07 07:10:57
【问题描述】:

我正在为儿童模式应用构建自定义启动器。我已经关注了这个 link 创建一个启动器选择器,让用户选择我的应用作为他们的默认启动器。

问题是如果他们的设备中有默认启动器,则上面链接中的代码不起作用。我正在 Zenphone5,Android 4.4.2 上进行测试。我看到有些人在 Android 4.4.2 上创建启动器选择器时遇到同样的问题。

我到处搜索如何创建这样的启动器选择器:NesteriWawa。他们怎么能这样做?

AndroidManifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ttb.com.kidmode">

<!-- Hide status bar -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

<!-- Hide the recent apps -->
<uses-permission android:name="android.permission.REORDER_TASKS" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.Holo.Light">
    <activity android:name=".activity.MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".activity.KidModeActivity"
        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>
</application>

创建启动器选择器对话框:

if (isMyLauncherDefault() == false) { // enable fake home to force system to clear default

    Log.v(">>>", "false");
    ComponentName launcherActivity = new ComponentName(this, KidModeActivity.class);
    getPackageManager().setComponentEnabledSetting(launcherActivity,
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
    goHome();

} else {
    // Go home
    goHome();
}

按下主页按钮:

private void goHome() {
    Intent startMain = new Intent(Intent.ACTION_MAIN);
    startMain.addCategory(Intent.CATEGORY_HOME);
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(startMain);
}

编辑

完整的故事是:“我打开我的应用程序,然后单击一个按钮转到我的启动器 -> 没有任何反应(因为默认设置了另一个启动器)。如果我打开该启动器设置(设置 -> 应用程序 -> ..) 并单击“清除默认值”,然后再次打开我的应用程序,单击按钮转到我的启动器-> 将显示对话框。从现在开始,代码运行良好”。我不想打开设置点击“清除默认值”

【问题讨论】:

  • 发布您的代码和清单,您可能缺少一些东西
  • 嗨@njzk2 刚刚添加了代码。请检查一下
  • 那么当goHome 被调用时会发生什么?
  • 如果用户选择了我的启动器作为默认启动器,goHome 会将用户带到我的自定义启动器@njzk2。这意味着按下主页按钮
  • OK 完整的故事是:“我打开我的应用程序,然后单击一个按钮转到我的启动器 -> 没有任何反应(因为另一个启动器设置为默认设置)。如果我打开该启动器设置(设置 -> 应用程序 -> ..) 并单击“清除默认值”,然后再次打开我的应用程序,单击按钮转到我的启动器 -> 将显示对话框”。我不想打开设置以单击“清除默认值”。 @njzk2

标签: java android android-launcher


【解决方案1】:

您需要在 Androidmanifest.xml 文件的 Intent-filter 中提供"&lt;category android:name="android.intent.category.HOME" /&gt;"

请参考以下链接。 http://arnab.ch/blog/2013/08/how-to-write-custom-launcher-app-in-android/

【讨论】:

  • 你的意思是 吗?我有这些线。如果我打开我的默认启动器设置并清除默认值。然后再次运行,将显示启动器选择器对话框。
  • 已将类别添加为 HOME?
  • ".activity.KidModeActivity" 是我的自定义启动器@shripal
  • OK 完整的故事是:“我打开我的应用程序,然后单击一个按钮转到我的启动器 -> 没有任何反应(因为另一个启动器设置为默认设置)。如果我打开该启动器设置(设置 -> 应用程序 -> ..) 并单击“清除默认值”,然后再次打开我的应用程序,单击按钮转到我的启动器 -> 将显示对话框”。我不想打开设置以单击“清除默认值”。 @shripal
【解决方案2】:

如果你和我有同样的问题,这里是我找了两个月的答案。希望对某人有所帮助。

如果这个link 不起作用。

解决方案如下:使用 activity-alias

AndroidManifest.xml

<activity
        android:name=".activity.KidModeActivity"
        android:exported="true"
        android:launchMode="singleTask">
    </activity>
    <activity-alias
        android:name="LauncherAlias1"
        android:label="Kids Mode Launcher"
        android:targetActivity=".activity.KidModeActivity" >
        <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-alias>

    <activity-alias
        android:name="LauncherAlias2"
        android:enabled="false"
        android:targetActivity=".activity.KidModeActivity" >
        <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-alias>

在某处创建启动器选择器:

    public static void createLauncherPicker(Context context) {
    Log.v(">>>", "create launcher picker");
    PackageManager pm = context.getPackageManager();
    ComponentName cn1 = new ComponentName(GlobalValue.APP_NAME, GlobalValue.LAUNCHER_ALIAS_1); // Ex: "com.kidmod.android", "com.kidmod.android.LauncherAlias1"
    ComponentName cn2 = new ComponentName(GlobalValue.APP_NAME, GlobalValue.LAUNCHER_ALIAS_2);
    int dis = PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
    if(pm.getComponentEnabledSetting(cn1) == dis) dis = 3 - dis;
    pm.setComponentEnabledSetting(cn1, dis, PackageManager.DONT_KILL_APP);
    pm.setComponentEnabledSetting(cn2, 3 - dis, PackageManager.DONT_KILL_APP);
}

感谢这个伟大的回答:link

【讨论】:

    猜你喜欢
    • 2011-10-29
    • 1970-01-01
    • 2017-01-18
    • 2018-01-01
    • 1970-01-01
    • 2014-02-27
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多