Подтвердить что ты не робот

Как исходный код Android не имеет основного метода и все еще работает?

Я видел это в нескольких учебниках сейчас... но как в мире исходный код Android не имеет основного метода и все еще выполняется.

Например (из http://developer.android.com/guide/tutorials/hello-world.html):

public class HelloAndroid extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

Это работает, но нет главного!!!

Я также думал, что использование таких вещей, как onCreate (или formLoad и т.д.), было плохим, потому что конструктор должен выполнять эту работу, и такие встроенные методы иногда могут быть вонючим. Но onCreate - точка входа? Даже без основного?

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

Спасибо!

4b9b3361

Ответ 1

Каждое приложение будет иметь собственную виртуальную машину. Для запуска приложения внутри него пространство (VM) должно иметь основной метод.

Действия не являются действительными классами, которые должны быть вызваны для запуска приложения. Существует класс под названием Application, который будет корневым классом для запуска приложения.

Если главного метода нет, как VM распознает, как запустить приложение?

В Framework есть классы под названием Process, VMRuntime, которые отвечают за запуск приложения. Что действительно имеет дело с основным методом.

Для лучшего понимания изучите сервис Zygote для Android. работает с ApplicationManager Service, ActivityStack Activity Thread и т.д.

Ответ 2

Это работает, но нет главного!!!

Конечно. Многие вещи, которые вы можете рассматривать как приложение Java, не имеют собственного метода main(). Например, IIRC, сервлеты, WARs и т.д. Не имеют методов main() - метод main(), если он есть, находится в контейнере.

Но onCreate - точка входа?

onCreate() - метод.

Что делать, если есть более одного действия... существует ли иерархия для этих встроенных обработчиков событий?

Не совсем.

OnCreate превосходит все остальные?

Не совсем.

В противном случае, как приложение сможет узнать, что нужно запустить или куда войти в программу?

Приложение не "знает, что запускать или куда вводить программу".

Приложение Android представляет собой корзину компонентов. Некоторые компоненты могут быть привязаны к значкам в стартовой панели запуска. Некоторые компоненты могут быть привязаны к запланированным таймерам, таким как задания cron или запланированные задачи Windows. Некоторые компоненты могут быть привязаны к системным событиям, например, когда устройство помещается в док-станцию ​​или удаляется из нее. Эти компоненты будут автоматически создаваться и использоваться, когда это необходимо (например, когда пользователь удаляет значок в стартовой панели запуска). Однако другие компоненты создаются и используются только тогда, когда ваш код специально запрашивает их.

Мысль о приложении Android, как будто это монолитная консольная программа Java, не вызовет у вас никаких проблем.

Ответ 3

Вы скажете, какой из них запускать при запуске в файле манифеста. Существует не main(), потому что этого не должно быть, главным может быть соглашение, используемое для "обычных" Java-приложений, но это не для таких вещей, как апплеты браузера. Система создает объект активности и вызывает в нем методы, которые могут быть или не быть вызваны main. В этом случае это не так.

onCreate отличается от основного и конструктора тем, что его можно вызывать дважды в одном действии, например, если процесс убит и пользователь переходит к активности. См. http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

Ответ 4

На самом деле, этот тип шаблона не свойственен Android, но бывает, когда у вас есть какая-то среда в середине. Некоторые основные примеры: java-апплеты и сервлеты. Некоторые из ответов уже дают правильный ответ, но я попытаюсь немного разобраться.

Когда вы запускаете приложение Java, вы запускаете JVM, а затем вам нужно что-то загружать в него: вам нужен статический метод (основной), потому что в JVM нет объектов, которые вы можете ссылаться к.

Если у вас есть какая-то структура в середине, это фреймворк, который запустит JVM и начнет заполнять его своими собственными объектами сервиса: запись вашего кода тогда означает запись ваших собственных объектов (которые будут подклассами данного "шаблон" ). Затем ваши объекты могут быть введены (загружены) каркасом. Объекты службы инфраструктуры управляют жизненным циклом инъецируемых объектов, вызывая методы жизненного цикла, определенные в суперклассе "шаблон".

Так, например, когда вы предоставляете апплет для браузера, вы не запускаете статический основной метод: скорее вы предоставляете только подкласс java.applet.Applet, который реализует некоторые методы экземпляра, которые действуют как обратный вызов для управления жизненным циклом ( init, paint, stop...). Это браузер, который запустит JVM, создаст экземпляр того, что необходимо для запуска апплета, загрузит ваш апплет и вызовет его.

Аналогично, с сервлетами вы подклассифицируете класс javax.servlet.http.HttpServlet и реализуете некоторые методы (не статические) (doGet, doPost...). Веб-контейнер (например, Tomcat) будет отвечать за запуск JVM, создать экземпляр, необходимый для запуска сервлета, загрузить сервлет и вызвать его.

Шаблон в Android почти такой же: что вы делаете, это создать подкласс android.app.Activity. Когда вы запускаете приложение, система просматривает манифест, чтобы узнать, какую активность следует запустить, затем "каркас" загружает его и вызывает его методы экземпляра (onCreate, onPause, onResume...).

Ответ 5

Пока нет конкретной основной точки входа, фильтры намерений описывают, какая активность запускается при запуске приложения. Они управляются в AndroidManifest.xml, как описано здесь:

http://developer.android.com/guide/topics/intents/intents-filters.html

где описывается пример приложения блокнотной площадки:

      Этот фильтр объявляет основную точку входа в приложение Note Pad. Стандартное действие MAIN - это точка входа, которая не требует никакой другой информации в Intent (например, не спецификация данных), а категория LAUNCHER говорит, что эта точка входа должна быть указана в панели запуска приложений.

Ответ 6

Программист-программист должен научиться этому, как и в их руках, он просто объясняет все и помогает в будущем при создании действий. http://developer.android.com/reference/android/app/Activity.html

Ответ 7

В программах Java нам нужен метод main(), потому что при выполнении байтового кода JVM будет искать метод main() в классе и запускать его там.

В Android виртуальная машина Dalvik предназначена для поиска класса, который является подклассом Activity и который предназначен для запуска выполнения приложения из метода onCreate(), поэтому нет необходимости в main() метод.

Порядок, в котором методы виртуальной машины Dalvik вызывает методы, основан на порядке приоритетов, называемых жизненным циклом Android, для получения дополнительной информации о жизненном цикле android, проверьте ссылку ниже Жизненный цикл Android: https://developer.android.com/guide/components/activities/activity-lifecycle.html

Ответ 8

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

Ответ 10

Апплеты также не имеют методов main(). Это зависит только от того, как упакован ваш код.

Ответ 11

Кадр пользовательского интерфейса Android инкапсулирует некоторые общие сведения о Java, вы можете изучить исходный код фреймворка пользовательского интерфейса Android.

Ответ 12

Я думаю, что ответ Джонатона идет в правильном направлении. Он говорит, что ОС ожидает определенную структуру. Там есть название для этой структуры, которая является "автоматом". В этом случае Android называет его "жизненным циклом деятельности". Роб дает ссылку на документацию, содержащую важную диаграмму этого автомата, хотя текст немного сух. Быстрый поиск также нашел мне следующую ссылку, которая объясняет это довольно четко: http://www.android-app-market.com/android-activity-lifecycle.html

Ответ 13

В Java есть основной, даже если он не указан как main(). Страница, которую вы получаете после щелчка значка, независимо от его имени, - это main().