/* * 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; } }/* 非空,停止播放,释放资源,置空*/ }