AlarmClock

目錄

技術要點:

效果圖:

實例代碼:


技術要點:

1.spinner(下拉菜單)

   重要屬性:android:entries:使用數組資源設置下拉列表框的列表項目(如:5秒,10秒,15秒...)

   使用實例:   

       MainActivity

在res/values/目錄下新建arrays.xml文件,定義time數組資源,如下:

MainActivity.java

2.AlarmManager(Android定時器)

2.1優點:如果App提前註冊鬧鐘的廣播接收器,即使App退出了,只要定時到達,App就會被喚醒響應廣播事件,說人話就是只有當設備關閉或是重啓的時候會被清除

2.2使用:

    創建方式:

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

2.2.1AlarmManager常用方法:

  • set(int type,long startTime,PendingIntent pi):一次性鬧鐘
  • setRepeating(int type,long startTime,long intervalTime,PendingIntent pi): 重複性鬧鐘,和3有區別,3鬧鐘間隔時間不固定

2.2.1.1重要參數講解:

type有五個可選值:

AlarmManager.ELAPSED_REALTIME: 鬧鐘在手機睡眠狀態下不可用,該狀態下鬧鐘使用相對時間(相對於系統啓動開始),狀態值爲3;

AlarmManager.ELAPSED_REALTIME_WAKEUP 鬧鐘在睡眠狀態下會喚醒系統並執行提示功能,該狀態下鬧鐘也使用相對時間,狀態值爲2;

AlarmManager.RTC 鬧鐘在睡眠狀態下不可用,該狀態下鬧鐘使用絕對時間,即當前系統時間,狀態值爲1;   (本案例使用)                         

AlarmManager.RTC_WAKEUP 表示鬧鐘在睡眠狀態下會喚醒系統並執行提示功能,該狀態下鬧鐘使用絕對時間,狀態值爲0;   

AlarmManager.POWER_OFF_WAKEUP 表示鬧鐘在手機關機狀態下也能正常進行提示功能,所以是5個狀態中用的最多的狀態之一,該狀態下鬧鐘也是用絕對時間,狀態值爲4;

startTime

鬧鐘的第一次執行時間,以毫秒爲單位。

pi:處於Pending狀態的意圖,而Pending狀態就是一種待定,等待,即將發生的意思。PendingIntent是在將來某個不確定你、的時刻發生,而Intent是立刻發生。

 

效果圖:

實例代碼:

項目結構:

  1. activity_main.xml佈局文件:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="10dp"
        tools:context=".MainActivity">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <TextView
                android:layout_width="0dp"
                android:layout_weight="2"
                android:layout_height="wrap_content"
                android:text="鬧鐘延遲"
                android:textSize="20sp"
                ></TextView>
            <Spinner
                android:id="@+id/spinner"
                android:layout_width="0dp"
                android:layout_weight="2"
                android:textSize="20sp"
                android:layout_height="wrap_content"
                android:entries="@array/time"
                ></Spinner>
        </LinearLayout>
        <Button
            android:id="@+id/set"
            android:layout_marginTop="10dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="22sp"
            android:text="設置鬧鐘"
            ></Button>
        <TextView
            android:id="@+id/t_start"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            ></TextView>
        <TextView
            android:id="@+id/t_end"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            ></TextView>
    </LinearLayout>

     

  2. MainActivity.java
    package com.example.spinnertwo;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.app.AlarmManager;
    import android.app.PendingIntent;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.Button;
    import android.widget.Spinner;
    import android.widget.TextView;
    
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.Timer;
    import java.util.TimerTask;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener, AdapterView.OnItemSelectedListener {
    
        private Intent intent;
        private Spinner mSpinner;
        public static TextView end;
        public static TextView start;
        private Button button;
        private int[] minutes = {5, 10, 15, 20, 25, 30};
        private int period;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            button = findViewById(R.id.set);
            button.setOnClickListener(this);
            start = findViewById(R.id.t_start);
            end = findViewById(R.id.t_end);
            //獲取佈局文件的spinner組件
            mSpinner = findViewById(R.id.spinner);
            //設置選中事件監聽器
            mSpinner.setOnItemSelectedListener(this);
    
        }
    
        @Override
        public void onClick(View v) {
            //獲得AlarmManager實例對象
            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            ////設置當前時間
            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(System.currentTimeMillis());
            //加上延遲時間
            calendar.add(Calendar.SECOND,period);
            //自定義廣播
            Intent intent = new Intent("AlarmClock");
            //PendingIntent發送廣播意圖
            PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
            //一次性定時器
            alarmManager.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),pendingIntent);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            start.setText(sdf.format(System.currentTimeMillis())+" 設置鬧鐘");
            end.setVisibility(View.INVISIBLE);
    
        }
    
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            //獲取延時時間
            period = minutes[position];
        }
    
        @Override
        public void onNothingSelected(AdapterView<?> parent) {
        }
    }

     

  3. ClockReceiver.java
    package com.example.spinnertwo;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.view.View;
    
    import java.text.SimpleDateFormat;
    
    public class ClockReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent!=null) {
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                MainActivity.end.setText(sdf.format(System.currentTimeMillis())+"  鬧鐘時間到達");
                MainActivity.end.setVisibility(View.VISIBLE);
            }
        }
    }

     

 

 

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