Как использовать PackageManager.addPreferredActivity ()?

В SDK 1.5 я использовал класс PackageManager, чтобы выбрать предпочтительный домашний экран для моего приложения, используя PackageManager.addPackageToPreferred (). В новом SDK (с использованием 2.1) это устарело, поэтому я пытаюсь использовать addPreferredActivity () для того же результата, но он работает не так, как ожидалось.

Некоторый необходимый фон. Я пишу приложение для замены экрана блокировки, поэтому я хочу, чтобы домашний ключ запускал мое приложение (которое уже будет запущено, что приведет к отключению ключа). Когда пользователь «разблокирует» экран, я намереваюсь восстановить отображение, так что все работает нормально.

В моем AndroidManifest.xml у меня есть:

<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.HOME"/> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS"> </uses-permission> 

В моем коде у меня есть следующий фрагмент:

 // Set as home activity // This is done so we can appear to disable the Home key. PackageManager pm = getPackageManager(); //pm.addPackageToPreferred(getPackageName()); IntentFilter filter = new IntentFilter("android.intent.action.MAIN"); filter.addCategory("android.intent.category.HOME"); filter.addCategory("android.intent.category.DEFAULT"); ComponentName[] components = new ComponentName[] { new ComponentName("com.android.launcher", ".Launcher") }; Context context = getApplicationContext(); ComponentName component = new ComponentName(context.getPackageName(), MyApp.class.getName()); pm.clearPackagePreferredActivities("com.android.launcher"); pm.addPreferredActivity(filter, IntentFilter.MATCH_CATEGORY_EMPTY, components, component); 

В результате поведение при выборе приложения происходит, когда я нажимаю клавишу «Домой», что указывает на то, что работает вызов clearPackagePreferredActivities (), но мое приложение не добавилось как предпочтительное. Кроме того, первая строка в журнале ниже говорит о «отбрасывании предпочтительной активности для Intent»:

04-06 02: 34: 42.379: INFO / PackageManager (1017): набор результатов изменен, сброс предпочтительной активности для Intent {act = android.intent.action.MAIN cat = [android.intent.category.HOME] flg = 0x10200000} Тип null

04-06 02: 34: 42.379: INFO / ActivityManager (1017): Начальная активность: Intent {act = android.intent.action.MAIN cat = [android.intent.category.HOME] flg = 0x10200000 cmp = android / com. Android.internal.app.ResolverActivity}

Кто-нибудь знает, что означает это первое сообщение журнала? Может быть, я не использую API правильно, любые идеи? Любая помощь будет принята с благодарностью.

Solutions Collecting From Web of "Как использовать PackageManager.addPreferredActivity ()?"

@afonseca: Я имел дело с той же проблемой. Спасибо за код, я использовал его для начала. Также благодарит Шимона. Я объединил свой ответ в свою. У меня работает код (на 1.6 и 2.1 update 1). Он немного скорректирован, но 2 основные изменения, по-видимому, являются предложением Shimons и: «.Launcher» был изменен на «com.android.launcher.Launcher». Рабочий код размещен ниже.

Ciao, a2ronus

 PackageManager pm = getPackageManager(); IntentFilter filter = new IntentFilter(); filter.addAction("android.intent.action.MAIN"); filter.addCategory("android.intent.category.HOME"); filter.addCategory("android.intent.category.DEFAULT"); Context context = getApplicationContext(); ComponentName component = new ComponentName(context.getPackageName(), TestReplaceHomeAppActivity.class.getName()); ComponentName[] components = new ComponentName[] {new ComponentName("com.android.launcher", "com.android.launcher.Launcher"), component}; pm.clearPackagePreferredActivities("com.android.launcher"); pm.addPreferredActivity(filter, IntentFilter.MATCH_CATEGORY_EMPTY, components, component); 

Этот ответ может немного clearPackagePreferredActivities но API-документы API для clearPackagePreferredActivities :

Приложение может только очистить свой собственный пакет (ы).

Итак, я думаю, что в «восстановлении отображения» единственное, что вы можете сделать, это что-то вроде:

 getPackageManager().clearPackagePreferredActivities(getPackageName()); 

И очистка настройки по умолчанию для экрана HOME.

Кажется, это работает для меня, если я инициализирую массив components для ALL HOME приложений ALL HOME на устройстве:

 ComponentName[] components = new ComponentName[] { new ComponentName("com.intuitiveui.android", "com.intuitiveui.android.Friday"), new ComponentName("com.android.launcher2","com.android.launcher2.Launcher") }; 

Моя проблема заключается в том, как я могу заполнить это динамически.

AddPreferredActivity больше не работает в 2.2, clearPackagePreferredActivities все еще работает, но вы можете только очистить предпочтение для пакета, в котором вы его запускаете.

Есть много потоков в андроидах google groups об этой проблеме и официальной позиции google (на данный момент), чтобы не предоставлять вам методы для переопределения пользовательских настроек.