Как исходный код 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 превосходит все остальное? В противном случае, как приложение сможет узнать, что нужно запустить или куда войти в программу?

Благодаря!

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

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

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

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

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

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

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

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

    onCreate() – это метод.

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

    На самом деле, нет.

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

    На самом деле, нет.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Где описан пример применения блокнотной площадки:

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

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

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

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

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

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

    Я нашел это особенно полезным …

    http://developer.android.com/guide/topics/fundamentals.html#appcomp

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

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

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

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