zoukankan      html  css  js  c++  java
  • 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提现多少

  • 相关阅读:
    CodeForces 706C Hard problem
    CodeForces 706A Beru-taxi
    CodeForces 706B Interesting drink
    CodeForces 706E Working routine
    CodeForces 706D Vasiliy's Multiset
    CodeForces 703B Mishka and trip
    CodeForces 703C Chris and Road
    POJ 1835 宇航员
    HDU 4907 Task schedule
    HDU 4911 Inversion
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13309116.html
Copyright © 2011-2022 走看看