You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
5MI/AlarmAlertActivity (2).java

147 lines
7.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// 引入必要的包和类
package net.micode.notes.ui;
import android.app.Activity; // 引入Activity类它是应用程序中用于与用户交互的单个屏幕
import android.app.AlertDialog; // 引入AlertDialog类用于显示对话框
import android.content.Context; // 引入Context类它表示应用环境的全局信息
import android.content.DialogInterface; // 引入DialogInterface类它是对话框的接口
import android.content.DialogInterface.OnClickListener; // 引入OnClickListener接口用于监听对话框按钮点击事件
import android.content.DialogInterface.OnDismissListener; // 引入OnDismissListener接口用于监听对话框消失事件
import android.content.Intent; // 引入Intent类它表示一个要执行的动作
import android.media.AudioManager; // 引入AudioManager类用于管理音频播放
import android.media.MediaPlayer; // 引入MediaPlayer类用于播放音频和视频
import android.media.RingtoneManager; // 引入RingtoneManager类用于访问设备上的铃声
import android.net.Uri; // 引入Uri类用于表示统一资源标识符
import android.os.Bundle; // 引入Bundle类用于传递数据
import android.os.PowerManager; // 引入PowerManager类用于控制电源状态
import android.provider.Settings; // 引入Settings类用于访问系统设置
import android.view.Window; // 引入Window类用于控制窗口的属性
import android.view.WindowManager; // 引入WindowManager类用于管理窗口
import net.micode.notes.R; // 引入R类它包含了应用程序的资源ID
import net.micode.notes.data.Notes; // 引入Notes类可能用于表示笔记数据
import net.micode.notes.tool.DataUtils; // 引入DataUtils类可能包含一些数据处理的工具方法
import java.io.IOException; // 引入IOException类表示输入输出异常
// 定义一个继承自Activity的类并实现OnClickListener和OnDismissListener接口
public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener {
private long mNoteId; // 用于存储笔记的ID
private String mSnippet; // 用于存储笔记的摘要
private static final int SNIPPET_PREW_MAX_LEN = 60; // 定义摘要的最大长度
MediaPlayer mPlayer; // MediaPlayer实例用于播放声音
// 当Activity创建时调用此方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE); // 请求窗口没有标题
final Window win = getWindow(); // 获取当前窗口
win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); // 添加标志,允许在锁屏时显示窗口
if (!isScreenOn()) { // 如果屏幕当前未点亮
win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON
| WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR); // 添加多个标志,保持屏幕常亮、点亮屏幕等
}
Intent intent = getIntent(); // 获取启动此Activity的Intent
try {
mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1)); // 从Intent中获取笔记ID
mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId); // 通过ID获取笔记摘要
// 如果摘要长度超过最大长度,则截取并添加省略号
mSnippet = mSnippet.length() > SNIPPET_PREW_MAX_LEN ? mSnippet.substring(0, SNIPPET_PREW_MAX_LEN) + getResources().getString(R.string.notelist_string_info) : mSnippet;
} catch (IllegalArgumentException e) {
e.printStackTrace(); // 捕获异常并打印堆栈跟踪
return; // 退出方法
}
mPlayer = new MediaPlayer(); // 创建MediaPlayer实例
// 如果笔记在数据库中可见且类型为笔记,则显示操作对话框并播放声音
if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) {
showActionDialog();
playAlarmSound();
} else {
finish(); // 退出Activity
}
}
// 检查屏幕是否点亮
private boolean isScreenOn() {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); // 获取PowerManager实例
return pm.isScreenOn(); // 返回屏幕是否点亮的布尔值
}
// 播放声音
private void playAlarmSound() {
Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM); // 获取默认的闹钟铃声URI
// 获取静音模式下受影响的音频流类型
int silentModeStreams = Settings.System.getInt(getContentResolver(), Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0);
// 根据静音模式设置音频流类型
if ((silentModeStreams & (1 << AudioManager.STREAM_ALARM)) != 0) {
mPlayer.setAudioStreamType(silentModeStreams);
} else {
mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
}
try {
mPlayer.setDataSource(this, url); // 设置音频数据源
mPlayer.prepare(); // 准备播放
mPlayer.setLooping(true); // 设置循环播放
mPlayer.start(); // 开始播放
} catch (IllegalArgumentException e) {
e.printStackTrace(); // 捕获异常并打印堆栈跟踪
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// 显示操作对话框
private void showActionDialog() {
AlertDialog.Builder dialog = new AlertDialog.Builder(this); // 创建对话框构建器
dialog.setTitle(R.string.app_name); // 设置对话框标题
dialog.setMessage(mSnippet); // 设置对话框消息
dialog.setPositiveButton(R.string.notealert_ok, this); // 设置确定按钮及其点击事件监听器
if (isScreenOn()) { // 如果屏幕点亮
dialog.setNegativeButton(R.string.notealert_enter, this); // 设置取消按钮及其点击事件监听器
}
dialog.show().setOnDismissListener(this); // 显示对话框并设置消失事件监听器
}
// 当对话框按钮被点击时调用此方法
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case DialogInterface.BUTTON_NEGATIVE: // 如果点击的是取消按钮
Intent intent = new Intent(this, NoteEditActivity.class); // 创建Intent用于启动NoteEditActivity
intent.setAction(Intent.ACTION_VIEW); // 设置Intent动作为查看
intent.putExtra(Intent.EXTRA_UID, mNoteId); // 将笔记ID作为额外数据传递给NoteEditActivity
startActivity(intent); // 启动NoteEditActivity
break;
default:
break;
}
}
// 当对话框消失时调用此方法
public void onDismiss(DialogInterface dialog) {
stopAlarmSound(); // 停止播放声音
finish(); // 退出Activity
}
// 停止播放声音
private void stopAlarmSound() {
if (mPlayer != null) {
mPlayer.stop(); // 停止播放
mPlayer.release(); // 释放资源
mPlayer = null; // 将MediaPlayer实例置为null
}
}
}