AlarmManager實現定時任務和取消任務


場景:有時我們的項目中可能需要用到定時任務,在Android中,我們可以通過AlarmManager + PendingIntent來實現這一功能,比如說鬧鍾提醒,系統的鬧鍾只能選擇星期,而不能選擇年月日,如果我們指定帶有具體時間的提示該怎么做呢?

思路:我們可以使用定時任務結合廣播來實現,但是注意:需要做進程保活,如果制定定時任務的app進程被殺死,廣播中的內容就無法執行。 除此之外,其他定時任務也可采用該方式實現,但需要注意廣播處於主線程中不能執行耗時操作,如要實現定時刷新內容,請使用子線程執行。

一.制定定時任務

在Android中制定定時任務,我們首先要想到AlarmManager,那么他究竟是什么呢?
關於AlarmManger,強烈推薦閱讀這篇博文

AlarmManager

AlarmManager是鬧鍾管理器,簡單來說,我們使用的定時機制就是這個類提供的接口。

PendingIntent

我們都熟悉Intent,但是PendingIntent是什么呢?一言以蔽之,就是一個用來執行延遲任務的意圖,比如跳轉界面,但並不是立即跳轉,可以延遲一段時間再跳轉。

二.取消定時任務

如果想要取消定時任務,我們需要對pendingIntent有深入的理解,可以通過AlarmManager.cancel(PendingIntent pi)取消已經創建的定時任務,如果有多個定時任務,可以根據PendingIntent的requestCode參數指定具體的定時任務。

三.實例演示

該例演示點擊跳轉5s后從主界面后跳轉到第二個界面(代碼執行也需要時間,ms級別,對於一般的定時任務影響可以忽略),第二個按鈕是取消該任務。

package com.ibuyi.alarm;

import androidx.appcompat.app.AppCompatActivity;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import static android.app.PendingIntent.FLAG_UPDATE_CURRENT;
//以下實現了一個功能:制定定時任務與取消定時任務
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private AlarmManager alarmManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);//定時任務
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_skip:
                Intent intent = new Intent();
                intent.setClass(MainActivity.this, TestActivity.class);
                Bundle bundle = new Bundle();
                bundle.putString("message", "where my heart is?");
                intent.putExtras(bundle);
                PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(),1,intent, FLAG_UPDATE_CURRENT);
                long now = System.currentTimeMillis();
                if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.KITKAT){
                    //Android版本大於等於4.4
                    alarmManager.setExact(AlarmManager.RTC_WAKEUP, now+5*1000, pendingIntent);
                }else{
                    alarmManager.set(AlarmManager.RTC_WAKEUP, now+5*1000, pendingIntent);
                }
                break;
            case R.id.btn_stop:
                Intent i = new Intent();
                i.setClass(MainActivity.this, TestActivity.class);
                PendingIntent pending = PendingIntent.getActivity(getApplicationContext(),1,i, FLAG_UPDATE_CURRENT);
                alarmManager.cancel(pending);
                break;
        }
    }

}

相關閱讀:

抖音牛逼姐

適合年輕人創業項目

抖音音浪10000提現多少


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM