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/uiAlarmAlertActivity (2).txt

237 lines
9.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.

以下是对这段代码每一行的注释:
```java
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
* 版权声明指出代码由The MiCode Open Source Community拥有版权并提供了他们的网址。
*
* Licensed under the Apache License, Version 2.0 (the "License");
* 声明代码遵循Apache License 2.0。
* 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;
// 导入Activity类是Android应用程序的基础类。
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类包含了应用程序的资源。
import net.micode.notes.data.Notes;
// 导入Notes类用于处理笔记数据。
import net.micode.notes.tool.DataUtils;
// 导入DataUtils类提供了数据操作的工具方法。
import java.io.IOException;
// 导入IOException类表示I/O异常。
```
```java
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;
// 定义一个常量,限定预览文本的最大长度。
MediaPlayer mPlayer;
// 定义一个MediaPlayer对象用于播放音频。
@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);
// 获取电源服务。
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);
}
// 设置MediaPlayer的音频流类型。
try {
mPlayer.setDataSource(this, url);
// 设置MediaPlayer的数据源。
mPlayer.prepare();
// 准备MediaPlayer。
mPlayer.setLooping(true);
// 设置MediaPlayer循环播放。
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);
// 创建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) {
// 实现OnClickListener接口的onClick方法。
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) {
// 实现OnDismissListener接口的onDismiss方法。
stopAlarmSound();
// 停止闹钟声音。
finish();
// 结束该Activity。
}
private void stopAlarmSound() {
// 定义一个私有方法来停止闹钟声音。
if (mPlayer != null) {
mPlayer.stop();
// 停止MediaPlayer。
mPlayer.release();
// 释放MediaPlayer资源。
mPlayer = null;
// 将MediaPlayer对象设置为null。
}
}
}
```