diff --git a/src/net/micode/notes/ui/AlarmAlertActivity.java b/src/net/micode/notes/ui/AlarmAlertActivity.java index 7981595..40fc75b 100644 --- a/src/net/micode/notes/ui/AlarmAlertActivity.java +++ b/src/net/micode/notes/ui/AlarmAlertActivity.java @@ -40,119 +40,175 @@ import net.micode.notes.tool.DataUtils; import java.io.IOException; -public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener { - private long mNoteId; // - private String mSnippet; - private static final int SNIPPET_PREW_MAX_LEN = 60; - MediaPlayer mPlayer; - - @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(); - - try { - mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1)); - 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(); - if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) { - showActionDialog(); - playAlarmSound(); - } else { - finish(); - } - } - - private boolean isScreenOn() { - PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); - return pm.isScreenOn(); - } - - private void playAlarmSound() { - Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM); - - 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) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (SecurityException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IllegalStateException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IOException e) { - // TODO Auto-generated catch block - 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.setAction(Intent.ACTION_VIEW); - intent.putExtra(Intent.EXTRA_UID, mNoteId); - startActivity(intent); - break; - default: - break; - } - } - - public void onDismiss(DialogInterface dialog) { - stopAlarmSound(); - finish(); - } - - private void stopAlarmSound() { - if (mPlayer != null) { - mPlayer.stop(); - mPlayer.release(); - mPlayer = null; - } - } +//定义一个名为AlarmAlertActivity的公共类,该类继承了Activity类,同时实现了OnClickListener和OnDismissListener接口。 +public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener { + + // 定义一个私有长整型变量mNoteId,用于存储note的ID。 + private long mNoteId; + + // 定义一个私有字符串变量mSnippet,用于存储note的摘要信息。 + private String mSnippet; + + // 定义一个私有的静态最终整型常量SNIPPET_PREW_MAX_LEN,其值为60,用于限制mSnippet的最大长度。 + private static final int SNIPPET_PREW_MAX_LEN = 60; + + // 定义一个私有MediaPlayer对象mPlayer,用于播放音频。 + MediaPlayer mPlayer; + + // 重写Activity类的onCreate方法,此方法在Activity创建时被系统调用。 + @Override + protected void onCreate(Bundle savedInstanceState) { + // 调用父类的onCreate方法。 + super.onCreate(savedInstanceState); + + // 请求获得窗口特征,此处为去除窗口的标题栏。 + requestWindowFeature(Window.FEATURE_NO_TITLE); + + // 获取当前Activity的窗口对象。 + 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); + } + + // 获取启动当前Activity的Intent对象。 + Intent intent = getIntent(); + + try { + // 尝试从Intent中获取note的ID,并赋值给mNoteId。注意,从Intent中获取的数据路径可能会引发异常。 + mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1)); + // 使用note的ID从ContentResolver中获取note的摘要信息,并赋值给mSnippet。可能会因为ID无效而引发异常。 + mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId); + // 如果摘要信息长度超过预设的最大长度,就截取摘要的前面部分并添加一个提示信息,然后赋值给mSnippet。 + 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; } + + // 创建一个新的MediaPlayer对象。 + mPlayer = new MediaPlayer(); + // 如果note在note数据库中可见,就显示一个操作对话框并播放提示音。否则,结束当前Activity。 if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) { + showActionDialog(); // showActionDialog方法未在代码中定义,可能在其他地方定义或者需要你自己定义。 + playAlarmSound(); // playAlarmSound方法未在代码中定义,可能在其他地方定义或者需要你自己定义。 + } else { // 如果note在数据库中不可见,结束当前Activity。 + finish(); + } + } // @Override注解表示该方法是一个重写的方法,标志着该方法可以被覆盖或重写。 +} // 类定义结束。 + + + +// 定义一个私有方法playAlarmSound,用于播放闹钟声音 +private void playAlarmSound() { + // 使用RingtoneManager获取当前默认的闹钟铃声的URI + Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM); + + // 从系统设置中获取受到静音模式影响的音频流 + 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 { + // 设置MediaPlayer的数据源为前面获取到的闹钟铃声的URI + mPlayer.setDataSource(this, url); + + // 准备MediaPlayer播放 + mPlayer.prepare(); + + // 设置MediaPlayer为循环播放模式 + mPlayer.setLooping(true); + + // 开始播放MediaPlayer + mPlayer.start(); + } catch (IllegalArgumentException e) { + // 如果发生非法参数异常,打印异常堆栈信息 + e.printStackTrace(); + } catch (SecurityException e) { + // 如果发生安全异常,打印异常堆栈信息 + e.printStackTrace(); + } catch (IllegalStateException e) { + // 如果发生非法状态异常,打印异常堆栈信息 + e.printStackTrace(); + } catch (IOException e) { + // 如果发生IO异常,打印异常堆栈信息 + e.printStackTrace(); + } } +//显示操作对话框的方法 +private void showActionDialog() { + // 创建一个AlertDialog.Builder对象,用于构建对话框 + 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: // 如果点击的是取消按钮 + // 创建一个指向NoteEditActivity的Intent + Intent intent = new Intent(this, NoteEditActivity.class); + + // 设置Intent的动作为查看 + intent.setAction(Intent.ACTION_VIEW); + + // 将mNoteId作为额外数据放入Intent中 + intent.putExtra(Intent.EXTRA_UID, mNoteId); + + // 启动NoteEditActivity + startActivity(intent); + break; + default: // 如果点击的是其他按钮,不执行任何操作 + break; + } +} + +//对话框关闭事件处理方法 +public void onDismiss(DialogInterface dialog) { + // 停止闹钟声音播放 + stopAlarmSound(); + + // 结束当前活动 + finish(); +} + +//停止闹钟声音播放的方法 +private void stopAlarmSound() { + // 如果mPlayer不为空,则停止播放,释放资源,并将mPlayer设置为null + if (mPlayer != null) { + mPlayer.stop(); + mPlayer.release(); + mPlayer = null; + } +} \ No newline at end of file