@ -39,21 +39,26 @@ import net.micode.notes.tool.DataUtils;
import java.io.IOException ;
import java.io.IOException ;
/ * *
* 闹 钟 提 醒 活 动 类 , 用 于 在 便 签 提 醒 时 间 到 达 时 显 示 提 醒 对 话 框 并 播 放 提 醒 音
* /
public class AlarmAlertActivity extends Activity implements OnClickListener , OnDismissListener {
public class AlarmAlertActivity extends Activity implements OnClickListener , OnDismissListener {
private long mNoteId ;
private long mNoteId ; // 便签ID
private String mSnippet ;
private String mSnippet ; // 便签摘要内容
private static final int SNIPPET_PREW_MAX_LEN = 60 ;
private static final int SNIPPET_PREW_MAX_LEN = 60 ; // 便签摘要最大显示长度
MediaPlayer mPlayer ;
MediaPlayer mPlayer ; // 媒体播放器,用于播放提醒音
@Override
@Override
protected void onCreate ( Bundle savedInstanceState ) {
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState ) ;
super . onCreate ( savedInstanceState ) ;
// 不显示标题栏
requestWindowFeature ( Window . FEATURE_NO_TITLE ) ;
requestWindowFeature ( Window . FEATURE_NO_TITLE ) ;
final Window win = getWindow ( ) ;
final Window win = getWindow ( ) ;
// 即使锁屏也显示窗口
win . addFlags ( WindowManager . LayoutParams . FLAG_SHOW_WHEN_LOCKED ) ;
win . addFlags ( WindowManager . LayoutParams . FLAG_SHOW_WHEN_LOCKED ) ;
// 如果屏幕未点亮,则点亮屏幕并解锁
if ( ! isScreenOn ( ) ) {
if ( ! isScreenOn ( ) ) {
win . addFlags ( WindowManager . LayoutParams . FLAG_KEEP_SCREEN_ON
win . addFlags ( WindowManager . LayoutParams . FLAG_KEEP_SCREEN_ON
| WindowManager . LayoutParams . FLAG_TURN_SCREEN_ON
| WindowManager . LayoutParams . FLAG_TURN_SCREEN_ON
@ -61,77 +66,109 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD
| WindowManager . LayoutParams . FLAG_LAYOUT_INSET_DECOR ) ;
| WindowManager . LayoutParams . FLAG_LAYOUT_INSET_DECOR ) ;
}
}
// 从Intent中获取便签ID和内容
Intent intent = getIntent ( ) ;
Intent intent = getIntent ( ) ;
try {
try {
// 从URI路径中获取便签ID
mNoteId = Long . valueOf ( intent . getData ( ) . getPathSegments ( ) . get ( 1 ) ) ;
mNoteId = Long . valueOf ( intent . getData ( ) . getPathSegments ( ) . get ( 1 ) ) ;
// 获取便签内容摘要
mSnippet = DataUtils . getSnippetById ( this . getContentResolver ( ) , mNoteId ) ;
mSnippet = DataUtils . getSnippetById ( this . getContentResolver ( ) , mNoteId ) ;
// 如果摘要内容过长则截断并添加省略标记
mSnippet = mSnippet . length ( ) > SNIPPET_PREW_MAX_LEN ? mSnippet . substring ( 0 ,
mSnippet = mSnippet . length ( ) > SNIPPET_PREW_MAX_LEN ? mSnippet . substring ( 0 ,
SNIPPET_PREW_MAX_LEN ) + getResources ( ) . getString ( R . string . notelist_string_info )
SNIPPET_PREW_MAX_LEN ) + getResources ( ) . getString ( R . string . notelist_string_info )
: mSnippet ;
: mSnippet ;
} catch ( IllegalArgumentException e ) {
} catch ( IllegalArgumentException e ) {
e . printStackTrace ( ) ;
e . printStackTrace ( ) ;
// 解析失败则关闭活动
return ;
return ;
}
}
// 初始化媒体播放器
mPlayer = new MediaPlayer ( ) ;
mPlayer = new MediaPlayer ( ) ;
// 检查便签是否存在且有效
if ( DataUtils . visibleInNoteDatabase ( getContentResolver ( ) , mNoteId , Notes . TYPE_NOTE ) ) {
if ( DataUtils . visibleInNoteDatabase ( getContentResolver ( ) , mNoteId , Notes . TYPE_NOTE ) ) {
// 显示提醒对话框并播放提醒音
showActionDialog ( ) ;
showActionDialog ( ) ;
playAlarmSound ( ) ;
playAlarmSound ( ) ;
} else {
} else {
// 便签不存在则关闭活动
finish ( ) ;
finish ( ) ;
}
}
}
}
/ * *
* 检 查 屏 幕 是 否 处 于 点 亮 状 态
* @return 屏 幕 点 亮 返 回 true , 否 则 返 回 false
* /
private boolean isScreenOn ( ) {
private boolean isScreenOn ( ) {
PowerManager pm = ( PowerManager ) getSystemService ( Context . POWER_SERVICE ) ;
PowerManager pm = ( PowerManager ) getSystemService ( Context . POWER_SERVICE ) ;
// 判断屏幕是否处于交互状态(点亮)
return pm . isInteractive ( ) ;
return pm . isInteractive ( ) ;
}
}
/ * *
* 播 放 闹 钟 提 醒 音
* /
private void playAlarmSound ( ) {
private void playAlarmSound ( ) {
// 获取系统默认闹钟铃声的URI
Uri url = RingtoneManager . getActualDefaultRingtoneUri ( this , RingtoneManager . TYPE_ALARM ) ;
Uri url = RingtoneManager . getActualDefaultRingtoneUri ( this , RingtoneManager . TYPE_ALARM ) ;
// 获取静音模式下仍受影响的音频流设置
int silentModeStreams = Settings . System . getInt ( getContentResolver ( ) ,
int silentModeStreams = Settings . System . getInt ( getContentResolver ( ) ,
Settings . System . MODE_RINGER_STREAMS_AFFECTED , 0 ) ;
Settings . System . MODE_RINGER_STREAMS_AFFECTED , 0 ) ;
// 设置音频流类型,根据系统设置决定使用哪种音频流
if ( ( silentModeStreams & ( 1 < < AudioManager . STREAM_ALARM ) ) ! = 0 ) {
if ( ( silentModeStreams & ( 1 < < AudioManager . STREAM_ALARM ) ) ! = 0 ) {
mPlayer . setAudioStreamType ( silentModeStreams ) ;
mPlayer . setAudioStreamType ( silentModeStreams ) ;
} else {
} else {
mPlayer . setAudioStreamType ( AudioManager . STREAM_ALARM ) ;
mPlayer . setAudioStreamType ( AudioManager . STREAM_ALARM ) ;
}
}
try {
try {
// 设置铃声数据源并准备播放
mPlayer . setDataSource ( this , url ) ;
mPlayer . setDataSource ( this , url ) ;
mPlayer . prepare ( ) ;
mPlayer . prepare ( ) ;
// 设置为循环播放
mPlayer . setLooping ( true ) ;
mPlayer . setLooping ( true ) ;
// 开始播放
mPlayer . start ( ) ;
mPlayer . start ( ) ;
} catch ( IllegalArgumentException e ) {
} catch ( IllegalArgumentException e ) {
// TODO Auto-generated catch block
e . printStackTrace ( ) ;
e . printStackTrace ( ) ;
} catch ( SecurityException e ) {
} catch ( SecurityException e ) {
// TODO Auto-generated catch block
e . printStackTrace ( ) ;
e . printStackTrace ( ) ;
} catch ( IllegalStateException e ) {
} catch ( IllegalStateException e ) {
// TODO Auto-generated catch block
e . printStackTrace ( ) ;
e . printStackTrace ( ) ;
} catch ( IOException e ) {
} catch ( IOException e ) {
// TODO Auto-generated catch block
e . printStackTrace ( ) ;
e . printStackTrace ( ) ;
}
}
}
}
/ * *
* 显 示 提 醒 操 作 对 话 框
* /
private void showActionDialog ( ) {
private void showActionDialog ( ) {
AlertDialog . Builder dialog = new AlertDialog . Builder ( this ) ;
AlertDialog . Builder dialog = new AlertDialog . Builder ( this ) ;
dialog . setTitle ( R . string . app_name ) ;
dialog . setTitle ( R . string . app_name ) ; // 设置对话框标题为应用名称
dialog . setMessage ( mSnippet ) ;
dialog . setMessage ( mSnippet ) ; // 设置对话框内容为便签摘要
dialog . setPositiveButton ( R . string . notealert_ok , this ) ;
dialog . setPositiveButton ( R . string . notealert_ok , this ) ; // 添加"确定"按钮
// 如果屏幕已点亮,添加"进入"按钮用于查看和编辑便签
if ( isScreenOn ( ) ) {
if ( isScreenOn ( ) ) {
dialog . setNegativeButton ( R . string . notealert_enter , this ) ;
dialog . setNegativeButton ( R . string . notealert_enter , this ) ;
}
}
// 显示对话框并设置关闭监听器
dialog . show ( ) . setOnDismissListener ( this ) ;
dialog . show ( ) . setOnDismissListener ( this ) ;
}
}
/ * *
* 对 话 框 按 钮 点 击 事 件 处 理
* /
public void onClick ( DialogInterface dialog , int which ) {
public void onClick ( DialogInterface dialog , int which ) {
// 处理"进入"按钮点击事件
if ( which = = DialogInterface . BUTTON_NEGATIVE ) {
if ( which = = DialogInterface . BUTTON_NEGATIVE ) {
// 启动便签编辑界面,查看该便签详情
Intent intent = new Intent ( this , NoteEditActivity . class ) ;
Intent intent = new Intent ( this , NoteEditActivity . class ) ;
intent . setAction ( Intent . ACTION_VIEW ) ;
intent . setAction ( Intent . ACTION_VIEW ) ;
intent . putExtra ( Intent . EXTRA_UID , mNoteId ) ;
intent . putExtra ( Intent . EXTRA_UID , mNoteId ) ;
@ -139,14 +176,23 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD
}
}
}
}
/ * *
* 对 话 框 关 闭 事 件 处 理
* /
public void onDismiss ( DialogInterface dialog ) {
public void onDismiss ( DialogInterface dialog ) {
// 停止播放提醒音并关闭活动
stopAlarmSound ( ) ;
stopAlarmSound ( ) ;
finish ( ) ;
finish ( ) ;
}
}
/ * *
* 停 止 播 放 提 醒 音 并 释 放 资 源
* /
private void stopAlarmSound ( ) {
private void stopAlarmSound ( ) {
if ( mPlayer ! = null ) {
if ( mPlayer ! = null ) {
// 停止播放
mPlayer . stop ( ) ;
mPlayer . stop ( ) ;
// 释放媒体播放器资源
mPlayer . release ( ) ;
mPlayer . release ( ) ;
mPlayer = null ;
mPlayer = null ;
}
}