Android闹钟最终版【android源码闹钟解析】

本文详细解析了一个复杂的闹钟应用程序,介绍了其核心组件如AudioManager和TelephonyManager的作用,以及如何通过广播启动AlarmKlaxon服务。此外还分享了如何处理ListView中的Checkbox点击事件,并提供了主要入口类DeskClockMainActivity的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我以前写了个复杂闹钟的demo,参见 Android闹钟【复杂版】【大明进化十五】 . 但是里面的bug有一些,好多人留言,所以我就看看源码,找找原因?顺便把源码代码整理出来,弄成一个完整的可以运行的apk,今天上午就整理了一下,才发现,源码处理的逻辑多一些,考虑的情况多,比如开机后接收一个广播,然后从数据库中取时间和当前时间对比,设置闹钟,当时区改变了,也会发送广播,对闹钟进行设置的。

转载请标明出处:http://blog.youkuaiyun.com/wdaming1986/article/details/7461043

有人问我:“当设置一个闹钟后,然后调系统时间超过设置的闹钟的时间,这时候闹钟响了??”

通过源码,我发现这种情况是正常的。不是bug。可以理解。

以下是我发现的几点闹钟中重要的点,分享一下:

(1)在闹钟中有AudioManager管理机制,这个机制可以申请和释放OnAudioFocusChangeListener监听。

还有mTelephonyManager对象,处理在闹钟响的时候,来电铃声的切换。

(2)广播接收闹钟,通过广播启动AlarmKlaxon这个Service,隐式启动service:

public static final String ALARM_INTENT_EXTRA = "intent.extra.alarm";

  1. // Play the alarm alert and vibrate the device.
  2. Intent playAlarm = new Intent(Alarms.ALARM_ALERT_ACTION);
  3. playAlarm.putExtra(Alarms.ALARM_INTENT_EXTRA, alarm);
  4. context.startService(playAlarm);
// Play the alarm alert and vibrate the device.
        Intent playAlarm = new Intent(Alarms.ALARM_ALERT_ACTION);
        playAlarm.putExtra(Alarms.ALARM_INTENT_EXTRA, alarm);
        context.startService(playAlarm);

在mainfest中,AlarmKlaxon这个服务的定义如下:

  1. <service android:name="AlarmKlaxon"
  2. android:description="@string/alarm_klaxon_service_desc"
  3. >
  4. <intent-filter>
  5. <action android:name="com.cn.daming.deskclock.ALARM_ALERT" />
  6. </intent-filter>
  7. </service>
<service android:name="AlarmKlaxon"
                android:description="@string/alarm_klaxon_service_desc"
                >
            <intent-filter>
                <action android:name="com.cn.daming.deskclock.ALARM_ALERT" />
            </intent-filter>
        </service>

这个service做的是允许别的Activity打断正在响铃的铃声,播放其他的铃声,例如,闹钟响的时候来电话了。

(3)在listview中包含checkbox,这时候闹钟的处理时,activity实现一个OnItemClickListener的监听,点击每一项的监听。然后在checkbox单独拿出去写一个类,继承LinearLayout,重写setPressed()这个方法,以实现“当点击checkbox的时候不触发parent的click事件”。关键代码如下:

  1. <SPAN style="FONT-SIZE: 18px"> @Override
  2. public void setPressed(boolean pressed) {
  3. // If the parent is pressed, do not set to pressed.
  4. if (pressed && ((View) getParent()).isPressed()) {
  5. return;
  6. }
  7. super.setPressed(pressed);
  8. }</SPAN>
 @Override
    public void setPressed(boolean pressed) {
        // If the parent is pressed, do not set to pressed.
        if (pressed && ((View) getParent()).isPressed()) {
            return;
        }
        super.setPressed(pressed);
    }

下面看看我的程序截图:

红色圈的图标为我的闹钟。 点击“玲闹钟”后的界面

点击新建闹钟出现的界面 设置好时间弹出的toast。

下面我把我的主要入口类的代码贴出来

