本文档只针对自己 记录开发的坑。
前段时间写一App 开机启动循环播放一个短视频。
开始使用 SurfaceView MediaPlayer 播放器视频,问题 写得也很常规
代码如下
其他 onPause onStop onDestroy 都很常规的写法。
但是事情并没有那么简单。
在测试过程中(魅族,魅蓝)
当其他页面跳转到Login的时候发现页面透明了,MediaPlayer 执行正常首页也正常在播放。
因为在 AndroidManifest.xml 并没有涉及到启动模式问题。
所以在跳转页面的时候都是带入启动模式
android:launchMode="standard" android:launchMode="singleInstance" android:launchMode="singleTask" android:launchMode="singleTop"
有一个踢下线的功能在 BaseApplication 中监听踢下线 结果悲剧了
在排除问题过程中 发现 比如 A页面跳转B页面时候带入
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
会清空前面的堆栈
但是A页面会执行
protected void onDestroy()
B比页面跳转C页面同理
但是 在BaseApplication 中全局监听跳转 Login 的时候 (前提登录失效 重新登录本页面数据要刷新不能清空全面的堆栈)
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
当BaseApplication 跳转到Login 2个都是 singleTop 这个时候Login不会执行
protected void onDestroy()
导致MediaPlayer ,SurfaceView 不会被清理,当再次被提下线的时候,就出现问题。
在倒腾后所有 TextureView 解决方案 不在黑屏 并且正常播放
重点当存在 启动模式的问题的时候一定需要清空 播放页面的堆栈 再次播放的时候重新创建
完美解决:被踢下线后视频无法再次播放,或者播放出现问题的清空, 主要是魅族测试机
企业项目不提供源码。见谅