构建 Android 自定义启动器
Build a Android custom launcher
我正在为儿童模式应用构建自定义启动器。我已经关注了这个
创建一个启动器选择器,让用户选择我的应用作为他们的默认启动器。
问题是如果他们的设备中有默认启动器,上面 link 中的代码将不起作用。我正在测试 Zenphone5,Android 4.4.2。我看到有些人在 Android 4.4.2.
上创建启动器选择器时遇到同样的问题
我到处搜索如何创建像这样的启动器选择器:Nester, iWawa。他们怎么做到的?
Android清单:
<?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);
}
编辑
完整的故事是:"I open my app, and click a button to go to my launcher -> nothing happens (because another launcher is set as default). If I open that launcher setting (Setting -> Apps -> ..) and click "清除默认值”,然后再次打开我的应用程序,单击按钮转到我的启动器 -> 对话框将出现。从现在开始,代码运行良好”。我不想打开设置点击 "Clear Defalt"
您需要在 Androidmanifest.xml 文件的 Intent-filter 中提供 "<category android:name="android.intent.category.HOME" />"
。
请参阅下文link。
http://arnab.ch/blog/2013/08/how-to-write-custom-launcher-app-in-android/
如果你有和我一样的问题,这里是我找了两个月的答案。希望对大家有帮助。
如果这个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
我正在为儿童模式应用构建自定义启动器。我已经关注了这个
问题是如果他们的设备中有默认启动器,上面 link 中的代码将不起作用。我正在测试 Zenphone5,Android 4.4.2。我看到有些人在 Android 4.4.2.
上创建启动器选择器时遇到同样的问题我到处搜索如何创建像这样的启动器选择器:Nester, iWawa。他们怎么做到的?
Android清单:
<?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);
}
编辑
完整的故事是:"I open my app, and click a button to go to my launcher -> nothing happens (because another launcher is set as default). If I open that launcher setting (Setting -> Apps -> ..) and click "清除默认值”,然后再次打开我的应用程序,单击按钮转到我的启动器 -> 对话框将出现。从现在开始,代码运行良好”。我不想打开设置点击 "Clear Defalt"
您需要在 Androidmanifest.xml 文件的 Intent-filter 中提供 "<category android:name="android.intent.category.HOME" />"
。
请参阅下文link。 http://arnab.ch/blog/2013/08/how-to-write-custom-launcher-app-in-android/
如果你有和我一样的问题,这里是我找了两个月的答案。希望对大家有帮助。
如果这个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