DeskClockMainActivity.java

  1. <SPAN style="FONT-SIZE: 18px">package com.cn.daming.deskclock;
  2. import java.util.Calendar;
  3. import android.app.Activity;
  4. import android.app.AlertDialog;
  5. import android.content.Context;
  6. import android.content.DialogInterface;
  7. import android.content.Intent;
  8. import android.content.SharedPreferences;
  9. import android.database.Cursor;
  10. import android.graphics.Typeface;
  11. import android.os.Bundle;
  12. import android.view.LayoutInflater;
  13. import android.view.Menu;
  14. import android.view.MenuItem;
  15. import android.view.View;
  16. import android.view.ContextMenu;
  17. import android.view.ContextMenu.ContextMenuInfo;
  18. import android.view.View.OnClickListener;
  19. import android.view.ViewGroup;
  20. import android.widget.AdapterView;
  21. import android.widget.AdapterView.AdapterContextMenuInfo;
  22. import android.widget.AdapterView.OnItemClickListener;
  23. import android.widget.CheckBox;
  24. import android.widget.CursorAdapter;
  25. import android.widget.ImageButton;
  26. import android.widget.ImageView;
  27. import android.widget.ListView;
  28. import android.widget.TextView;
  29. public class DeskClockMainActivity extends Activity implements OnItemClickListener{
  30. static final String PREFERENCES = "AlarmClock";
  31. /** This must be false for production. If true, turns on logging,
  32. test code, etc. */
  33. static final boolean DEBUG = false;
  34. private SharedPreferences mPrefs;
  35. private LayoutInflater mFactory;
  36. private ListView mAlarmsList;
  37. private Cursor mCursor;
  38. @Override
  39. public void onCreate(Bundle savedInstanceState) {
  40. super.onCreate(savedInstanceState);
  41. //取自定义布局的LayoutInflater
  42. mFactory = LayoutInflater.from(this);
  43. //取getSharedPreferences中key==“AlarmClock”的值
  44. mPrefs = getSharedPreferences(PREFERENCES, 0);
  45. //获取闹钟的cursor
  46. mCursor = Alarms.getAlarmsCursor(getContentResolver());
  47. //更新布局界面
  48. updateLayout();
  49. }
  50. //加载更新界面布局
  51. private void updateLayout() {
  52. setContentView(R.layout.alarm_clock);
  53. mAlarmsList = (ListView) findViewById(R.id.alarms_list);
  54. AlarmTimeAdapter adapter = new AlarmTimeAdapter(this, mCursor);
  55. mAlarmsList.setAdapter(adapter);
  56. mAlarmsList.setVerticalScrollBarEnabled(true);
  57. mAlarmsList.setOnItemClickListener(this);
  58. mAlarmsList.setOnCreateContextMenuListener(this);
  59. View addAlarm = findViewById(R.id.add_alarm);
  60. addAlarm.setOnClickListener(new View.OnClickListener() {
  61. public void onClick(View v) {
  62. addNewAlarm();
  63. }
  64. });
  65. // Make the entire view selected when focused.
  66. addAlarm.setOnFocusChangeListener(new View.OnFocusChangeListener() {
  67. public void onFocusChange(View v, boolean hasFocus) {
  68. v.setSelected(hasFocus);
  69. }
  70. });
  71. ImageButton deskClock =
  72. (ImageButton) findViewById(R.id.desk_clock_button);
  73. deskClock.setOnClickListener(new View.OnClickListener() {
  74. public void onClick(View v) {
  75. }
  76. });
  77. }
  78. private void addNewAlarm() {
  79. startActivity(new Intent(this, SetAlarm.class));
  80. }
  81. /**
  82. * listview的适配器继承CursorAdapter
  83. * @author wangxianming
  84. * 也可以使用BaseAdapter
  85. */
  86. private class AlarmTimeAdapter extends CursorAdapter {
  87. public AlarmTimeAdapter(Context context, Cursor cursor) {
  88. super(context, cursor);
  89. }
  90. public View newView(Context context, Cursor cursor, ViewGroup parent) {
  91. View ret = mFactory.inflate(R.layout.alarm_time, parent, false);
  92. DigitalClock digitalClock =
  93. (DigitalClock) ret.findViewById(R.id.digitalClock);
  94. digitalClock.setLive(false);
  95. return ret;
  96. }
  97. //把view绑定cursor的每一项
  98. public void bindView(View view, Context context, Cursor cursor) {
  99. final Alarm alarm = new Alarm(cursor);
  100. View indicator = view.findViewById(R.id.indicator);
  101. // Set the initial resource for the bar image.
  102. final ImageView barOnOff =
  103. (ImageView) indicator.findViewById(R.id.bar_onoff);
  104. barOnOff.setImageResource(alarm.enabled ?
  105. R.drawable.ic_indicator_on : R.drawable.ic_indicator_off);
  106. // Set the initial state of the clock "checkbox"
  107. final CheckBox clockOnOff =
  108. (CheckBox) indicator.findViewById(R.id.clock_onoff);
  109. clockOnOff.setChecked(alarm.enabled);
  110. // Clicking outside the "checkbox" should also change the state.
  111. //对checkbox设置监听,使里外一致
  112. indicator.setOnClickListener(new OnClickListener() {
  113. public void onClick(View v) {
  114. clockOnOff.toggle();
  115. updateIndicatorAndAlarm(clockOnOff.isChecked(),
  116. barOnOff, alarm);
  117. }
  118. });
  119. DigitalClock digitalClock =
  120. (DigitalClock) view.findViewById(R.id.digitalClock);
  121. // set the alarm text
  122. final Calendar c = Calendar.getInstance();
  123. c.set(Calendar.HOUR_OF_DAY, alarm.hour);
  124. c.set(Calendar.MINUTE, alarm.minutes);
  125. digitalClock.updateTime(c);
  126. digitalClock.setTypeface(Typeface.DEFAULT);
  127. // Set the repeat text or leave it blank if it does not repeat.
  128. TextView daysOfWeekView =
  129. (TextView) digitalClock.findViewById(R.id.daysOfWeek);
  130. final String daysOfWeekStr =
  131. alarm.daysOfWeek.toString(DeskClockMainActivity.this, false);
  132. if (daysOfWeekStr != null && daysOfWeekStr.length() != 0) {
  133. daysOfWeekView.setText(daysOfWeekStr);
  134. daysOfWeekView.setVisibility(View.VISIBLE);
  135. } else {
  136. daysOfWeekView.setVisibility(View.GONE);
  137. }
  138. // Display the label
  139. TextView labelView =
  140. (TextView) view.findViewById(R.id.label);
  141. if (alarm.label != null && alarm.label.length() != 0) {
  142. labelView.setText(alarm.label);
  143. labelView.setVisibility(View.VISIBLE);
  144. } else {
  145. labelView.setVisibility(View.GONE);
  146. }
  147. }
  148. };
  149. //更新checkbox
  150. private void updateIndicatorAndAlarm(boolean enabled, ImageView bar,
  151. Alarm alarm) {
  152. bar.setImageResource(enabled ? R.drawable.ic_indicator_on
  153. : R.drawable.ic_indicator_off);
  154. Alarms.enableAlarm(this, alarm.id, enabled);
  155. if (enabled) {
  156. SetAlarm.popAlarmSetToast(this, alarm.hour, alarm.minutes,
  157. alarm.daysOfWeek);
  158. }
  159. }
  160. /*
  161. * (non-Javadoc)
  162. * @see android.app.Activity#onContextItemSelected(android.view.MenuItem)
  163. * 创建上下文菜单
  164. */
  165. @Override
  166. public boolean onContextItemSelected(final MenuItem item) {
  167. final AdapterContextMenuInfo info =
  168. (AdapterContextMenuInfo) item.getMenuInfo();
  169. final int id = (int) info.id;
  170. // Error check just in case.
  171. if (id == -1) {
  172. return super.onContextItemSelected(item);
  173. }
  174. switch (item.getItemId()) {
  175. case R.id.delete_alarm:
  176. // Confirm that the alarm will be deleted.
  177. new AlertDialog.Builder(this)
  178. .setTitle(getString(R.string.delete_alarm))
  179. .setMessage(getString(R.string.delete_alarm_confirm))
  180. .setPositiveButton(android.R.string.ok,
  181. new DialogInterface.OnClickListener() {
  182. public void onClick(DialogInterface d,
  183. int w) {
  184. Alarms.deleteAlarm(DeskClockMainActivity.this, id);
  185. }
  186. })
  187. .setNegativeButton(android.R.string.cancel, null)
  188. .show();
  189. return true;
  190. case R.id.enable_alarm:
  191. final Cursor c = (Cursor) mAlarmsList.getAdapter()
  192. .getItem(info.position);
  193. final Alarm alarm = new Alarm(c);
  194. Alarms.enableAlarm(this, alarm.id, !alarm.enabled);
  195. if (!alarm.enabled) {
  196. SetAlarm.popAlarmSetToast(this, alarm.hour, alarm.minutes,
  197. alarm.daysOfWeek);
  198. }
  199. return true;
  200. case R.id.edit_alarm:
  201. Intent intent = new Intent(this, SetAlarm.class);
  202. intent.putExtra(Alarms.ALARM_ID, id);
  203. startActivity(intent);
  204. return true;
  205. default:
  206. break;
  207. }
  208. return super.onContextItemSelected(item);
  209. }
  210. /*
  211. * (non-Javadoc)
  212. * @see android.app.Activity#onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo)
  213. * 创建菜单
  214. */
  215. @Override
  216. public void onCreateContextMenu(ContextMenu menu, View view,
  217. ContextMenuInfo menuInfo) {
  218. // Inflate the menu from xml.
  219. getMenuInflater().inflate(R.menu.context_menu, menu);
  220. // Use the current item to create a custom view for the header.
  221. final AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
  222. final Cursor c =
  223. (Cursor) mAlarmsList.getAdapter().getItem((int) info.position);
  224. final Alarm alarm = new Alarm(c);
  225. // Construct the Calendar to compute the time.
  226. final Calendar cal = Calendar.getInstance();
  227. cal.set(Calendar.HOUR_OF_DAY, alarm.hour);
  228. cal.set(Calendar.MINUTE, alarm.minutes);
  229. final String time = Alarms.formatTime(this, cal);
  230. // Inflate the custom view and set each TextView's text.
  231. final View v = mFactory.inflate(R.layout.context_menu_header, null);
  232. TextView textView = (TextView) v.findViewById(R.id.header_time);
  233. textView.setText(time);
  234. textView = (TextView) v.findViewById(R.id.header_label);
  235. textView.setText(alarm.label);
  236. // Set the custom view on the menu.
  237. menu.setHeaderView(v);
  238. // Change the text based on the state of the alarm.
  239. if (alarm.enabled) {
  240. menu.findItem(R.id.enable_alarm).setTitle(R.string.disable_alarm);
  241. }
  242. }
  243. /*
  244. * (non-Javadoc)
  245. * @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem)
  246. * 设置菜单的点击事件的处理
  247. */
  248. @Override
  249. public boolean onOptionsItemSelected(MenuItem item) {
  250. switch (item.getItemId()) {
  251. case R.id.menu_item_settings:
  252. startActivity(new Intent(this, SettingsActivity.class));
  253. return true;
  254. case R.id.menu_item_desk_clock:
  255. //modify by wangxianming in 2012-4-14
  256. // startActivity(new Intent(this, DeskClock.class));
  257. return true;
  258. case R.id.menu_item_add_alarm:
  259. addNewAlarm();
  260. return true;
  261. default:
  262. break;
  263. }
  264. return super.onOptionsItemSelected(item);
  265. }
  266. /*
  267. * (non-Javadoc)
  268. * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu)
  269. * 创建菜单
  270. */
  271. @Override
  272. public boolean onCreateOptionsMenu(Menu menu) {
  273. getMenuInflater().inflate(R.menu.alarm_list_menu, menu);
  274. return super.onCreateOptionsMenu(menu);
  275. }
  276. /*
  277. * (non-Javadoc)
  278. * @see android.widget.AdapterView.OnItemClickListener#onItemClick(android.widget.AdapterView, android.view.View, int, long)
  279. * 创建菜单的点击事件响应
  280. */
  281. public void onItemClick(AdapterView<?> adapterView, View v, int pos, long id) {
  282. Intent intent = new Intent(this, SetAlarm.class);
  283. intent.putExtra(Alarms.ALARM_ID, (int) id);
  284. startActivity(intent);
  285. }
  286. @Override
  287. protected void onDestroy() {
  288. super.onDestroy();
  289. ToastMaster.cancelToast();
  290. mCursor.close();
  291. }
  292. }</SPAN>
