日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

android全局计时_Android定时器AlarmManager

發(fā)布時間:2025/3/15 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android全局计时_Android定时器AlarmManager 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

AlarmManager是Android的全局定時器。就是在指定時間做一個事情(封裝在PendingIntent)。通過PendingIntent的getActivity()、getService()或getBroadcast()來執(zhí)行。

聽起來AlarmManager和Timer很類似,但是Timer有可能因為手機休眠而被殺掉服務(wù),但是AlarmManager可以做到喚醒手機。

創(chuàng)建方式

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);

注:ALARM_SERVIC是context的一個常量。

鬧鐘類型

RTC_WAKEUP

表示鬧鐘在睡眠狀態(tài)下喚醒系統(tǒng)并執(zhí)行提示功能,絕對時間。

RTC

睡眠狀態(tài)下不可用,絕對時間。

ELAPSED_REALTIME_WAKEUP

睡眠狀態(tài)下可用,相對時間。

ELAPSED_REALTIME

睡眠狀態(tài)下不可用,相對時間。

以上絕對時間就是手機的時間,相對時間是相對于當(dāng)前開機時間來說。例如如果是絕對時間,那么你測試可以通過修改系統(tǒng)時間來提前觸發(fā)。而相對時間的使用場景是強調(diào)多久之后觸發(fā),例如2小時后,這個時候把時間修改到2小時后也是沒用的。

注:以前還有一個POWER_OFF_WAKEUP,即使在關(guān)機后還能提醒,但是Android4.0以后就沒有了。

常用方法

set(int type, long triggerAtMillis, PendingIntent operation)

該方法用于設(shè)置一次性鬧鐘。第一個參數(shù)是鬧鐘類型,第二個參數(shù)是觸發(fā)時間,第三個參數(shù)是動作。

setExact(int type, long triggerAtMillis, PendingIntent operation)

和set一樣,但是時間更精準(zhǔn)。

setInexactRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)

重復(fù)鬧鐘,第1、2、4個參數(shù)同上,第3個參數(shù)是兩次鬧鐘的時間間隔。

setRepeating(int type, long triggerAtMillis,long intervalMillis, PendingIntent operation)

和setInexactRepeating一樣,但是時間更精準(zhǔn)。

以上四個方法時間精不精準(zhǔn)的原因還沒有深入研究,大概是是否允許系統(tǒng)同時發(fā)出多個提醒,意義在于系統(tǒng)喚醒cpu后會把時間接近的alarm同時發(fā)出,避免重復(fù)喚醒cpu,減少電量。

cancel(PendingIntent operation)

取消鬧鐘。

寫個小程序?qū)嶒炓幌?/p>

目的:在指定時間從一個發(fā)送個廣播,收到廣播后打印log。界面如下面這樣。

布局:

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

tools:context="com.xuhongchuan.alarmclocktest.MainActivity">

android:id="@+id/view_group1"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="vertical">

android:id="@+id/time_picker"

android:layout_width="match_parent"

android:layout_height="wrap_content">

android:id="@+id/view_group2"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:gravity="center"

android:orientation="horizontal"

android:layout_below="@id/view_group1">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="是否重復(fù)"/>

android:id="@+id/checkbox"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />

android:id="@+id/confirm"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_below="@id/view_group2"

android:text="確定" />

廣播接收器:

public class AlarmReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

if (action == MainActivity.INTENT_ALARM_LOG) {

Log.d("AlarmReceiver", "log log log");

}

}

}

MainActivity

public class MainActivity extends AppCompatActivity {

public static final String INTENT_ALARM_LOG = "intent_alarm_log";

private TimePicker timePicker;

private CheckBox checkBox;

private Button btnConfirm;

private int hour;

private int minute;

AlarmManager am;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

init();

}

private void init() {

timePicker = (TimePicker) findViewById(R.id.time_picker);

timePicker.setIs24HourView(true);

checkBox = (CheckBox) findViewById(R.id.checkbox);

btnConfirm = (Button) findViewById(R.id.confirm);

am = (AlarmManager) getSystemService(ALARM_SERVICE);

btnConfirm.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

if (Build.VERSION.SDK_INT >= 23) {

hour = timePicker.getHour();

minute = timePicker.getMinute();

} else {

hour = timePicker.getCurrentHour();

minute = timePicker.getCurrentMinute();

}

Calendar calendar = Calendar.getInstance();

calendar.set(Calendar.HOUR_OF_DAY, hour);

calendar.set(Calendar.MINUTE, minute);

calendar.set(Calendar.SECOND, 0);

Intent intent = new Intent(INTENT_ALARM_LOG);

PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);

if (!checkBox.isChecked()) {

am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pi);

} else {

long intervalMillis = 60 * 1000; // 60秒

am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), intervalMillis, pi);

}

}

});

}

}

AndroidManifest要注冊一下receiver

經(jīng)過測試,以上的時間間隔intervalMillis即使設(shè)置5秒也是沒用的,因為誤差(幾十秒呢)無法避免,即使是setRepeating。所以精確是相對的。

總結(jié)

以上是生活随笔為你收集整理的android全局计时_Android定时器AlarmManager的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。