Вызов функции startActivity () извне контекста активности

Я реализовал ListView в своем приложении для Android. Я привязываюсь к этому ArrayAdapter ListView используя специальный подclass classа ArrayAdapter . Внутри переопределенного ArrayAdapter.getView(...) я назначаю OnClickListener . В методе OnClickListener я хочу запустить новое действие. Я получаю исключение:

 Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want? 

Как получить Context , с которым работает ListView (текущая Activity )?

Или

  • кешировать объект Context через конструктор в вашем адаптере или
  • получить его с вашего взгляда.

Или, в крайнем случае,

  • добавьте флаг FLAG_ACTIVITY_NEW_TASK в свои намерения:

_

 myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

Изменить – я бы избегал установки флагов, поскольку это будет мешать нормальному streamу событий и стека истории.

Я решил это с помощью « addFlags » вместо «setFlags»

 myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

Согласно документации, она делает:

Добавьте дополнительные флаги в намерение (или с существующим значением флагов).

РЕДАКТИРОВАТЬ

Имейте в виду, если вы используете флаги, которые вы меняете в стеке истории, как говорит Алексей Воловой :

… избегать установки флагов, поскольку это будет мешать нормальному streamу событий и стека истории.

Вместо использования (getApplicationContext) используйте YourActivity.this

Если вы получили ошибку из-за использования create chooser, как показано ниже:

 Intent sharingIntent = new Intent(Intent.ACTION_VIEW); sharingIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); sharingIntent.setData(Uri.parse("http://google.com")); startActivity(Intent.createChooser(sharingIntent, "Open With")); 

Установите флаг для создания выбора:

 Intent sharingIntent = new Intent(Intent.ACTION_VIEW); sharingIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); sharingIntent.setData(Uri.parse("http://google.com")); Intent chooserIntent = Intent.createChooser(sharingIntent, "Open With"); chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(chooserIntent); 

Я думаю, что, возможно, вы внедряете OnClickListener в неподходящее место – обычно вам следует обязательно реализовать OnItemClickListener в своей деятельности и вместо этого установить его в ListView, иначе у вас появятся проблемы с вашими событиями …

Кроме того: если вы показываете ссылки в списке в fragmentе , не создавайте его так

  adapter = new ListAdapter(getActivity().getApplicationContext(),mStrings); 

вместо этого позвоните

  adapter = new ListAdapter(getActivity(),mStrings); 

адаптер работает отлично в обоих случаях, но ссылки работают только в последнем.

 CustomAdapter mAdapter = new CustomAdapter( getApplicationContext(), yourlist); 

или

 Context mContext = getAppliactionContext(); CustomAdapter mAdapter = new CustomAdapter( mContext, yourlist); 

изменить ниже

 CustomAdapter mAdapter = new CustomAdapter( this, yourlist); 

См., Если вы создаете намерение в списке в каком-то методе

 override onClick (View v). 

затем вызовите контекст через это представление:

 v.getContext () 

Там даже не нужны SetFlags …

Для любого, кто получает это на Xamarin.Android (MonoDroid), даже когда StartActivity вызывается из активности – это на самом деле ошибка Xamarin с новым временем выполнения ART, см. https://bugzilla.xamarin.com/show_bug.cgi?id=17630

На мой взгляд, лучше использовать метод startActivity() только в вашем коде Activity.class . Если вы используете это в Adapter или другом classе, это приведет к этому.

Эта ошибка возникает, когда startactivity не знает, что является его деятельностью. Таким образом, вы должны добавить активность до startActivity ()

вы должны установить

 activity.startActivity(yourIntent); 

Разрабатывая ответ Алексея Волового немного больше –

в случае, если u получает эту проблему с fragmentами, getActivity () отлично работает, чтобы получить контекст

В других случаях:

Если вы не хотите использовать –

 myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//not recommend 

затем создайте такую ​​функцию в OutsideClass –

 public void gettingContext(Context context){ real_context = context;//where real_context is a global variable of type Context } 

Теперь, в вашей основной деятельности, когда вы когда-либо создаете новый OutsideClass, вызовите описанный выше метод сразу же после того, как вы определите OutsideClass, указав контекст активности как аргумент. Кроме того, в вашем основном действии,

 public void startNewActivity(final String activity_to_start) { if(activity_to_start.equals("ACTIVITY_KEY")); //ACTIVITY_KEY-is a custom key,just to //differentiate different activities Intent i = new Intent(MainActivity.this, ActivityToStartName.class); activity_context.startActivity(i); }//you can make a if-else ladder or use switch-case 

теперь вернемся к вашему OutsideClass, и чтобы начать новую деятельность, сделайте что-то вроде этого –

 @Override public void onClick(View v) { ........ case R.id.any_button: MainActivity mainAct = (MainActivity) real_context; mainAct.startNewActivity("ACTIVITY_KEY"); break; } ........ } 

Таким образом, вы сможете запускать различные действия, называемые из другого OutsideClass, не испортив флаги.

Примечание. Не пытайтесь кэшировать объект контекста с помощью конструктора для fragmentа (с адаптером, его тонким). У fragmentа должен быть пустой конструктор, иначе в некоторых сценариях произойдет сбой приложения.

не забудьте позвонить

 OutsideClass.gettingContext(Context context); 

в функции onResume ().

У меня также была та же проблема. Проверьте весь контекст, который вы прошли. Для « ссылок » ему нужен контекст контекста работы, а не контекст приложения .

Это место, где вы должны проверить:

1.) Если вы использовали LayoutInflater, то проверьте, в каком контексте вы прошли.

