目錄
技術要點:
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是立刻發生。
效果圖:
實例代碼:
項目結構:
- 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>
- 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) { } }
- 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); } } }