Как исходный код Android не может иметь основной метод и все еще работать? - PullRequest
18 голосов
/ 19 ноября 2010

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

Спасибо!

Ответы [ 13 ]

11 голосов
/ 14 декабря 2012

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

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

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

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

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

8 голосов
/ 19 ноября 2010

Это работает, но нет основной !!!

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

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

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

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

Не совсем.

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

Не совсем.

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

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

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

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

5 голосов
/ 15 января 2014

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

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

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

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

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

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

5 голосов
/ 19 ноября 2010

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

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

3 голосов
/ 26 июня 2017

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

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

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

2 голосов
/ 06 июня 2013

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

2 голосов
/ 25 апреля 2011

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

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

, где описан пример приложения блокнота:

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

1 голос
/ 19 ноября 2010

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

1 голос
/ 19 ноября 2010

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

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

1 голос
/ 19 ноября 2010

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

...