2016-12-04 7 views
3

Работая с различными действиями и запуская их для достижения результатов, у меня нет выбора, кроме как использовать намерение. Теперь умысел требует контекста, и это не имеет никакого смысла для меня. Я знаю, что контекст позволяет получить доступ к ресурсам приложения, но почему вы должны знать о ресурсах приложений, когда намерение - просто простой мессенджер?Почему цель требует контекста?

Кроме того, я не совсем уверен, почему некоторые люди создают намерение с помощью getApplicationContext(), а другие используют это для контекста активности ????

Наконец, я не уверен, как действие, которое вызывает startActivityResult(), получает вызов по методу onActivityResult(), когда я не передаю «это» для контекста, а вместо контекста приложения. Я думал, что вам нужно использовать «это» или передать текущий контекст активности, который вызвал startActivityResult(), чтобы получить обратный вызов. Это прямо прямо в java? Если вы пройдете в классе, тогда другой класс активности будет иметь ссылку на ваш класс и, следовательно, позволит ему вызвать метод в вашем классе, который равен onActivityForResult(). Однако это не так, и что мне не хватает?

ответ

4

Intent сам по себе не нужен Context. Конструктор Intent#Intent(Context, Class) - это просто конструктор удобства, который внутренне использует предоставленные аргументы для получения ComponentName. ComponentName - это, в свою очередь, просто имя пакета вашего приложения и имя класса для цели. Так ComponentName может быть что-то вроде:

com.foo.bar/com.foo.bar.ui.activity.MyActivity 

Однако, вы также можете просто использовать пустой конструктор Intent#Intent() и предоставить ComponentName самостоятельно (Intent#setComponentName(ComponentName)).

Поэтому не имеет значения, предоставили ли вы контекст вашего приложения или вашей деятельности (последний проще всего ввести). Также имейте в виду, что классы, требующие контекста приложения, могут сами звонить Context#getApplicationContext, поэтому вам не о чем беспокоиться.

О startActivityForResult() - Android управляет внутренней записью ваших записей активности. Поэтому он возвращает результат предыдущей операции в стеке. Точно так же он знает, куда вернуться, когда вы нажимаете «назад».

Обратите внимание, что это не означает, что он хранит стек ваших экземпляров Activity. Эти случаи могут быть давно ушли - уничтожены и собраны мусор, чтобы освободить память. Однако стек содержит информацию, которая позволяет воссоздать их и восстановить их состояние.

+0

Привет, ваш ответ очень ясный и лаконичный. Тем не менее, я просто хочу быстро уточнить. Итак, всякий раз, когда я запускаю действие, активность, вызывающая startActivity(), будет правильно регистрироваться в стеке? Итак, как андроид знает, чтобы ссылаться на эту активность и регистрировать ее в стек, если я специально не передаю эту активность. – Wowzer

+0

Система знает, какая активность находится в верхней части стека (ваша активность). И когда вы начинаете новый, он использует имя компонента для его идентификации. Даже если вы используете неявное намерение (одно с действием вместо явного имени цели), оно в конечном итоге разрешено для определенного имени компонента. –

0

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

В соответствии с этим pageActivity inherits context. Таким образом, если вы находитесь в действии, вам нужно только перейти к использованию контекста. Он также содержит указатель на getBaseContext(). Иногда вам может потребоваться ссылка на него, если вам нужен весь контекст приложения, но, скорее всего, вы не захотите на какое-то время.

Существуют способы создания намерения, не требующего контекста. Но если вы хотите настроить таргетинг на определенный класс определенного пакета, то предоставление контекста для целевого пакета - это готовый способ сделать это. См. Это Context Lesson.

Как поясняется snctin в его answergetApplicationContext() offers application context. В основном контекст приложения связан с Приложением и всегда будет одинаковым на протяжении всего жизненного цикла вашего приложения. Также см. this post.

См. Android - How to start (display) a new Activity. В соответствии с этим

startActivity(new Intent(this, ProjectsActivity.class));

предполагает текущий класс расширяет один из классов Android активность, которая дает вам доступ к методу startActivity.

Согласно Getting result from a activity, запуск другого мероприятия не обязательно должен осуществляться в одну сторону. Вы также можете начать другое действие и получить результат. Чтобы получить результат, вызовите startActivityForResult() (вместо startActivity()).

Например, ваше приложение может запустить приложение для камеры и получить полученную фотографию в результате. Или вы можете запустить приложение «Люди», чтобы пользователь мог выбрать контакт, и в результате вы получите данные о контакте. Это post поможет вам понять тот же самый лучший способ.

Надеюсь, что помогает. А также спасибо за то, что у вас был вопрос с обновлением с Android. :)

0

Intent не нужен Context для себя, но, как вы сами указали, что Intent - это всего лишь посланник. Он также передает текущее состояние приложения/объекта на вновь созданный объект, чтобы он мог понять, что именно происходит в приложении. И поэтому нам нужно передать контекст.

И, я считаю, вы хотите спросить о startActivityForResult(). Сам Android заботится о обратном вызове так же, как обрабатываются другие обратные вызовы. Вы можете взять пример жизненного цикла активности. Всякий раз, когда он запускается, onCreate(), onStart(), onResume() называют себя Android.

+0

Я не думаю, что контекст используется для понимания того, что происходит в приложении, потому что когда вы запускаете новое действие, андроид будет просто предоставлять контекст по умолчанию для этого нового действия, потому что все действия наследуются из одного и того же контекста приложения что эта активность входит в приложение – Wowzer

+0

Android не будет предоставлять контекст приложения для нового действия. Существует разница b/w с использованием getAplicationContext() и использование этого. Android предоставит контекст в зависимости от того, что вы заявите ему. См. Вопрос № 1026973 – hittsss

Смежные вопросы