|
|
/*
|
|
|
* 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对象携带的数据的uri,getPathSegments()方法是将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;
|
|
|
}
|
|
|
}/* 非空,停止播放,释放资源,置空*/
|
|
|
}
|