Вызов функции 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
)?
- преобразование активности в fragment
- Как вы используете Intent.FLAG_ACTIVITY_CLEAR_TOP, чтобы очистить стек активности?
- Android - обнаружение запуска приложения из дома или истории
- ViewPager wrap_content не работает
- Запуск Skype из программы Programmatically & Pass Number - Android
- Как передать данные от 2-го действия до 1-го действия при нажатии? - Андроид
- Где / Как getIntent (). GetExtras () в Android Fragment?
- Android: как заставить активность возвращать результаты деятельности, которая его вызывает?
- Как предотвратить удаление приложения?
- Как выйти из приложения Android с помощью кода?
- Как показать активность до того, как мое приложение будет удалено (Android)
- Что означает @hide в исходном коде Android?
- Изменение ориентации на Android вызывает onCreate
Или
- кешировать объект 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 из сценария без активности)
Поэтому нет необходимости устанавливать или добавлять флаги, это будет нормально работать в каждом случае.