Launcherからアプリを消したい

だれか助けてください

今書いているアプリでどうしても必要な機能なのですが、どうにも上手くうごきません…、だれか助けてください…

Launcherから消し去りたい

アプリのLauncher表示の切り替えをしたくてPackageManager#setComponentEnabledSettingを使い切り替えるコードを書きました。
PackageManager#setComponentEnabledSettingについてはこちら

Taosoftware: Android Intent呼び出しを自分でコントロール方法
http://www.taosoftware.co.jp/blog/2010/04/android_intent.html

taosoftwareさんではACTION_VIEW/CATEGORY_BROWSABLEのActivityの切り替えをしていますが、ACTION_MAIN/CATEGORY_LAUNCHERのActivityの切り替えをしたらLauncherからの非表示ができるのではないかと考えたわけです。

検証用のコードはこちら

SettingActivity
import android.content.ComponentName;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;

public class SettingActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.setting);

    int state = getPackageManager().getComponentEnabledSetting(new ComponentName(this, SettingActivity.class));
    if (state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
      PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("visible_in_launcher_1", true);
    } else {
      PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("visible_in_launcher_1", false);
    }

    state = getPackageManager().getComponentEnabledSetting(new ComponentName(this, SettingActivity.class));
    if (state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
      PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("visible_in_launcher_2", true);
    } else {
      PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("visible_in_launcher_2", false);
    }
  }

  @Override
  protected void onResume() {
    super.onResume();
    PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this);
  }

  @Override
  protected void onPause() {
    super.onPause();
    PreferenceManager.getDefaultSharedPreferences(this).unregisterOnSharedPreferenceChangeListener(this);
  }

  @Override
  public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    int newState;
    if (sharedPreferences.getBoolean(key, true)) {
      newState = PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
    } else {
      newState = PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
    }
    String packageName = getPackageName();
    ComponentName componentName;
    if (key.equals("visible_in_launcher_1")) {
      componentName = new ComponentName(packageName, packageName + ".SettingActivity");
    } else {
      componentName = new ComponentName(packageName, packageName + ".SettingActivityAlias");
    }
    PackageManager packageManager = getPackageManager();
    packageManager.setComponentEnabledSetting(componentName, newState, PackageManager.DONT_KILL_APP);
  }
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest
  xmlns:android="http://schemas.android.com/apk/res/android"
  package="jp.tomorrowkey.android.visibleinlauncherapp"
  android:versionCode="1"
  android:versionName="1.0">
  <application
    android:icon="@drawable/icon"
    android:label="@string/app_name">
    <activity
      android:name=".SettingActivity"
      android:label="App1"
      android:enabled="true">
      <intent-filter>
        <action
          android:name="android.intent.action.MAIN" />
        <category
          android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <activity-alias
      android:name=".SettingActivityAlias"
      android:targetActivity=".SettingActivity"
      android:label="App2"
      android:enabled="true">
      <intent-filter>
        <action
          android:name="android.intent.action.MAIN" />
        <category
          android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity-alias>
    <receiver
      android:name=".PackageChangedReceiver">
      <intent-filter>
        <action
          android:name="android.intent.action.PACKAGE_CHANGED" />
        <data
          android:scheme="package" />
      </intent-filter>
    </receiver>
  </application>
  <uses-sdk
    android:minSdkVersion="3" />
</manifest> 

ちょっとわけあってsetComponentEnabledSettingでenableを切り替えるActivityを2つにしています。
また、setComponentEnabledSettingを使って変更をするとPACKAGE_CHANGEDがブロードキャストされるので、ブロードキャストされたことを分かりやすく見せるためにToastを表示するようにしています。

package jp.tomorrowkey.android.visibleinlauncherapp;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class PackageChangedReceiver extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {
    Toast.makeText(context, "receive package changed", Toast.LENGTH_SHORT).show();
  }
}

動かない…

まず、Launcherの状態がこちら

アプリを起動するとこんな画面が表示されます。

1のチェックボックスを外すと

PACKAGE_CHANGEDが受信され

LauncherからApp1のリンクが消えます。

思ったように動きます。

ここからが問題です。
この状態でApp2のチェックボックスを外すと…

PACKAGE_CHANGEDが受信され

Launcherから消えない…

なぜか消えません…
ちなみに起動しようとしてみると

「アプリがインストールされてません」って言われます…
どうも、最後の1つは消えてくれないようです。

検証Homeアプリ
  • GalaxyS純正Launcher
    • 消えない
  • HT-03A純正Launcher
    • 消えない
  • ADWLauncher
    • 消えない
  • Xperia(1.6)純正Launcher
    • 消える
  • Xperia mini pro(1.6)純正Launcher
    • 1つも消えない

たすけてください

どうにかしてLauncherから消す方法はないでしょうか…。
知っている方おしえてください…