2.) Если вы используете какой-либо адаптер, проверьте, в каком контексте вы прошли.

У меня такая же проблема. Проблема связана с контекстом. Если вы хотите открыть любые ссылки (например, поделитесь любой ссылкой с помощью выбора), перейдите в контекст активности, а не в контекст приложения.

Не забудьте добавить myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) если вы не в своей деятельности.

 Intent viewIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); viewIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(viewIntent); 

Я надеюсь, что это сработает.

Столкнувшись с той же проблемой,
intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
и решена проблема.

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

 Intent i= new Intent(context, NextActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); 

используйте этот код. отлично работает для меня; Поделитесь чем-нибудь из-за деятельности

  Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); // Append Text String Text = "Your Text Here" intent.putExtra(Intent.EXTRA_TEXT, Text); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Intent shareIntent = Intent.createChooser(intent,"Share . . . "); shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); G.context.getApplicationContext().startActivity(shareIntent); 

Если вы используете share Intent в плагине Кордовы, установка флажка не поможет. Вместо этого используйте это –

 cordova.getActivity().startActivity(Intent.createChooser(shareIntent, "title")); 

Моя ситуация была немного иной: я тестирую свое приложение с помощью Espresso и мне пришлось запустить свою Activity с ActivityTestRule из Context инструментария (который не является тем, что происходит от Activity ).

  fun intent(context: Context) = Intent(context, HomeActivity::class.java) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) 

Мне пришлось менять флаги и добавлять or побитовое ( | в Java) с Intent.FLAG_ACTIVITY_NEW_TASK

Таким образом, это приводит к:

  fun intent(context: Context) = Intent(context, HomeActivity::class.java) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK) 

Так как добавление флагов влияет на event_flow и stack_history, лучше передать «контекст приложения» для неактивности, из которого вам нужно вызвать class активности следующим образом:

«ActivityClassName.this» (Хотя вы передаете контекст таким образом, он будет содержать все детали и информацию, которые вам нужно вызвать Activity из сценария без активности)

Поэтому нет необходимости устанавливать или добавлять флаги, это будет нормально работать в каждом случае.

  • Ошибки, управляющие жизненным циклом UnityPlayer в приложении для собственных приложений Android
  • Как вернуть результат (startActivityForResult) из TabHost Activity?
  • Android: захват возврата активности
  • Попытка UNINSTALL_SHORTCUT, но ярлык не исчезнет
  • преобразование активности в fragment
  • ViewPager wrap_content не работает
  • Android: как заставить активность возвращать результаты деятельности, которая его вызывает?
  • Доступ к SharedPreferences с помощью статических методов
  • Передача данных не-примитивного типа между действиями в android
  • Уведомление: активность уже открыта
  • Как показать активность до того, как мое приложение будет удалено (Android)
  • Interesting Posts

    Импорт проекта maven в eclipse

    Выбор элементов с определенным цветом фона

    Как десериализировать подclass в Firebase, используя getValue (Subclass.class)

    getline не просит ввода?

    Как отключить подкачку, прокручивая пальцем в ViewPager, но все же сможете прокручивать программно?

    Безопасно ли использовать «Универсальный адаптер для ноутбуков»?

    Почему / когда вы должны использовать вложенные classы в .net? Или не так ли?

    Что делает `: _ *` (символ подчеркивания двоеточия) в Scala?

    ASP.net MVC – привязка модели исключает поля classов?

    Ubuntu: AMD64 против i386?

    Как освободить память «полностью спящий» процесс?

    Измените, как Explorer сортирует файлы с номером в имени

    Как написать сценарий autohotkey для переключения настроек Показать скрытые файлы и папки?

    MongoDB atomic «findOrCreate»: findOne, вставить, если не существует, но не обновлять

    Как отключить создание .Spotlight-V100 и .Trash папок на внешнем диске?

    Давайте будем гением компьютера.