Как я использую PackageManager.addPreferredActivity ()?

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

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

В моем 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);

Получающееся поведение состоит в том, что селектор приложения подходит, когда я нажимаю клавишу Home, которая указывает, что clearPackagePreferredActivities () вызов работал, но мое приложение не стало добавленным как предпочтительное. Кроме того, первая строка в журнале ниже говорит что-то об "отбрасывании предпочтительного действия для Намерения":

04-06 2:34:42.379: INFO/PackageManager (1017): Набор результатов измененное, отбрасывающее предпочтительное действие для Намерения {act=android.intent.action. ОСНОВНАЯ кошка = [android.intent.category. ДОМОЙ] flg=0x10200000} вводят пустой указатель

04-06 2:34:42.379: INFO/ActivityManager (1017): Стартовое действие: Намерение {act=android.intent.action. ОСНОВНАЯ кошка = [android.intent.category. ДОМОЙ] flg=0x10200000 cmp=android/com.android.internal.app. ResolverActivity}

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

19
задан afonseca 6 April 2010 в 10:09
поделиться

2 ответа

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

Чао, а2ронус

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);
11
ответ дан 30 November 2019 в 04:58
поделиться

Похоже, это сработает для меня, если я инициализирую массив компонентов на ВСЕ ГЛАВНАЯ приложения на устройстве:

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

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

2
ответ дан 30 November 2019 в 04:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: