我从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时,我会得到一个不停止循环创建大量“登录”对象/活动。
我该如何解决这个问题?
答案 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更好。