Android,MainActivity没有锁定屏幕

时间:2017-06-08 20:07:06

标签: java android

这是我的第一个应用程序,也是一个基本问题。我想知道如何处理中断,例如锁定屏幕或最小化应用程序。这两件事目前都会导致应用程序变黑,并停止响应。

该应用程序只使用一项活动构建:主要活动。在这里,

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()。我不知道应用程序处于什么阶段。

2 个答案:

答案 0 :(得分:0)

在提高了我对一般概念和记录事物的理解之后,我发现问题实际上在“GameSurface.java”中;方法surfaceDestroyed(SurfaceHolder holder)中有一个非结束的while循环。 (不重要,只是一个错误)

我错过的主要内容:

将方向设置为横向会导致MainActivity在锁定屏幕时调用onDestroy(),因为锁定屏幕的方向是纵向,因此必须销毁活动。这意味着我的活动在锁定和解锁后重置。特别令人讨厌的是,该方法是从教程中复制的,哦。

在修复bug之后,将finish()放在onPause()会导致应用程序在我锁定屏幕时关闭,但是当我最小化它时会导致它无法重新打开,所以这是不好的做法/没用。

因为'GameSurface'正在通过中断应用程序来销毁,为了恢复应用程序,我需要一些方法来存储GameSurface正在做的事情(存储所有树的大小和位置,在这种情况下)这是我的下一个目标。

我的修复包括放置     。getWindow()getDecorView()setSystemUiVisibility(标志)。 onResume()中的指令,因此到目前为止,应用程序只是在用户返回时重新启动。至少它不再崩溃。

答案 1 :(得分:0)

我建议您改进应用程序与Android Activity生命周期的绑定。

当您的应用首次启动时,Android会调用您活动的onCreateonStartonResume种方法。 Android希望您使用这些方法设置应用。我相信你的应用程序正在做这些。

现在,当用户离开你的应用程序做其他事情时(例如接听电话,切换到另一个应用程序,关闭手机),Android希望你的应用程序有相应的行为,即免费资源,停止线程等。 Android提供了onPauseonStoponDestroy方法。请注意,onPause镜像到onResumeonStop镜像到onStartonCreate镜像到onDestroy

所以,对于你的应用:

  • 你说你开始了一个主题。所以你应该在其中一个回调中停止它。
  • 您可以,但无需在finish中致电onPause。您的应用在操作系统中调用onPause,例如失去焦点但仍然可见。每次发生时,您都不需要完全关闭应用程序。
  • 如果您希望自己的应用始终处于横向状态,则可以在清单中执行此操作,这样您就不必创建,然后销毁,然后再次创建活动:
<activity android:name="..."
        android:screenOrientation="landscape">