package com.cn.daming.deskclock;

import java.util.Calendar;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.CheckBox;
import android.widget.CursorAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class DeskClockMainActivity extends Activity implements OnItemClickListener{
	
    static final String PREFERENCES = "AlarmClock";

    /** This must be false for production.  If true, turns on logging,
        test code, etc. */
    static final boolean DEBUG = false;

    private SharedPreferences mPrefs;
    private LayoutInflater mFactory;
    private ListView mAlarmsList;
    private Cursor mCursor;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        //取自定义布局的LayoutInflater
        mFactory = LayoutInflater.from(this);
        //取getSharedPreferences中key==“AlarmClock”的值
        mPrefs = getSharedPreferences(PREFERENCES, 0);
        //获取闹钟的cursor
        mCursor = Alarms.getAlarmsCursor(getContentResolver());
        
        //更新布局界面
        updateLayout();

    }
    
    //加载更新界面布局
    private void updateLayout() {
    	setContentView(R.layout.alarm_clock);
        mAlarmsList = (ListView) findViewById(R.id.alarms_list);
        AlarmTimeAdapter adapter = new AlarmTimeAdapter(this, mCursor);
        mAlarmsList.setAdapter(adapter);
        mAlarmsList.setVerticalScrollBarEnabled(true);
        mAlarmsList.setOnItemClickListener(this);
        mAlarmsList.setOnCreateContextMenuListener(this);

        View addAlarm = findViewById(R.id.add_alarm);
        addAlarm.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    addNewAlarm();
                }
            });
        // Make the entire view selected when focused.
        addAlarm.setOnFocusChangeListener(new View.OnFocusChangeListener() {
                public void onFocusChange(View v, boolean hasFocus) {
                    v.setSelected(hasFocus);
                }
        });

        ImageButton deskClock =
                (ImageButton) findViewById(R.id.desk_clock_button);
        deskClock.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    
                }
        });
    }
    
    private void addNewAlarm() {
        startActivity(new Intent(this, SetAlarm.class));
    }
    
    /**
     * listview的适配器继承CursorAdapter
     * @author wangxianming
     * 也可以使用BaseAdapter
     */
    private class AlarmTimeAdapter extends CursorAdapter {
        public AlarmTimeAdapter(Context context, Cursor cursor) {
            super(context, cursor);
        }

        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            View ret = mFactory.inflate(R.layout.alarm_time, parent, false);

            DigitalClock digitalClock =
                    (DigitalClock) ret.findViewById(R.id.digitalClock);
            digitalClock.setLive(false);
            return ret;
        }

        //把view绑定cursor的每一项
        public void bindView(View view, Context context, Cursor cursor) {
            final Alarm alarm = new Alarm(cursor);

            View indicator = view.findViewById(R.id.indicator);

            // Set the initial resource for the bar image.
            final ImageView barOnOff =
                    (ImageView) indicator.findViewById(R.id.bar_onoff);
            barOnOff.setImageResource(alarm.enabled ?
                    R.drawable.ic_indicator_on : R.drawable.ic_indicator_off);

            // Set the initial state of the clock "checkbox"
            final CheckBox clockOnOff =
                    (CheckBox) indicator.findViewById(R.id.clock_onoff);
            clockOnOff.setChecked(alarm.enabled);

            // Clicking outside the "checkbox" should also change the state.
            //对checkbox设置监听,使里外一致
            indicator.setOnClickListener(new OnClickListener() {
                    public void onClick(View v) {
                        clockOnOff.toggle();
                        updateIndicatorAndAlarm(clockOnOff.isChecked(),
                                barOnOff, alarm);
                    }
            });

            DigitalClock digitalClock =
                    (DigitalClock) view.findViewById(R.id.digitalClock);

            // set the alarm text
            final Calendar c = Calendar.getInstance();
            c.set(Calendar.HOUR_OF_DAY, alarm.hour);
            c.set(Calendar.MINUTE, alarm.minutes);
            digitalClock.updateTime(c);
            digitalClock.setTypeface(Typeface.DEFAULT);

            // Set the repeat text or leave it blank if it does not repeat.
            TextView daysOfWeekView =
                    (TextView) digitalClock.findViewById(R.id.daysOfWeek);
            final String daysOfWeekStr =
                    alarm.daysOfWeek.toString(DeskClockMainActivity.this, false);
            if (daysOfWeekStr != null && daysOfWeekStr.length() != 0) {
                daysOfWeekView.setText(daysOfWeekStr);
                daysOfWeekView.setVisibility(View.VISIBLE);
            } else {
                daysOfWeekView.setVisibility(View.GONE);
            }

            // Display the label
            TextView labelView =
                    (TextView) view.findViewById(R.id.label);
            if (alarm.label != null && alarm.label.length() != 0) {
                labelView.setText(alarm.label);
                labelView.setVisibility(View.VISIBLE);
            } else {
                labelView.setVisibility(View.GONE);
            }
        }
    };
    
    //更新checkbox
    private void updateIndicatorAndAlarm(boolean enabled, ImageView bar,
            Alarm alarm) {
        bar.setImageResource(enabled ? R.drawable.ic_indicator_on
                : R.drawable.ic_indicator_off);
        Alarms.enableAlarm(this, alarm.id, enabled);
        if (enabled) {
            SetAlarm.popAlarmSetToast(this, alarm.hour, alarm.minutes,
                    alarm.daysOfWeek);
        }
    }
    
    /*
     * (non-Javadoc)
     * @see android.app.Activity#onContextItemSelected(android.view.MenuItem)
     * 创建上下文菜单
     */
    @Override
    public boolean onContextItemSelected(final MenuItem item) {
        final AdapterContextMenuInfo info =
                (AdapterContextMenuInfo) item.getMenuInfo();
        final int id = (int) info.id;
        // Error check just in case.
        if (id == -1) {
            return super.onContextItemSelected(item);
        }
        switch (item.getItemId()) {
            case R.id.delete_alarm:
                // Confirm that the alarm will be deleted.
                new AlertDialog.Builder(this)
                        .setTitle(getString(R.string.delete_alarm))
                        .setMessage(getString(R.string.delete_alarm_confirm))
                        .setPositiveButton(android.R.string.ok,
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface d,
                                            int w) {
                                        Alarms.deleteAlarm(DeskClockMainActivity.this, id);
                                    }
                                })
                        .setNegativeButton(android.R.string.cancel, null)
                        .show();
                return true;

            case R.id.enable_alarm:
                final Cursor c = (Cursor) mAlarmsList.getAdapter()
                        .getItem(info.position);
                final Alarm alarm = new Alarm(c);
                Alarms.enableAlarm(this, alarm.id, !alarm.enabled);
                if (!alarm.enabled) {
                    SetAlarm.popAlarmSetToast(this, alarm.hour, alarm.minutes,
                            alarm.daysOfWeek);
                }
                return true;

            case R.id.edit_alarm:
                Intent intent = new Intent(this, SetAlarm.class);
                intent.putExtra(Alarms.ALARM_ID, id);
                startActivity(intent);
                return true;

            default:
                break;
        }
        return super.onContextItemSelected(item);
    }
    
    /*
     * (non-Javadoc)
     * @see android.app.Activity#onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo)
     * 创建菜单
     */
    @Override
    public void onCreateContextMenu(ContextMenu menu, View view,
            ContextMenuInfo menuInfo) {
        // Inflate the menu from xml.
        getMenuInflater().inflate(R.menu.context_menu, menu);

        // Use the current item to create a custom view for the header.
        final AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
        final Cursor c =
                (Cursor) mAlarmsList.getAdapter().getItem((int) info.position);
        final Alarm alarm = new Alarm(c);

        // Construct the Calendar to compute the time.
        final Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, alarm.hour);
        cal.set(Calendar.MINUTE, alarm.minutes);
        final String time = Alarms.formatTime(this, cal);

        // Inflate the custom view and set each TextView's text.
        final View v = mFactory.inflate(R.layout.context_menu_header, null);
        TextView textView = (TextView) v.findViewById(R.id.header_time);
        textView.setText(time);
        textView = (TextView) v.findViewById(R.id.header_label);
        textView.setText(alarm.label);

        // Set the custom view on the menu.
        menu.setHeaderView(v);
        // Change the text based on the state of the alarm.
        if (alarm.enabled) {
            menu.findItem(R.id.enable_alarm).setTitle(R.string.disable_alarm);
        }
    }
    
    /*
     * (non-Javadoc)
     * @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem)
     * 设置菜单的点击事件的处理
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_item_settings:
                startActivity(new Intent(this, SettingsActivity.class));
                return true;
            case R.id.menu_item_desk_clock:
            	//modify by wangxianming in 2012-4-14
//                startActivity(new Intent(this, DeskClock.class));
                return true;
            case R.id.menu_item_add_alarm:
                addNewAlarm();
                return true;
            default:
                break;
        }
        return super.onOptionsItemSelected(item);
    }
   
    /*
     * (non-Javadoc)
     * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu)
     * 创建菜单
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.alarm_list_menu, menu);
        return super.onCreateOptionsMenu(menu);
    }
    
    /*
     * (non-Javadoc)
     * @see android.widget.AdapterView.OnItemClickListener#onItemClick(android.widget.AdapterView, android.view.View, int, long)
     * 创建菜单的点击事件响应
     */
	public void onItemClick(AdapterView<?> adapterView, View v, int pos, long id) {
		Intent intent = new Intent(this, SetAlarm.class);
        intent.putExtra(Alarms.ALARM_ID, (int) id);
        startActivity(intent);
		
	}
	
   @Override
    protected void onDestroy() {
        super.onDestroy();
        ToastMaster.cancelToast();
        mCursor.close();
    }
}

【说明】想要源码的可以留下邮箱,我看到后就给你发过去!

也可以到我的csdn资源中下载:http://download.youkuaiyun.com/detail/wdaming1986/4226174

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值