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.
gitProject1/doc/向金成——精读代码/ui/AlarmAlertActivity.java

239 lines
11 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;/*
导入android包下的app子包里的Activity类该类是activity组件的父类
*/
import android.app.AlertDialog;/*
导入android包下的app子包里的AlertDialog类该类是实现界面警告对话框提示框
*/
import android.content.Context;/*
导入android包下的content子包里的Context类该类为抽象类是所有组件的父类一个实例组件即一个context对象
*/
import android.content.DialogInterface;/*
导入android包下的content子包里的DialogInterface接口是Dialog的接口
*/
import android.content.DialogInterface.OnClickListener;/*
导入android包下的content子包里的DialogInterface接口的子接口OnClickListener该接口是用于监听用户点击事件的
*/
import android.content.DialogInterface.OnDismissListener;/*
导入android包下的content子包里的DialogInterface接口的子接口OnDismissListener该接口是监听用户取消对话框事件的
*/
import android.content.Intent;/*
导入Intent类该类是intent对象的父类
*/
import android.media.AudioManager;/*
导入android包里的子包media里的AudioManager类该类是手机的音频管理器可以控制手机的声音、震动
*/
import android.media.MediaPlayer;/*
导入多媒体包里的多媒体播放器类MediaPlayer用于播放音频、视频等
*/
import android.media.RingtoneManager;/*
导入多媒体包里的RingtoneManager类该类是铃声管理器
*/
import android.net.Uri;/*
导入net包里的Uri抽象类uri可以代表任何要操作的资源数据
*/
import android.os.Bundle;/*
导入os包里的Bundle类该类用于在activity类之间通过intent传递数据待传递的数据以键值对形式组合包含于bundle对象bundle对象又包含
于intent对象里
*/
import android.os.PowerManager;/*
导入os包里的PowerManager类该类是电源管理器
*/
import android.provider.Settings;/*
导入Settings类该类提供系统的设置等等
*/
import android.view.Window;/*
导入Window类该类是窗口是view树的载体是view的管理者
*/
import android.view.WindowManager;/*
导入该接口,该接口是窗口管理器
*/
import net.micode.notes.R;/*
导入软件包的R类该类是自动生成的包含应用的资源id与资源引用有关
*/
import net.micode.notes.data.Notes;/*
导入net.micode.notes包里的子包data里的Notes类
*/
import net.micode.notes.tool.DataUtils;/*
导入net.micode.notes包里的子包tool里的DataUtils类
*/
import java.io.IOException;/*
导入java io包的IOException类输入输出检查异常类
*/
public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener {
/* 该类是activity类继承自Activity父类实现可视化界面且实现了OnClickListener, OnDismissListener接口
可以监听用户点击,取消事件*/
private long mNoteId; //便签id变量
private String mSnippet;//字符串变量
private static final int SNIPPET_PREW_MAX_LEN = 60;//静态不可修改的整形变量
MediaPlayer mPlayer;//定义了一个MediaPlaye变量
@Override
protected void onCreate(Bundle savedInstanceState) {/*
onCreate方法是对父类的方法的重写用于初始化activity对即界面参数是bundle对象传递数据的
*/
super.onCreate(savedInstanceState);/*
调用父类方法,初始化界面,绘制初始界面的,必须调用
*/
requestWindowFeature(Window.FEATURE_NO_TITLE);/*
该方法用于设置窗口的特征当前参数的window类的变量设置当前窗口无标题
*/
final Window win = getWindow();/*
getWindow方法 获得当前界面的窗口对象,不可修改值
*/
win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);/*
该方法用于向window对象增加flags显示逻辑flags是windowManager类里的内部类LayoutParams的变量。
当前逻辑是锁屏时显示
*/
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);
/* 屏幕不亮时增加新的flags显示逻辑*/
}
Intent intent = getIntent();/*
通过getIntent方法 获得当前界面接受到的intent对象
*/
try {
mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1));/*
getData方法是获得intent对象携带的数据的urigetPathSegments()方法是将uri的第一个/的右部分转化为字符串类型的list
该语句作用为将接受到的intent对象的便签id数据赋值到mNoteId变量
*/
mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId);/*
调用DataUtils类里的getSnippetById方法给mSnippet赋值getContentResolver用于获得当前activity界面的内容
解析器contentResolver用于对其他activity共享的内容进行解析内容解析器有增删改查等方法对数据操作
*/
mSnippet = mSnippet.length() > SNIPPET_PREW_MAX_LEN ? mSnippet.substring(0,
SNIPPET_PREW_MAX_LEN) + getResources().getString(R.string.notelist_string_info)/*
getResources()方法 获得Resources对象用于引用资源getString资源id方法 通过资源id引用字符串资源
R.string.notelist_string_info 获得名为notelist_string_info的字符串的id
*/
: mSnippet;
} catch (IllegalArgumentException e) {
e.printStackTrace();
return;
}
mPlayer = new MediaPlayer();//实例化MediaPlayer类
if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) {
/* 判断便签是否在便签数据库里,在则显示对话框,播放闹钟声音*/
showActionDialog();
playAlarmSound();
} else {
finish();//关闭该activity打开的一切资源finish后调用onDestory销毁该activity
}
}
private boolean isScreenOn() {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);/*
getSystemService方法用于获得系统服务比如当前是获得系统的电源管理器通过context的字符串变量调用,再强制转化为owerManager
*/
return pm.isScreenOn();//判断屏幕是否亮
}
private void playAlarmSound() {
Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM);/*
调用铃声管理器的getActualDefaultRingtoneUri方法获得安卓默认的铃声资源URI
*/
int silentModeStreams = Settings.System.getInt(getContentResolver(),
Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0);/*
getInt方法是获得系统设置中某些设置的值比如当前是获得闹钟铃声音量的大小
*/
if ((silentModeStreams & (1 << AudioManager.STREAM_ALARM)) != 0) {
mPlayer.setAudioStreamType(silentModeStreams);/*
设置音量流类型
*/
} else {
mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
}
try {
mPlayer.setDataSource(this, url);//设置播放的多媒体资源URI
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);/*
AlertDialog类的构造方法受保护只能通过内部类builder的构造方法来创建对话框
*/
dialog.setTitle(R.string.app_name);//设置对话框标题
dialog.setMessage(mSnippet);//设置对话框内容
dialog.setPositiveButton(R.string.notealert_ok, this);//设置响应一般YES的按钮按钮的标题为参数
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://如果用户点击negative按钮
Intent intent = new Intent(this, NoteEditActivity.class);/*
创建一个显示intent指定接受的组件为NoteEditActivity类
*/
intent.setAction(Intent.ACTION_VIEW);//设置intent的action接受的activity显示数据
intent.putExtra(Intent.EXTRA_UID, mNoteId);//设置activity响应操作所需的额外的数据是键值对
startActivity(intent);//将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;
}
}/* 非空,停止播放,释放资源,置空*/
}