相关疑难解决方法(0)

SurfaceHolder回调如何与Activity生命周期相关?

我一直在尝试实现一个需要在表面上进行相机预览的应用程序.在我看到事物时,活动和表面生命周期都包含以下状态:

  1. 当我第一次启动我的活动: onResume()->onSurfaceCreated()->onSurfaceChanged()
  2. 当我离开我的活动: onPause()->onSurfaceDestroyed()

在此方案中,我可以像打开/释放相机相应的调用和启动/停止在预览onPause/onResumeonSurfaceCreated()/onSurfaceDestroyed().

它工作正常,除非我锁定屏幕.当我启动应用程序时,然后锁定屏幕并在以后解锁它我看到:

onPause()- 屏幕锁定后没有别的 - 然后onResume()解锁后 - 之后没有表面回调.实际上,onResume()在按下电源按钮并且屏幕打开后调用,但是锁定屏幕仍然处于活动状态,因此,在活动变得均匀可见之前.

通过这种方案,我在解锁后得到一个黑屏,并且没有调用表面回调.

这是一个代码片段,不涉及相机的实际工作,而是SurfaceHolder回调.即使在我的手机上使用此代码,也会重现上述问题(按"后退"按钮时会以正常顺序调用回调,但在锁定屏幕时会丢失):

class Preview extends SurfaceView implements SurfaceHolder.Callback {

    private static final String tag= "Preview";

    public Preview(Context context) {
        super(context);
        Log.d(tag, "Preview()");
        SurfaceHolder holder = getHolder();
        holder.addCallback(this);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    public void surfaceCreated(SurfaceHolder holder) {
        Log.d(tag, "surfaceCreated");
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        Log.d(tag, "surfaceDestroyed");
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { …
Run Code Online (Sandbox Code Playgroud)

camera android surfaceview

71
推荐指数
2
解决办法
4万
查看次数

活动生命周期X电源按钮X锁定屏幕

当我按下电源键时,屏幕关闭(完全黑暗),系统会破坏我的活动,然后重新创建它:

03-28 22:48:00.934: V/[BB](5809): [GameControl] onPause
03-28 22:48:01.444: V/[BB](5809): [GameControl] onDestroy
03-28 22:48:01.724: V/[BB](5809): [GameControl] onCreate
03-28 22:48:03.016: V/[BB](5809): [GameControl] onResume
03-28 22:48:03.016: V/[BB](5809): [GameControl] onPause
Run Code Online (Sandbox Code Playgroud)

这是因为我的活动具有固定方向(横向)并且锁定屏幕是纵向.

我通过设置固定的纵向方向测试了这个理论,但问题没有发生.我还检查了getResources().getConfiguration()值:

{ scale=1.0 imsi=724/31 loc=pt_BR touch=3 keys=2/1/1 nav=1/1 orien=2 layout=17 uiMode=17 seq=36}
{ scale=1.0 imsi=724/31 loc=pt_BR touch=3 keys=2/1/1 nav=1/1 orien=1 layout=17 uiMode=17 seq=37}
{ scale=1.0 imsi=724/31 loc=pt_BR touch=3 keys=2/1/1 nav=1/1 orien=2 layout=17 uiMode=17 seq=38}
Run Code Online (Sandbox Code Playgroud)

怎么可以避免呢?我不希望锁定屏幕破坏我的活动!

android android-lifecycle

15
推荐指数
1
解决办法
5833
查看次数

对Android Activity生命周期的困惑

我有一个应用程序是一个活动.

一切都按照我的预期工作,除非我把电话(三星Galaxy Ace运行姜饼)用侧面的按钮睡觉.当我这样做时,会调用以下内容(按此顺序):

onPause,onStop,onDestroy,onCreate,onStart,onResume,onPause.

这是没有唤醒手机,它仍然睡着了 - 屏幕关闭.

为什么活动被完全杀死并重新创建?

更奇怪的是,如果手机再切换回来,则会发生以下情况:

onResume,onPause,onStop,onDestroyed,onCreate,onStart,onResume

即使它已经"准备好了"(坐在onPause中),它也会被杀死并重新创建.

如果应用程序正在运行并按下Home,则活动仅停止,而不是被杀死,一旦停止,我可以将手机置于睡眠状态,然后再将其唤醒,活动永远不会被杀死.它只是去onRestart等......这是我所期待的.

仅当手机在活动运行时(并在前台)进入睡眠状态时,才会出现此问题.

我已经阅读了有关活动生命周期的文档,但我无法弄清楚为什么会出现这种情况.

android sleep activity-lifecycle android-activity

3
推荐指数
1
解决办法
754
查看次数