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.
read/AlarmAlertActivity.java

177 lines
8.8 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.

/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.ui;
import android.app.Activity;
import android.app.AlertDialog;
// 导入Android的AlertDialog类, 用于显示警告对话框
import android.content.Context;
// 导入Android的Context类提供应用环境的描述和访问应用资源等
import android.content.DialogInterface;
// 导入Android的DialogInterface类表示对话框的接口
import android.content.DialogInterface.OnClickListener;
// 导入DialogInterface的OnClickListener接口用于处理对话框按钮点击事件
import android.content.DialogInterface.OnDismissListener;
// 导入DialogInterface的OnDismissListener接口用于处理对话框关闭事件
import android.content.Intent;
// 导入Android的Intent类用于在应用组件之间传递信息
import android.media.AudioManager;
// 导入Android的AudioManager类用于管理和控制音频设置
import android.media.MediaPlayer;
// 导入Android的MediaPlayer类用于播放音频文件
import android.media.RingtoneManager;
// 导入Android的RingtoneManager类用于获取系统默认铃声
import android.net.Uri;
// 导入Android的Uri类用于表示统一资源标识符
import android.os.Bundle;
// 导入Android的Bundle类用于传递Activity之间的状态及数据
import android.os.PowerManager;
// 导入Android的PowerManager类用于管理设备的电源状态
import android.provider.Settings;
// 导入Android的Settings类用于访问系统设置
import android.view.Window;
// 导入Android的Window类表示一个窗口的抽象
import android.view.WindowManager;
// 导入Android的WindowManager类用于管理和控制窗口的显示
import net.micode.notes.R;
// 导入应用程序的资源类,通常用于访问字符串、图像等资源
import net.micode.notes.data.Notes;
// 导入应用程序的Notes类表示笔记的数据模型
import net.micode.notes.tool.DataUtils;
// 导入应用程序的DataUtils工具类提供数据处理的实用方法
import java.io.IOException;
// 导入Java的IOException类用于处理输入输出异常
public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener {
// 定义AlarmAlertActivity类继承自Activity并实现了OnClickListener和OnDismissListener接口
private long mNoteId; // 定义一个长整型变量mNoteId用于存储笔记ID
private String mSnippet; // 定义一个字符串变量mSnippet用于存储笔记摘要
private static final int SNIPPET_PREW_MAX_LEN = 60; // 定义常量SNIPPET_PREW_MAX_LEN表示摘要最大长度
MediaPlayer mPlayer; // 定义一个MediaPlayer对象用于播放音频
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // 调用父类的onCreate方法执行Activity创建的基本操作
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)); // 解析笔记ID
mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId); // 从数据库获取笔记摘要
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); // 获取电源管理器实例
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); // 设置MediaPlayer的音频流类型
} else {
mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); // 否则设置为闹钟音频流类型
}
try {
mPlayer.setDataSource(this, url); // 设置MediaPlayer的数据源为闹钟铃声
mPlayer.prepare(); // 准备MediaPlayer
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); // 创建AlertDialog构建器
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用于跳转到笔记编辑Activity
intent.setAction(Intent.ACTION_VIEW); // 设置Intent的操作为查看
intent.putExtra(Intent.EXTRA_UID, mNoteId); // 将笔记ID作为额外数据传递
startActivity(intent); // 启动新的Activity
break;
default:
break; // 默认情况无操作
}
}
public void onDismiss(DialogInterface dialog) { // 对话框关闭时的事件处理
stopAlarmSound(); // 停止闹钟音效
finish(); // 结束该Activity
}
private void stopAlarmSound() { // 方法用于停止播放闹钟声音
if (mPlayer != null) { // 检查MediaPlayer是否不为空
mPlayer.stop(); // 停止播放
mPlayer.release(); // 释放MediaPlayer资源
mPlayer = null; // 将MediaPlayer置为null
}
}
}