不使用super.oncreate()停止循环并扩展MainActivity

时间:2012-12-31 10:45:35

标签: java android oncreate

我从MainActivity扩展了一个“Login”类。

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”。再次调用MainActivitys 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时,我会得到一个不停止循环创建大量“登录”对象/活动。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:4)

在Android中,您必须遵守活动的生命周期。每次覆盖生命周期方法时,都必须调用super以确保与活动生命周期保持一致。

这里的要点不是调用MainActivity.onCreate而是调用Activity.onCreate。如果您不想从LoginActivity中继承MainActivity的行为,则不要从中扩展。也许您需要一个中间父公共父类来仅对所需行为进行分组。

答案 1 :(得分:2)

在继承Activity时,必须始终显式调用onCreate()超类方法,以便系统可以正确初始化它,这样你就不能消除对超类onCreate()的调用。

在另一个活动的onCreate()方法中启动活动通常不是一个好主意。只需考虑启动Login活动的其他方式(制作启动它的按钮,例如。)。

如果您计划拥有MainActivity的多个子类,则只需填充其中的常见行为和组件,然后直接启动子类(Login活动)。或者,如果您希望登录活动显示在开头,则可以在LAUNCHER中将其设为AndroidManifest.xml个活动。

请详细了解activity lifecycles并在开发前研究一些理论。

答案 2 :(得分:0)

规则是,如果你重写onCreate()你必须调用super.onCreate()...你可以做的是在MainActivity上的setContentView(),如下所示:setContentView(getCurrentViewLayoutId())和getCurrentViewLayoutId( )将是LoginActivity.java实现的方法...像这样你可以完全从LoginActivity.java中删除onCreate()实现。然后你就不会遇到任何问题“super.onCreate()check” 。但是在onResume()中进行startActivity调用可能是个好主意。

答案 3 :(得分:0)

是否有任何特定原因需要为登录扩展MainActivity?

由于您在MainActivity中调用Login intent,而Login需要调用super.onCreate(),因此它将进入无限循环。所以,我认为扩展Activity而不是MainActivity更好。