设备用于进入“睡眠”模式,这会导致再次启动我的活动的 onCreate() 方法,这是不希望的。
例如,我有一个 VideoView 活动,它在 onCreate 方法中被初始化,所以当设备“休眠”时,它会重新创建我的播放器并启动播放器。
如何克服这一点?和系统广播有关系吗?
设备用于进入“睡眠”模式,这会导致再次启动我的活动的 onCreate() 方法,这是不希望的。
例如,我有一个 VideoView 活动,它在 onCreate 方法中被初始化,所以当设备“休眠”时,它会重新创建我的播放器并启动播放器。
如何克服这一点?和系统广播有关系吗?
onPause()
最终,一旦被调用,您永远无法阻止系统杀死您的应用程序。您必须始终编写您的应用程序,以便它可以重新启动。在实践中,这意味着 a) 实施onRetainNonConfigurationInstance()
以捕获应用程序的非常短期的破坏和重新创建,b) 覆盖onSaveInstanceState(Bundle)
以捕获中期破坏/重新创建,以及 c) 覆盖onPause()
以处理长期破坏/重新创建创建。
在大多数情况下,它是您真正需要实现onSaveInstanceState()
的唯一一个,但可以是真正的优化。onRetainNonConfigurationInstance()
在您的特定情况下,您onSaveInstanceState()
会将视频文件的 URI 和上次播放的时间戳写入 Bundle,以便在重新创建应用程序时返回到视频中最后播放的位置。
至于唤醒锁,这些是可以接受的,例如防止您的设备在观看视频的过程中进入睡眠状态。它们不能让你的应用程序不被杀死,这样你就不必经历第二次通过 onCreate() 的麻烦。首先,它会耗尽电池,其次,无论如何也不能保证。
最后一点:如果你不这样做,你应该确保你的视频播放活动设置了“singleTop”属性,这样你就不会在活动堆栈中获得多个实例。
您可以使用 AlarmManager 来触发小部件的刷新。在安排下一个周期时,您可以定义是否唤醒您的设备(也就是执行实际任务)。
alarmManager.set(wakeUpType, triggerAtTime, pendingIntent);