从 MainActivity 中的 onCreate() 启动另一个 Activity?
Posted
技术标签:
【中文标题】从 MainActivity 中的 onCreate() 启动另一个 Activity?【英文标题】:Start Another Activity from onCreate() in MainActvity? 【发布时间】:2013-11-16 21:40:09 【问题描述】:我遇到的问题是 MainActivity 中的 onCreate() 方法似乎无法启动另一个活动。
我有代码工作,因此当我单击一个按钮时,我的“AboutActivity”就会启动。但是,我想让它在 MainActivity 中的 onCreate() 完成后立即启动“AboutActivity”。
当我在尝试从 onCreate() 启动“AboutActivity”时运行程序时,程序卡在一个空白屏幕。
发布的代码是问题的简化版本。本质上,这就是我想要做的。
public class MainActivity extends Activity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Fire the intent that launches the "About" screen.
Intent aboutScreen = new Intent(getBaseContext(), AboutActivity.class);
this.startActivity(aboutScreen);
AboutActivity 类的代码:
public class AboutActivity extends MainActivity
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_about);
@Override
public void onPause()
super.onPause();
@Override
public boolean onCreateOptionsMenu(Menu menu)
return super.onCreateOptionsMenu(menu);
LogCat 消息是:
11-16 16:33:47.335: D/dalvikvm(1702): GC_FOR_ALLOC freed 65K, 7% free 2692K/2876K, paused 70ms, total 72ms
11-16 16:33:47.335: I/dalvikvm-heap(1702): Grow heap (frag case) to 3.347MB for 635812-byte allocation
11-16 16:33:47.435: D/dalvikvm(1702): GC_FOR_ALLOC freed 2K, 6% free 3310K/3500K, paused 98ms, total 98ms
11-16 16:33:47.715: D/dalvikvm(1702): GC_FOR_ALLOC freed 20K, 4% free 3469K/3608K, paused 28ms, total 29ms
11-16 16:33:47.735: I/dalvikvm-heap(1702): Grow heap (frag case) to 5.478MB for 2073616-byte allocation
11-16 16:33:47.845: D/dalvikvm(1702): GC_FOR_ALLOC freed 1K, 3% free 5493K/5636K, paused 112ms, total 112ms
11-16 16:33:48.175: I/Choreographer(1702): Skipped 36 frames! The application may be doing too much work on its main thread.
11-16 16:33:48.465: D/libEGL(1702): loaded /system/lib/egl/libEGL_emulation.so
11-16 16:33:48.555: D/(1702): HostConnection::get() New Host Connection established 0x2a210280, tid 1702
11-16 16:33:48.604: D/libEGL(1702): loaded /system/lib/egl/libGLESv1_CM_emulation.so
11-16 16:33:48.615: D/libEGL(1702): loaded /system/lib/egl/libGLESv2_emulation.so
11-16 16:33:48.715: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:33:48.725: D/OpenGLRenderer(1702): Enabling debug mode 0
11-16 16:33:51.794: D/dalvikvm(1702): GC_FOR_ALLOC freed 139K, 4% free 6352K/6608K, paused 38ms, total 46ms
11-16 16:33:53.135: D/dalvikvm(1702): GREF has increased to 201
11-16 16:33:55.315: D/dalvikvm(1702): GC_FOR_ALLOC freed 219K, 5% free 7420K/7756K, paused 58ms, total 64ms
11-16 16:34:00.825: D/dalvikvm(1702): GC_FOR_ALLOC freed 281K, 5% free 8778K/9176K, paused 131ms, total 133ms
11-16 16:34:00.955: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:01.405: I/Choreographer(1702): Skipped 31 frames! The application may be doing too much work on its main thread.
11-16 16:34:01.635: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:02.295: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:03.026: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:03.625: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:04.246: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:04.875: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:05.557: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:06.206: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:06.675: D/dalvikvm(1702): GREF has increased to 301
11-16 16:34:06.816: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:07.458: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:07.978: I/Choreographer(1702): Skipped 30 frames! The application may be doing too much work on its main thread.
11-16 16:34:08.296: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:08.975: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:09.686: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:10.315: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:10.945: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:13.094: D/dalvikvm(1702): GC_FOR_ALLOC freed 367K, 5% free 10460K/10944K, paused 124ms, total 128ms
11-16 16:34:16.446: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:16.965: I/Choreographer(1702): Skipped 30 frames! The application may be doing too much work on its main thread.
11-16 16:34:17.125: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:17.625: I/Choreographer(1702): Skipped 30 frames! The application may be doing too much work on its main thread.
11-16 16:34:17.827: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:18.355: I/Choreographer(1702): Skipped 32 frames! The application may be doing too much work on its main thread.
11-16 16:34:18.555: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:19.145: I/Choreographer(1702): Skipped 34 frames! The application may be doing too much work on its main thread.
11-16 16:34:19.358: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:20.103: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:20.615: I/Choreographer(1702): Skipped 34 frames! The application may be doing too much work on its main thread.
11-16 16:34:20.880: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:22.825: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:23.445: I/Choreographer(1702): Skipped 35 frames! The application may be doing too much work on its main thread.
11-16 16:34:23.675: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:24.195: D/dalvikvm(1702): GC_FOR_ALLOC freed 381K, 4% free 12129K/12628K, paused 289ms, total 291ms
11-16 16:34:24.355: I/Choreographer(1702): Skipped 40 frames! The application may be doing too much work on its main thread.
11-16 16:34:24.585: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:25.215: I/Choreographer(1702): Skipped 36 frames! The application may be doing too much work on its main thread.
11-16 16:34:25.496: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:26.025: I/Choreographer(1702): Skipped 30 frames! The application may be doing too much work on its main thread.
11-16 16:34:26.235: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:26.735: D/dalvikvm(1702): GREF has increased to 401
11-16 16:34:26.795: I/Choreographer(1702): Skipped 32 frames! The application may be doing too much work on its main thread.
11-16 16:34:27.006: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:29.516: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:30.075: I/Choreographer(1702): Skipped 37 frames! The application may be doing too much work on its main thread.
11-16 16:34:30.305: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:30.825: I/Choreographer(1702): Skipped 31 frames! The application may be doing too much work on its main thread.
11-16 16:34:31.046: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:31.595: I/Choreographer(1702): Skipped 32 frames! The application may be doing too much work on its main thread.
11-16 16:34:31.816: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:32.385: I/Choreographer(1702): Skipped 34 frames! The application may be doing too much work on its main thread.
11-16 16:34:32.615: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:33.145: I/Choreographer(1702): Skipped 31 frames! The application may be doing too much work on its main thread.
11-16 16:34:33.365: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:37.115: D/dalvikvm(1702): GC_FOR_ALLOC freed 392K, 4% free 13787K/14296K, paused 164ms, total 167ms
11-16 16:34:38.345: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:45.285: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:49.475: I/Choreographer(1702): Skipped 67 frames! The application may be doing too much work on its main thread.
如果我让应用程序在我的 AVD 上运行,LogCat 只会不断循环这部分日志:
11-16 16:34:31.046: W/EGL_emulation(1702): eglSurfaceAttrib not implemented
11-16 16:34:31.595: I/Choreographer(1702): Skipped 32 frames! The application may be doing too much work on its main thread.
我不知道如何解决这个问题。请帮忙!
【问题讨论】:
暂时忘记代码和 onCreate 以及所有这些东西。 你想做什么? 如果我的 SharedPreferences 中的布尔值设置为 true,我会尝试弹出一个屏幕。也可以通过 MainActivity UI 中的按钮访问同一屏幕。最终,我试图实现类似闪屏的效果。 什么是MainActivity?你能发布它的代码吗? 您的 AboutActivity 是否必须扩展 MainActivity,还是只能扩展 Activity?我还没有测试过,但这可能会导致一些问题。 【参考方案1】:你的 AboutActivity 类...
public class AboutActivity extends MainActivity
请改成:
public class AboutActivity extends Activity
正如其他人所说,在构建您的意图时,请使用 this 或 MainActivity.this。
【讨论】:
【参考方案2】:试试这个:
Intent aboutScreen = new Intent(MainActivity.this, AboutActivity.class);
this.startActivity(aboutScreen);
【讨论】:
那么您的问题可能出在其他地方。你能发布整个代码。您似乎正在做一些内存密集型工作。 我认为您的问题出在主要活动中,我认为甚至没有达到对“关于”屏幕的调用。您可以通过在通话前添加日志来检查它是否已打印。 我已经完成了整个应用程序的断点。我可以向你保证,它确实达到了“this.startActivity(aboutScreen);” Hmm.. 然后检查它是否到达 about 活动的 setContentView。也许您的布局在膨胀时未能膨胀或导致问题?【参考方案3】:尝试将 this
而不是 getBaseContext()
传递给意图。
公共类 MainActivity 扩展 Activity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Fire the intent that launches the "About" screen.
Intent aboutScreen = new Intent(this, AboutActivity.class);
this.startActivity(aboutScreen);
【讨论】:
这似乎无法解决我的问题。 :// 能分享一下 AboutActivity 类的实现吗? AboutActivity 现在在原始帖子中可见。 你还做了什么? 最初,我在 MainActivity 的 onCreate() 方法中运行了一些其他代码。但是,为了简单起见,我将问题归结为您在 onCreate() 方法中看到的所有内容。它是完全复制的。【参考方案4】:我才意识到问题出在哪里。
问题是 AboutActivity 导致意图反复触发。 AboutActivity 的 onCreate() 中的第一行是 super.onCreate(savedInstanceState)。这意味着应用程序控制将返回到 MainActivity 的 onCreate(),然后将再次触发 Intent。因此,我似乎造成了intent调用的无限循环。
如果我找到解决方案,我会发布。
【讨论】:
@Melquiades 用我自己的解决方案击败了我。 为什么你的 AboutActivity 会扩展 MainActivity?真的,它应该只是扩展普通的旧 Activity。 @Lethal Left Eye: 很高兴你自己发现了问题 :) 事实上,因为 AboutActivity 扩展了 MainActivity,并调用它的 super(),你在 Main 的 onCreate 中一遍又一遍地创建一个意图。 【参考方案5】:@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Fire the intent that launches the "About" screen.
Intent i= new Intent(this, AboutActivity.class);
startActivity(i);
【讨论】:
以上是关于从 MainActivity 中的 onCreate() 启动另一个 Activity?的主要内容,如果未能解决你的问题,请参考以下文章
从 MainActivity 类中的另一个函数访问 WebView
错误形式(在 com.going.books.MainActivity.onCreate(MainActivity.java:19))
分组推送通知再次调用 MainActivity 的 OnCreate()。如何处理?
Activity的onCreate中启动新的Activity时生命周期