Вызов функции 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 из сценария без активности)

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

  • Связь между деятельностью и службой
  • В чем разница между Activity и Context?
  • Начать работу в Android
  • Текст Android-центра на canvasе
  • Android: Как я могу получить текущую активность переднего плана (из службы)?
  • Начать работу внутри onReceive BroadcastReceiver
  • Сделать новый вид активности за старым во время перехода
  • android.content.ActivityNotFoundException:
  • Как вы используете Intent.FLAG_ACTIVITY_CLEAR_TOP, чтобы очистить стек активности?
  • Как отключить изменение ориентации на Android?
  • Где / Как getIntent (). GetExtras () в Android Fragment?
  • Interesting Posts

    Как вы можете прочитать CSV-файл в R с различным количеством столбцов

    Как получить доступ к методам формы и элементам управления из classа в C #?

    Как редактировать файл хостов в Windows 7

    Entity Framework 4 CTP 4 / CTP 5 Общий шаблон хранилища и единица тестирования

    Как изменить функцию кнопки воспроизведения на клавиатуре?

    Доступ к списку файлов через скрипт в InnoSetup

    Почему существует несколько экземпляров Chrome, хотя у меня есть только одно окно (только одна вкладка)?

    Java: multidimensional array против одномерного

    Локарифмическая привязка этикеток / тиков

    В чем разница между источником данных и делегатом?

    Как установить прокси-сервер, который будет использоваться JVM

    Не удается получить доступ к веб-страницам из веб-браузера?

    C “: функция возвращает адрес локальной переменной”

    Что такое вкладка «Альтернативная конфигурация» в настройках TCP / IP

    FFmpeg RTSP отправляет аудиопоток в Wowza

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