Android использует имя компонента для запуска действия - PullRequest
4 голосов
/ 20 февраля 2012

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

Но при использовании componentName для запуска действия с использованием

public Intent setComponent (ComponentName component)

и этот конструктор для ComponentName

ComponentName(String pkg, String cls)

Вы видите выше, я могу запустить действие БЕЗ, используя любой аргумент Context

Но он должен каким-то образом использовать некоторый "контекст", я прав? Если да, то в каком контексте? Приложение одно или занятие одно? Означает ли это, что каждый раз, когда я использую эти два метода (см. Выше), мне не нужно беспокоиться об утечке памяти, потому что я не передаю контекст вокруг

Спасибо

Ответы [ 4 ]

5 голосов
/ 20 февраля 2012

Ответ Адама правильный (он добрался до того, как я смог опубликовать).

Просто, чтобы расширить его, это источник для Intent(Context packageContext, Class<?> cls) конструктора ...

public Intent(Context packageContext, Class<?> cls) {
    mComponent = new ComponentName(packageContext, cls);
}

... и это источник для ComponentName(Context pkg, Class<?> cls) конструктора

public ComponentName(Context pkg, Class<?> cls) {
    mPackage = pkg.getPackageName();
    mClass = cls.getName();
}

Как следует из adamp, Intent методы, которые принимают Context, являются вспомогательными методами, которые используют его только для создания ComponentName который в свою очередь имеет дело только с String типами (mPackage и mClass).Ни Intent, ни ComponentName не содержат ссылки на Context.

4 голосов
/ 20 февраля 2012

Вам не нужно беспокоиться об утечках памяти в любом случае, но хорошо, что вы следите за тем, где вы передаете объекты Context.Intent просто использует параметр Context для поиска имени вашего пакета, когда вы используете конструктор Intent(Context, Class) или setClass(Context, Class).Это просто удобные методы.

0 голосов
/ 20 февраля 2012

Может я не понял вашего вопроса.Но вы не используете контекст, когда определяете намерения.Вы используете контекст для вызова компонентов, используя намерения.Например, вы используете:

context.startActivity(intent)

Но обычно вы вызываете эти методы в ваших действиях и службах, что расширяет контекст.Таким образом, вы просто используете:

startActivity(intent)
0 голосов
/ 20 февраля 2012

startActivity() не требует контекста в качестве параметра; это метод внутри класса, который уже получен из (или реализует) Context. То есть - вы не можете позвонить startActivity(), если у вас нет контекста, из которого можно его вызвать.

...