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

3
我将从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”。在这里再次调用MainActivity的onCreate没有意义。但是,如果将此已注释的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时,我会得到一个不停止的循环,创建大量“Login”对象/活动。

我该怎么解决这个问题?


为什么你要启动MainActivity?直接启动登录活动... - Niranj Patel
将来,我想在MainActivity中检查一些东西以启动正确的活动。例如,当用户已经登录时,我会启动另一个活动。 - svennergr
4个回答

4

在Android中,您必须遵循Activity的生命周期。每次您重写生命周期方法时,必须调用super以确保与Activity的生命周期一致。

这里的重点不是调用MainActivity.onCreate而是调用Activity.onCreate。 如果您不想继承LoginActivity内MainActivity的行为,则不要从其继承。 也许您需要一个中间父类来仅组合所需的行为。


2

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

通常不建议在另一个Activity的onCreate()方法中启动Activity。只需考虑其他启动Login活动的方式(例如创建一个启动它的按钮)。

如果您计划有多个MainActivity的子类,请将公共行为和组件封装在其中,并直接启动其子类(如Login activity)。或者,如果您希望Login activity出现在开头,可以将其设置为AndroidManifest.xml中的LAUNCHER活动。

请在开发之前阅读有关活动生命周期的更多信息并学习一些理论知识。


1
我们这里不讨论构造函数。好的,onCreate是Activity生命周期中被调用的第一个方法,但它不是构造函数。 - Snicolas
对不起,你是完全正确的,我编辑了我的答案,我的意思是调用super.onCreate()方法。 - Taras Leskiv

0
规则是,如果你重写了onCreate()方法,你必须调用super.onCreate()...你可以在MainActivity中使用setContentView()方法,像这样:setContentView(getCurrentViewLayoutId()),getCurrentViewLayoutId()将是LoginActivity.java实现的一个方法...这样你就可以完全从LoginActivity.java中删除onCreate()的实现...然后你就不会遇到"super.onCreate()检查"的任何问题。但最好在onResume()中执行startActivity()调用。

0

为什么要将MainActivity扩展到Login中?

由于您在MainActivity中调用了Login意图,并且Login需要调用super.onCreate(),这将导致无限循环。因此,我认为最好将Activity扩展而不是MainActivity。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接