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的註冊:

Receiver的註冊

點擊選項後,會自動生成一個Receiver的.java文件並完成AndroidManifest.xml中的註冊。根據需要,在AndroidManifest.xml中的receiver標籤對中聲明隱式意圖的action

<receiver
    android:name=".MyReceiver"
    android:enabled="true">
    <!-- 自定義intent動作Action -->
    <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:

<?xml version="1.0" encoding="utf-8"?>
<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增加選取時間和響鈴震動的功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章