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

Как создается действие Android (используя отражение)?

Об этом сегодня сказал в интервью для Android. Я ответил обычным, вы знаете, намерение + startActivity и т.д. Затем собеседник спросил более остро,

"Да, но где он фактически создан? Вы не называете новый Деятельность в любом месте".

Что теперь, когда я думаю об этом, я действительно не знаю. Он намекнул, что он использовал отражение Java, но у меня нет большого опыта с этим, и я использовал его только для доступа к некоторым переменным в Android SDK.

Может кто-нибудь объяснить, как действия создаются с использованием отражения и почему? Бонусные баллы за понимание того, какое значение дал интервьюер, зная это.

4b9b3361

Ответ 1

Когда на главном экране щелкнет значок запуска приложения, в системе Android появится следующее событие:

  • Приложение Homescreen/Launcher отправляет намерение начать работу с использованием startActivity() (startActivity() - вызов связующего агента в ActivityManager)
  • Диспетчер активности отправляет запрос процесса fork с использованием сокета в Zygote.
  • Zygote создает новый экземпляр виртуальной машины, который загружает ActivityThread (поток активности управляет выполнением основного потока в процессе приложения, планированием и выполнением действий, трансляций и других операций над ним по мере запроса менеджера активности.).
  • ActivityThread имеет реальный main() для приложения.
  • ActivityThread вызывает приложение onCreate().

Следовательно, ActivityThread отвечает за создание экземпляра Activity (внутри метода performLaunchActivity)

Объяснение:

Если вы наблюдаете stacktrace:

android.app.Instrumentation.newActivity(Instrumentation.java:1021)
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)

Код, в котором создается новая активность:

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
    ... //More code
    Activity activity = null;
    try {
        java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
        activity = mInstrumentation.newActivity(
                cl, component.getClassName(), r.intent);
        StrictMode.incrementExpectedActivityCount(activity.getClass());
        r.intent.setExtrasClassLoader(cl);
        r.intent.prepareToEnterProcess();
        if (r.state != null) {
            r.state.setClassLoader(cl);
        }
    } catch (Exception e) {
        if (!mInstrumentation.onException(activity, e)) {
            throw new RuntimeException(
                "Unable to instantiate activity " + component
                + ": " + e.toString(), e);
        }
    }
    ... //More code
    return activity;
}

Instrumentation.java(класс будет создан для вас перед любым кодом приложения)

public Activity newActivity(ClassLoader cl, String className,
        Intent intent)
        throws InstantiationException, IllegalAccessException,
        ClassNotFoundException {
    return (Activity)cl.loadClass(className).newInstance();
}

Ответ 2

Простым способом проверки пути к методу конструктора является создание временного проекта, переопределение конструктора в Activity и размещение там точки останова.

Вы должны пройти весь код и найти то, что именно хотите.

введите описание изображения здесь

Ответ 3

Пока вы не участвуете в интервью разработчику системы Android (хакер ядра,...), ответ просто: это часть реализации платформы Android, которую нормальный разработчик Android не должен заботиться, потому что принципа абстракции и слоя, и его можно найти в редком случае, вам действительно нужно это знать.

Ответ 4

Ядро Android отвечает за управление созданием действия и управление его жизненным циклом деятельности.

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

Когда вы вызываете startActivity, ядро ​​Android принимает управление и делает экземпляр действия (или повторно использует предыдущий, если соответствует) и начинает вызывать события жизненного цикла активности

Вы можете увидеть это здесь: http://developer.android.com/reference/android/app/Activity.html в разделе Lifecycle Activity