这是我的第一个应用程序,也是一个基本问题。我想知道如何处理中断,例如锁定屏幕或最小化应用程序。这两件事目前都会导致应用程序变黑,并停止响应。
该应用程序只使用一项活动构建:主要活动。在这里,
GameSurface extends SurfaceView implements SurfaceHolder.Callback { ... }
是一个具有相关" GameThread.java"的类。线程,他们一起运行简单的应用程序并绘制到Canvas。
这里是MainActivity.java:
public class MainActivity extends AppCompatActivity {
final int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
getWindow().getDecorView().setSystemUiVisibility(flags);
this.setContentView(new GameSurface(this));
}
@Override
protected void onPause() {
//finish();
super.onPause();
}
}
在onPause()中没有finish(),应用程序无法应对中断。据推测,这与savedInstanceState Bundle没有保存" GameSurface",或者无法在onResume()函数中恢复,但我不明白这个问题。
向onPause()添加finish()会导致应用程序关闭,但应用程序的图像会滞后于我的主屏幕背景,位于我的应用程序图标后面。当我打断它时,我不想杀死应用程序,但我认为它应该很简单,所以我很好奇为什么这并不能完全关闭应用程序。我似乎无法找到另一种方式来结束主要活动,是否有一个不同的功能来彻底终止应用程序?
我的直接目标是在屏幕解锁后让应用程序恢复,锁定之后,我认为这将是一个简单的过程,但我无法找到如何做到这一点。也许我的应用程序结构不合理。如果您有更好的方法可以构建应用程序,请告诉我。整个UI是一个画布,我将卡通树等画到。
编辑:我读过另一个问题: Android Activity lifecycle and locking/unlocking device由于我在主要活动中将屏幕方向指定为横向,因此必须销毁主要活动才能显示纵向锁定屏幕。然后,我猜,onCreate()不起作用,因为,savedInstanceState是坏的,但我不明白为什么它不好。我也不知道当我最小化应用程序时会发生什么,而不会改变屏幕方向。
编辑:这是我打开应用程序,锁定屏幕,解锁,然后关闭的日志:
(我已在主要活动的某些方法中添加了Log指令)
[应用程序启动,大量正常记录]
06-09 08:06:47.384 29697-29697/com.example.christian.androidgame2d W/System: ClassLoader referenced unknown path: /data/app/com.example.christian.androidgame2d-2/lib/arm
06-09 08:06:47.388 29697-29697/com.example.christian.androidgame2d I/InstantRun: starting instant run server: is main process
06-09 08:06:47.533 29697-29697/com.example.christian.androidgame2d D/log: onCreate
06-09 08:06:47.587 29697-29697/com.example.christian.androidgame2d W/art:
Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
06-09 08:06:47.837 29697-29697/com.example.christian.androidgame2d D/log: onstart
06-09 08:06:47.837 29697-29697/com.example.christian.androidgame2d D/log: onresume
06-09 08:06:47.859 29697-29735/com.example.christian.androidgame2d D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
06-09 08:06:47.957 29697-29735/com.example.christian.androidgame2d I/Adreno-EGL: <qeglDrvAPI_eglInitialize:379>: QUALCOMM Build: 10/09/15, 6cbbf7d, I3193f6e94a
06-09 08:06:47.968 29697-29735/com.example.christian.androidgame2d I/OpenGLRenderer: Initialized EGL, version 1.4
06-09 08:06:48.206 29697-29697/com.example.christian.androidgame2d W/art: Before Android 4.1, method int android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView
该应用现在正常运行。 [我锁定屏幕(电源按钮)]
06-09 08:07:22.852 29697-29697/com.example.christian.androidgame2d D/log: onPause
[ 06-09 08:07:22.868 1735: 1835 D/ ]
activate, handle: 1598182242, enabled: 0, index 2
[ 06-09 08:07:22.868 1735: 1835 D/ ]
BstSensorExt: id=1598182242, en=0
[ 06-09 08:07:22.868 1735: 1835 D/ ]
enable ID_SORI, path /sys/class/srot_sensor/g_sensor/en_disp_rotation, fd 248
06-09 08:07:23.344 29697-29697/com.example.christian.androidgame2d D/log: ondestroy
[解锁屏幕]
不再记录。但该应用程序显示为冻结图像。我最小化了应用程序,它的故障如下:Buggy minimisation
因此应用程序尚未关闭,但主要活动已调用onDestroy()。我不知道应用程序处于什么阶段。
答案 0 :(得分:0)
在提高了我对一般概念和记录事物的理解之后,我发现问题实际上在“GameSurface.java”中;方法surfaceDestroyed(SurfaceHolder holder)中有一个非结束的while循环。 (不重要,只是一个错误)
我错过的主要内容:
将方向设置为横向会导致MainActivity在锁定屏幕时调用onDestroy(),因为锁定屏幕的方向是纵向,因此必须销毁活动。这意味着我的活动在锁定和解锁后重置。特别令人讨厌的是,该方法是从教程中复制的,哦。
在修复bug之后,将finish()放在onPause()会导致应用程序在我锁定屏幕时关闭,但是当我最小化它时会导致它无法重新打开,所以这是不好的做法/没用。
因为'GameSurface'正在通过中断应用程序来销毁,为了恢复应用程序,我需要一些方法来存储GameSurface正在做的事情(存储所有树的大小和位置,在这种情况下)这是我的下一个目标。
我的修复包括放置 。getWindow()getDecorView()setSystemUiVisibility(标志)。 onResume()中的指令,因此到目前为止,应用程序只是在用户返回时重新启动。至少它不再崩溃。
答案 1 :(得分:0)
我建议您改进应用程序与Android Activity生命周期的绑定。
当您的应用首次启动时,Android会调用您活动的onCreate
,onStart
和onResume
种方法。 Android希望您使用这些方法设置应用。我相信你的应用程序正在做这些。
现在,当用户离开你的应用程序做其他事情时(例如接听电话,切换到另一个应用程序,关闭手机),Android希望你的应用程序有相应的行为,即免费资源,停止线程等。 Android提供了onPause
,onStop
和onDestroy
方法。请注意,onPause
镜像到onResume
,onStop
镜像到onStart
,onCreate
镜像到onDestroy
。
所以,对于你的应用:
finish
中致电onPause
。您的应用在操作系统中调用onPause
,例如失去焦点但仍然可见。每次发生时,您都不需要完全关闭应用程序。<activity android:name="..."
android:screenOrientation="landscape">