Не останавливать цикл с помощью super.oncreate() и расширять MainActivity

Я расширяю класс «Вход» из MainActivity.

Основная активность выглядит так:

 public class MainActivity extends FragmentActivity {
/** Called when the activity is first created. */
private static String TAG = "MainActivity";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.main);

    Intent login_activity = new Intent(this, Login.class);
    startActivity(login_activity);
    Log.d(TAG,"Login created");
}
}

В login.class я просто вызываю макет:

public class Login extends MainActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
    //super.onCreate(savedInstanceState);
    setContentView(R.layout.login);
     }
}

Вы можете видеть, что я закомментировал «super.oncreate» в классе входа. Здесь нет смысла снова вызывать функцию oncreate MainActivity. Но с этим закомментированным super.oncreate я получу исключение:

12-31 11:37:47.688: E/AndroidRuntime(4206): FATAL EXCEPTION: main
12-31 11:37:47.688: E/AndroidRuntime(4206): android.app.SuperNotCalledException: Activity {de.svennergr.htn/de.svennergr.htn.Login} did not call through to super.onCreate()
12-31 11:37:47.688: E/AndroidRuntime(4206):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2146)
12-31 11:37:47.688: E/AndroidRuntime(4206):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
12-31 11:37:47.688: E/AndroidRuntime(4206):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
12-31 11:37:47.688: E/AndroidRuntime(4206):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
12-31 11:37:47.688: E/AndroidRuntime(4206):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-31 11:37:47.688: E/AndroidRuntime(4206):     at android.os.Looper.loop(Looper.java:137)
12-31 11:37:47.688: E/AndroidRuntime(4206):     at android.app.ActivityThread.main(ActivityThread.java:5039)
12-31 11:37:47.688: E/AndroidRuntime(4206):     at java.lang.reflect.Method.invokeNative(Native Method)
12-31 11:37:47.688: E/AndroidRuntime(4206):     at java.lang.reflect.Method.invoke(Method.java:511)
12-31 11:37:47.688: E/AndroidRuntime(4206):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
12-31 11:37:47.688: E/AndroidRuntime(4206):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
12-31 11:37:47.688: E/AndroidRuntime(4206):     at dalvik.system.NativeStart.main(Native Method)

Когда я не комментирую super.oncreate, я получаю непрерывный цикл, создающий множество объектов/действий «Вход».

Как мне это решить?


person svennergr    schedule 31.12.2012    source источник
comment
почему вы запускаете MainActivity? начать прямое входное действие...   -  person Niranj Patel    schedule 31.12.2012
comment
В будущем я хочу проверить некоторые вещи в MainActivity, чтобы начать правильное действие. НАПРИМЕР. когда пользователь уже вошел в систему, я начну другое действие.   -  person svennergr    schedule 31.12.2012


Ответы (4)


В Android необходимо придерживаться жизненного цикла Activity. Каждый раз, когда вы переопределяете метод жизненного цикла, вы должны вызывать super, чтобы обеспечить согласованность с жизненным циклом Activity.

Дело здесь не в вызове MainActivity.onCreate, а в Activity.onCreate. Если вы не хотите наследовать поведение MainActivity внутри LoginActivity, не расширяйте его. Возможно, вам нужен промежуточный родительский общий родительский класс для группировки только желаемого поведения.

person Snicolas    schedule 31.12.2012

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

Как правило, не очень хорошая идея запускать действие в методе onCreate() другого действия. Просто подумайте о других способах запуска вашей активности входа в систему (например, создайте кнопку, которая запускает ее).

Если вы планируете иметь несколько подклассов вашего MainActivity, просто инкапсулируйте в нем общее поведение и компоненты и напрямую запускайте свои подклассы (активность входа). Или, если вы хотите, чтобы активность входа отображалась в начале, вы можете сделать ее активностью LAUNCHER в AndroidManifest.xml.

Пожалуйста, прочитайте больше о жизненных циклах действий и изучите теорию перед разработкой. .

person Taras Leskiv    schedule 31.12.2012
comment
Мы не говорим о конструкторах здесь. Хорошо, onCreate — это первый метод, который вызывается в жизненном цикле Activity, но это не конструктор. - person Snicolas; 31.12.2012
comment
извините, вы абсолютно правы, отредактировал мой ответ, я имел в виду вызов метода super.onCreate(). - person Taras Leskiv; 31.12.2012

правило заключается в том, что если вы переопределяете onCreate(), вы должны вызвать super.onCreate()... что вы можете сделать, так это установитьContentView() в MainActivity следующим образом: setContentView(getCurrentViewLayoutId()) и getCurrentViewLayoutId() будет метод, который реализует LoginActivity.java... таким образом, вы можете полностью удалить реализацию onCreate() из LoginActivity.java... тогда у вас не возникнет проблем с проверкой "super.onCreate()". Но, вероятно, было бы неплохо сделать этот вызов startActivity в методе onResume().

person Alécio Carvalho    schedule 31.12.2012

Есть ли какая-то конкретная причина расширения MainActivity для входа в систему?

Поскольку вы вызываете намерение входа в систему в MainActivity, а для входа в систему необходимо вызвать super.onCreate(), это будет бесконечный цикл. Итак, я думаю, что лучше расширить Activity вместо MainActivity.

person Kameswari    schedule 31.12.2012