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から消す方法はないでしょうか…。
知っている方おしえてください…
apk
コード
http://code.google.com/p/tomorrowkey/source/browse/#svn/trunk/VisibleInLauncherApp
0 件のコメント:
コメントを投稿