• 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提现多少

  • 相关阅读:
    Coursera 算法二 week 5 BurrowsWheeler
    pta 编程题7 List Leaves
    pta 编程题6 树的同构
    pta编程题5 Pop Sequence
    pat乙级1067
    pat乙级1060
    pat乙级1059
    1.ActionBar
    安卓开发必须收藏的网站
    genymotion常见问题解答
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13309116.html
Copyright © 2020-2023  润新知