Я хочу открыть свое приложение, нажав на виджет приложения. Так.
remote_views.setOnClickPendingIntent( R.id.layout, PendingIntent.getActivity( context, 0, new Intent( context, Main.class ).setFlags( Intent.FLAG_ACTIVITY_NEW_TASK ), PendingIntent.FLAG_IMMUTABLE ) );
Но я хочу открыть существующее приложение и сохранить стек. Если я уберу Intent.FLAG_ACTIVITY_NEW_TASK, то на новом Android я получу:
java.lang.RuntimeException: вызвано: android.util.AndroidRuntimeException: вызов startActivity() из вне контекста Activity требуется FLAG_ACTIVITY_NEW_TASK флаг.
Я могу установить в файле манифеста
<activity
android:name = ".Main"
android:launchMode = "singleInstance"
android:exported = "true"
>
и откройте существующую активность, но, кроме того, потеряли задний стек, затем нажмите кнопку «Домой» и снова запустите приложение с помощью значка, после чего задний стек также будет потерян.
Итак, возможно ли это?
Я не уверен, что это правильный путь, но он работает.
Установите в файле манифеста для основного действия android:launchMode = "singleTop".
В основной деятельности в методе ocCreate():
if ( !isTaskRoot() ){
finish();
}
Поэтому, если система откроет новую основную активность, нажав на виджет (taskId будет таким же) и поместит ее в верхнюю часть заднего стека, то просто завершите ее.
Воспользуйтесь запуском Intent. Это просто выведет существующую задачу на передний план в любом состоянии, в котором она была. Если она еще не запущена, она запустится так же, как если бы пользователь коснулся значка приложения на ГЛАВНОМ экране:
remote_views.setOnClickPendingIntent( R.id.layout,
PendingIntent.getActivity(
context, 0,
context.getPackageManager().getLaunchIntentForPackage("my.package.name"),
PendingIntent.FLAG_IMMUTABLE ) );
Вам не нужен какой-либо специальный режим запуска в манифесте для вашего MainActivity.
Пожалуйста, измените на context.getPackageManager()
Это работает, но это хак. Смотрите мой ответ.