【问题标题】:Android "something" call onPause of Activity during runningAndroid“某事”在运行期间调用 Activity 的 onPause
【发布时间】:2016-03-13 21:53:20
【问题描述】:

我尝试实现录音应用。我对Activity life cycle 有疑问。一段时间后(5 分钟、25 分钟、27 分钟……不同)“某事”调用ActivityonPause 方法。这对我来说是个问题,因为我有一些版本(CamerarecordingGPS 等)。当我以onPause 方法评论所有版本时,一切正常,我可以录制超过 60 分钟。没有人触摸设备。

我可以获取信息吗,谁是调用者 onPause 方法?

编辑:
我尝试了没有任何逻辑的新创建的应用程序,并且也调用了onPause(20 分钟后)。我认为,这个问题不适用。我有设备华为荣耀 4C,Android 5.1.1 和 EMUI 3.1。也许设备有一些“看门狗逻辑”。

编辑2:
我尝试(使用华为)使用原生相机应用程序录制,15 分钟后自动停止。 (SD 卡未满,文件不大于 4GB (FAT32))。 我尝试(使用 Nexus)并且应用程序运行超过 60 分钟。无需调用 onPause。

已解决:这取决于设备。

我已启用wakeLock(我在清单中拥有 WAKE_LOCK 权限。):

//KEEP SCREEN ON
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "MyWakelockTag");
wakeLock.acquire();

结构:

Activity (MediaProjectionActivity4 class)   
|    
| -- Thread of recording video (ScreenRecorder class)
| -- Thread of recording audio (AudioThread class)
| -- Thread of writing to file (SyncFile class)

添加后:Log.e(TAG, "onPause()", new RuntimeException());onPause 方法。 (12 分钟后调用 onPause)。我在没有过滤的情况下添加了 LogCat 调用 onPause 的前后日志消息。

03-16 16:14:14.600 25668-25668/com.example.mytestapp I/MainActivity: onCreateOptionsMenu()
03-16 16:40:40.770 25668-25668/com.example.mytestapp E/MainActivity: onPause()
 java.lang.RuntimeException
     at com.example.mytestapp.MainActivity.onPause(MainActivity.java:97)
     at android.app.Activity.performPause(Activity.java:6225)
     at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1321)
     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3510)
     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3483)
     at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3453)
     at android.app.ActivityThread.access$1400(ActivityThread.java:163)
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1386)
     at android.os.Handler.dispatchMessage(Handler.java:102)
     at android.os.Looper.loop(Looper.java:135)
     at android.app.ActivityThread.main(ActivityThread.java:5595)
     at java.lang.reflect.Method.invoke(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:372)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
03-16 16:40:40.810 25668-25668/com.example.mytestapp I/MainActivity: onResume()
03-16 17:10:41.560 25668-25668/com.example.mytestapp E/MainActivity: onPause()
 java.lang.RuntimeException
     at com.example.mytestapp.MainActivity.onPause(MainActivity.java:97)
     at android.app.Activity.performPause(Activity.java:6225)
     at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1321)
     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3510)
     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3483)
     at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3453)
     at android.app.ActivityThread.access$1400(ActivityThread.java:163)
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1386)
     at android.os.Handler.dispatchMessage(Handler.java:102)
     at android.os.Looper.loop(Looper.java:135)
     at android.app.ActivityThread.main(ActivityThread.java:5595)
     at java.lang.reflect.Method.invoke(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:372)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
03-16 17:10:41.590 25668-25668/com.example.mytestapp I/MainActivity: onResume()
03-16 17:40:42.360 25668-25668/com.example.mytestapp E/MainActivity: onPause()
 java.lang.RuntimeException
     at com.example.mytestapp.MainActivity.onPause(MainActivity.java:97)
     at android.app.Activity.performPause(Activity.java:6225)
     at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1321)
     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3510)
     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3483)
     at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3453)
     at android.app.ActivityThread.access$1400(ActivityThread.java:163)
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1386)
     at android.os.Handler.dispatchMessage(Handler.java:102)
     at android.os.Looper.loop(Looper.java:135)
     at android.app.ActivityThread.main(ActivityThread.java:5595)
     at java.lang.reflect.Method.invoke(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:372)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
03-16 17:40:42.390 25668-25668/com.example.mytestapp I/MainActivity: onResume()

【问题讨论】:

  • 要么您的用户启动另一个活动,点击主页或返回按钮,要么您让屏幕关闭(屏幕关闭触发 onPause)。
  • 我更新了帖子。没有人触摸设备,屏幕一直处于开启状态。
  • 您能否在onPause()Log.e(tag, msg, new RuntimeException()); 看看除了android.app.Activity.performPause 之外是否还有其他来电者?

标签: android android-activity android-lifecycle onpause


【解决方案1】:

Android 负责调用 Activity 上的所有生命周期方法。当活动不再接收输入焦点时调用它,这意味着其他内容可能显示在它之上,例如对话框。您可以阅读该文档和其他生命周期方法 here

【讨论】:

    【解决方案2】:

    可能有几个原因,但您可以通过使应用不进入睡眠状态来防止调用onPause

    你可以设置

    setKeepScreenOn(true)
    

    在视图涉及,这也将工作

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多