繁体   English   中英

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

[英]Not stopping loop with super.oncreate() and extending MainActivity

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

我该如何解决这个问题?

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

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

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

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

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

请阅读更多关于活动生命周期的信息,并在开发之前研究一些理论。

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

是否有任何特定原因可以扩展MainActivity for Login?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM