Android学习笔记——从零开始的闹钟开发(一)

写在前面:为了今后更有效地学习和工作,决定把正在学习和开发的功能或者项目的过程记录下来,方便自己以后遗忘了相关知识点还能来博客看看重拾其来。如果有幸能让他人看到并从中学到点什么,也是极好的。由于是个人随手写下的一些笔记,如果有逻辑不清晰,语言描述不清楚或者是写到的内容有什么遗漏和出错的地方,大家请尽情地提出来~~好了,下面言归正传。

一、一些资料
首先贴几篇前辈们的博客,这是我进行Android闹钟开发之前找到的几篇质量比较好的干货。如果想多了解闹钟开发用到的类和参数的含义,可以着重看下第二篇和第三篇。
Android闹钟 AlarmManager的使用:http://www.cnblogs.com/mengdd/p/3819806.html
Android之AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作:http://www.cnblogs.com/zyw-205520/p/4040923.html
Android杂谈–闹钟详谈:http://hualang.iteye.com/blog/1304054
Android之Broadcast, BroadcastReceiver:http://www.cnblogs.com/playing/archive/2011/03/23/1992030.html

这篇笔记中有三个重要的知识点需要事先了解:系统闹钟服务的接口——AlarmManager,Android中的邮递员——Intent与PendingIntent,Android四巨头之一的广播——Broadcast和BroadcastReceiver。大家可以轻易地从网上搜索到相关的资料,也可看我贴出来的链接,因此我就不再重复赘述了。

二、开发一个简单的闹钟DEMO
既然是从零开始开发一个闹钟,那自然要从最基础的开始。我们首先要开发一个简单、能按时执行相关操作的DEMO来模拟和了解闹钟的运行原理。
在创建了新的项目后,我们需要在AndroidManifest.xml中注册广播,在Android Studio中我们可以通过菜单选项快速进行Receiver的注册:

Android学习笔记——从零开始的闹钟开发(一)_第1张图片

点击选项后,会自动生成一个Receiver的.java文件并完成AndroidManifest.xml中的注册。根据需要,在AndroidManifest.xml中的receiver标签对中声明隐式意图的action

<receiver
    android:name=".MyReceiver"
    android:enabled="true">
    
    <intent-filter>
        <action android:name="android.intent.action.MY_BROADCAST"/>
        <category android:name="android.intent.category.DEFAULT" />
    intent-filter>
receiver>

在自动生成的广播接收类中只保留最简单日志输出语句即可
MyReceiver.java:

public class MyReceiver extends BroadcastReceiver {
    public MyReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        String msg = intent.getStringExtra("msg");
        Log.i("闹钟内容:", msg);
    }
}

广播创建好了,我们需要在DEMO的MainActivity界面中设置三个按钮,通过点击三个按钮触发不同闹钟并执行自定义广播中的日志输出操作,使我们可以在控制台中看到这个闹钟的效果:
activity_main.xml:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn_alarm1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="设置一个10秒钟后启动的闹钟"
        android:onClick="onClick"/>
    <Button
        android:id="@+id/btn_alarm2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="设置一个每1分钟重复启动的闹钟"
        android:onClick="onClick"/>
    <Button
        android:id="@+id/btn_alarm3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="设置一个指定时间启动的闹钟"
        android:onClick="onClick"/>
LinearLayout>

MainActivity.java:

public class MainActivity extends AppCompatActivity {

    private AlarmManager am;
    private PendingIntent pi;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //获得AlarmManager实例
        am = (AlarmManager) getSystemService(ALARM_SERVICE);

        //实例化Intent
        Intent intent = new Intent();

        //设置Intent action属性
        intent.setAction("android.intent.action.MY_BROADCAST");
        intent.putExtra("msg", "这是闹钟");

        //实例化PendingIntent
        pi = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);
    }

    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
            case R.id.btn_alarm1:
                Calendar calendar1 = Calendar.getInstance();
                calendar1.setTimeInMillis(System.currentTimeMillis());//获取当前系统时间
                calendar1.add(Calendar.SECOND, 10);//设置10秒的间隔
                am.set(AlarmManager.RTC_WAKEUP, calendar1.getTimeInMillis(), pi);//10秒后启动闹钟
                break;
            case R.id.btn_alarm2:
                Calendar calendar2 = Calendar.getInstance();
                calendar2.setTimeInMillis(System.currentTimeMillis());//获取当前系统时间
                am.setRepeating(AlarmManager.RTC_WAKEUP, calendar2.getTimeInMillis(),1000*60, pi);//每60秒启动一次闹钟
                break;
            case R.id.btn_alarm3:
                Calendar calendar3 = Calendar.getInstance();
                //设置一个23:30的闹钟
                calendar3.set(Calendar.HOUR_OF_DAY, 23);
                calendar3.set(Calendar.MINUTE, 30);
                calendar3.set(Calendar.SECOND, 0);
                calendar3.set(Calendar.MILLISECOND, 0);
                am.set(AlarmManager.RTC_WAKEUP, calendar3.getTimeInMillis(), pi);
                break;
            default:
                break;
        }
    }
}

这样,通过尝试三种不同设置的闹钟,我们可以大致了解到闹钟运行的基本原理,在下一篇中,我将为闹钟DEMO增加选取时间和响铃震动的功能。

你可能感兴趣的:(android开发)