Запуск активности из ярлыка всегда запускает основную деятельность

Я создал приложение, которое меняет обои пользователей. Я хочу добавить ярлык Android, чтобы пользователь мог менять обои без необходимости полностью открывать приложение (основной вариант использования – привязать его к жесту в виде Nova Launcher, который позволяет вам выбирать ярлык для каждого жестов) ,

У меня все работает, с одной большой проблемой. Каждый раз, когда запускается ярлык, происходит мое собственное действие, но затем запускается основная активность запуска ТАКЖЕ! Это явно нежелательно, и я не могу понять, что происходит.

Вот код ShortcutActivity:

public class ShortcutActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final Intent intent = getIntent(); final String action = intent.getAction(); if (Intent.ACTION_CREATE_SHORTCUT.equals(action)) { setupShortcut(); finish(); return; } else { Toast.makeText(this, "Do something interesting.", Toast.LENGTH_SHORT).show(); finish(); } } void setupShortcut() { Intent shortcutIntent = new Intent("CHANGE"); shortcutIntent.setClass(this, getClass()); Intent intent = new Intent(); intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.shortcut_title)); intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); Parcelable iconResource = Intent.ShortcutIconResource.fromContext(this, R.drawable.ic_launcher); intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource); setResult(RESULT_OK, intent); } } 

Вот мой (упрощенный) манифест:

 <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/title_activity" android:theme="@style/AppTheme"> <activity android:name=".WallpaperSettings" android:label="@string/title_activity_wallpaper_settings"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".ShortcutActivity" android:theme="@android:style/Theme.NoDisplay" android:label="@string/shortcut_title"> <intent-filter> <action android:name="android.intent.action.CREATE_SHORTCUT" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> </application> 

Можно ли вообще обойтись без запуска основного запуска?

Это случилось и со мной. Однако я нашел рабочее решение. Просто добавьте android:launchMode="singleInstance" к активности, открывающейся из вашего ярлыка.

В этом случае:

 <activity android:name=".MainActivity2" android:label="@string/title_activity_main_activity2" > <intent-filter> <action android:name="android.intent.action.CREATE_SHORTCUT"/> <category android:name="android.intent.category.CUSTOM_TEST" /> </intent-filter> </activity> 

Я не могу найти объяснения этому, потому что can not действительно найти проблему root. Он просто работает

Источник: https://stackoverflow.com/a/23002294/1354096

Попробуйте сделать следующие изменения.

1) setupShortcut метод:

 private void setupShortcut() { Intent shortcutIntent = new Intent(getApplicationContext(), ShortcutActivity .class); shortcutIntent.setAction(Intent.ACTION_VIEW); Intent addIntent = new Intent(); addIntent .putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.shortcut_title)); addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(getApplicationContext(), R.drawable.ic_launcher)); addIntent .setAction("com.android.launcher.action.INSTALL_SHORTCUT"); getApplicationContext().sendBroadcast(addIntent); } 

2) в файле манифеста:

  <activity android:name=".ShortcutActivity" android:noHistory="true" android:excludeFromRecents="true" android:theme="@android:style/Theme.NoDisplay" android:label="@string/shortcut_title"> <intent-filter> <action android:name="android.intent.action.CREATE_SHORTCUT" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> 

Надеюсь, это будет полезно!

Поэтому я тестировал это с помощью nova launcher и, похоже, работает нормально.

AndroidManifest.xml

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.geronimo.testapplciation" > <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".MainActivity2" android:label="@string/title_activity_main_activity2" > <intent-filter> <action android:name="android.intent.action.CREATE_SHORTCUT"/> <category android:name="android.intent.category.CUSTOM_TEST" /> </intent-filter> </activity> </application> 

Вещи, которые я узнал – категория – это просто текст, который вы можете изменить по своему усмотрению

Я могу запустить MainActivity2 из ярлыка, созданного из Nova Launcher.

Если я запустил приложение из ящика приложений, откроется MainActivity1.

Возможная проблема: если вы открываете приложение из ярлыка и сворачиваете приложение, приложение возобновляет действие 2.

Точка, вы можете предпочесть свой механизм создания ярлыков, как и вы. И если это тот же подход / код, который вы используете. Еще раз.

Я собираюсь пойти немного «философски» здесь. Поэтому, когда вы создаете ярлык, то, что вы хотите сделать, это доступ к приложению с вашего домашнего экрана, а не из меню. Но то, что вы хотите, – это запуск другой активности, когда щелкнут этот «ярлык». Это означает, что вам нужен значок запуска для какой-либо другой активности. Как упоминалось здесь , это не имеет большого смысла. Вместо того, что вы ищете, это виджет, который открывает другую деятельность в соответствии с вашими потребностями и может быть размещен на экране. С этой целью на веб-сайте разработчика Android есть очень подробное объяснение.

EDIT : что касается вашей проблемы, я думаю, вы добавили бы аналогичный фильтр намерений для обоих видов деятельности, поэтому оба запускаются. Поскольку фильтры намерения показывают, что обе они являются действиями запуска.

Привет, RealRealCasually,

Я думаю, вам просто нужно удалить строку категории из вашего кода манифеста.

Просто удалите: <category android:name="android.intent.category.DEFAULT" /> из вашего кода манифеста.

Пожалуйста, проверьте принятый ответ здесь .

Надеюсь, это поможет вам. Пожалуйста, дайте мне знать, если это не решит вашу проблему.

Наслаждайтесь кодированием … 🙂

Intereting Posts
Несколько диалогов ОК / Отмена, как сказать, в onClick (), в каком диалоговом окне? Как нарисовать крупноформатный текст на холсте? Преобразование NV21 в RGB с использованием OpenCV в Android CSS: зависание /: фокус против события click on (мобильные) сенсорные устройства Разработка Android-игр – перемещение телефона Как «расширить» класс PreferenceActivity в Android с моим «базовым» классом? Купить музыкальный указ OnQueryTextChange запускается после возобновления приложения Отключить масштабирование фокуса ввода в веб-странице Android RecyclerView с индексом алфавита Maven отказывается загружать aar упакованную зависимость из удаленного репозитория Android dumpsys batteryinfo vs android dumpsys batterystats Как распространять и удаленно обновлять частное приложение Android на сотнях устройств, которые у вас есть? SlidingTabLayout цвет фона вкладки вкладки Почему так много GC_FOR_ALLOC в простом приложении?