代码拉取完成,页面将自动刷新
首次开启App进入SplashActivity
, 点击页面快速进入MainActivity
(默认等待2秒后进入).
SplashActivity
进入MainActivity
后(在等待期内)立即退出, 会自动再次打开MainActivity
SplashActivity
进入MainActivity
, 默认进入的代码任然会再次打开一次MainActivity
SplashActivity
, 会多次打开MainActivity
调用finish()
关闭启动页面, 并在onDestroy()
中取消未执行的消息
public class SplashActivity extends Activity {
private Handler handler = new Handler();
// 保证主界面只打开一次
private boolean isStartMain = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
// 等待两秒后执行
// runnable.run() 方法执行在主线程
handler.postDelayed(new Runnable() {
public void run() {
startMainActivity();
}
}, 2000);
}
// 开启主界面
private void startMainActivity() {
if (!isStartMain) {
isStartMain = true;
Intent intent = new Intent(SplashActivity.this, MainActivity.class);
startActivity(intent);
// 关闭启动页面
finish();
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// 点击启动页面, 快速进入到主页面
startMainActivity();
return super.onTouchEvent(event);
}
@Override
protected void onDestroy() {
super.onDestroy();
// 取消打开MainActivity的意图
handler.removeCallbacksAndMessages(null);
}
}
Enter : onCreate() -> onStart() -> onResume()
>> Home : onPause() -> onStop()
Home >> : onRestart() -> onStart() onResume()
Back : onPause() -> onStop() -> onDestroy()
Enter A : A.onCreate() -> A.onStart() -> A.onResume()
A >> B : A.onPause() -> B.onCreate() -> B.onStart() -> B.onResume() -> A.onStop()
B >> A : B.onPause() -> A.onRestart() -> A.onStart() -> A.onResume() -> B.onDestroy()
Enter A : A.onCreate() -> A.onStart() -> A.onResume()
// 没有 A.onStop()
A >> B : A.onPause() -> B.onCreate() -> B.onStart() -> B.onResume()
// 没有 A.onStart() , A.onRestart()
B >> A : B.onPause() -> A.onResume() -> B.onStopp() -> B.onDestroy()
onPause() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onResume()
配置哪些改变不执行生命周期方法
<!--
播放页面横屏固定
横竖屏切换不执行生命周期方法
android:configChanges="keyboardHidden|screenSize|orientation"
keyboardHidden:
键盘隐藏
screenSize:
屏幕大小改变
orientation:
横竖屏切换不执行生命周期方法
-->
<activity
android:name=".SystemVideoPlayer"
android:configChanges="keyboardHidden|screenSize|orientation" />
// 1. 声明
// 定义手势识别器
private GestureDetector detector;
// 2. 创建实例并监听关心的事件
// 实例化手势识别器
detector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
// 长按
@Override
public void onLongPress(MotionEvent e) {
switchPlayOrPause();
}
// 单击
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
// Toast.makeText(SystemVideoPlayer.this, "点击", Toast.LENGTH_SHORT).show();
showMediaController(!isShowMediaController);
return true;
}
});
// 3. 关联触摸事件
@Override
public boolean onTouchEvent(MotionEvent event) {
// 把事件传递给手势识别器
detector.onTouchEvent(event);
return super.onTouchEvent(event);
}
在 onTouchEvent()
中计算逻辑:
计算公式:
(startY - endY) / rangeY = changedVolume / maxVolume;
finalVolume = min(max(currVolume + changedVolume, 0), maxVolume);
private void touchScreenChangeVolume(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: // 按下
touchStartY = event.getY();
touchRangeY = Math.min(screenHeight, screenWidth);
touchCurrVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
// 移除隐藏控制面板消息
handler.removeMessages(HIDE_CONTROLLER);
break;
case MotionEvent.ACTION_MOVE: // 滑动
float moveEndY = event.getY();
float changeDistance = (touchStartY - moveEndY);
float changeVolume = changeDistance / touchRangeY * maxVolume;
if (0 != changeVolume) {
float finalVolume = Math.min(Math.max(0, changeVolume + touchCurrVolume), maxVolume);
updateVolume((int) finalVolume);
}
break;
case MotionEvent.ACTION_UP: // 离开
// 延迟发送隐藏控制面板消息
handler.sendEmptyMessageDelayed(HIDE_CONTROLLER, HIDE_CONTROLLER_DELAY_TIME);
break;
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。