Android中定时器AlarmManager的用法

AlarmManager是Android提供的全局定时器,利用系统闹钟定时发送广播。可以实现定时执行代码的目的。只要我们APP在后台运行,那么我们就可以定时执行我们的代码。当然,由于高版本Android对于系统安全性的提高,我们可能无法做到唤起APP的目的,不过做一些定时执行的任务还是可以的。

我们具体实现的代码如下

public class MainActivity extends AppCompatActivity {

    private Button bt_nz;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bt_nz = findViewById(R.id.bt_nz);
        bt_nz.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 创建一个广播事件的意图
                Intent intent = new Intent(ALARM_EVENT);
                // 创建一个用于广播的延迟意图
                PendingIntent pIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent,
                        PendingIntent.FLAG_UPDATE_CURRENT);
                // 从系统服务中获取闹钟管理器
                AlarmManager alarmMgr = (AlarmManager) getSystemService(ALARM_SERVICE);
                Calendar calendar = Calendar.getInstance();
                calendar.setTimeInMillis(System.currentTimeMillis());
                // 给当前时间加上若干秒
                calendar.add(Calendar.SECOND, 5);
                // 开始设定闹钟,延迟若干秒后,携带延迟意图发送闹钟广播
                alarmMgr.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pIntent);
            }
        });
    }

    // 声明一个闹钟广播事件的标识串
    private String ALARM_EVENT = "com.example.senior.AlarmActivity.AlarmReceiver";
    private static String mDesc = ""; // 闹钟时间到达的描述
    private static boolean isArrived = false; // 闹钟时间是否到达

    // 定义一个闹钟广播的接收器
    public static class AlarmReceiver extends BroadcastReceiver {

        // 一旦接收到闹钟时间到达的广播,马上触发接收器的onReceive方法
        public void onReceive(Context context, Intent intent) {
            if (intent != null) {
                if (!isArrived) {
                    isArrived = true;
                    //TODO 接收到闹钟到达广播的动作
                    Intent intent1 = new Intent(context, MainActivity.class);
                    context.startActivity(intent1);
                }
            }
        }
    }

    // 适配Android9.0开始
    @Override
    public void onStart() {
        super.onStart();
        // 从Android9.0开始,系统不再支持静态广播,应用广播只能通过动态注册
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            // 创建一个闹钟的广播接收器
            alarmReceiver = new AlarmReceiver();
            // 创建一个意图过滤器,只处理指定事件来源的广播
            IntentFilter filter = new IntentFilter(ALARM_EVENT);
            // 注册广播接收器,注册之后才能正常接收广播
            registerReceiver(alarmReceiver, filter);
        }
    }

    @Override
    public void onStop() {
        super.onStop();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            // 注销广播接收器,注销之后就不再接收广播
            unregisterReceiver(alarmReceiver);
        }
    }

    // 声明一个闹钟的广播接收器
    private AlarmReceiver alarmReceiver;
    // 适配Android9.0结束
}

清单文件中配置

<receiver android:name=".MainActivity$AlarmReceiver" >
            <intent-filter>
                <action android:name="com.example.senior.ScheduleDetailActivity.AlarmReceiver" />
            </intent-filter>
</receiver>

这样我们如果版本高于9.0,可以实现我们要的定时任务。如果版本低于9.0我们也可以实现我们想要的即使退出app依旧可以执行代码的目的。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Android,可以使用AlarmManager来实现守护进程。具体实现步骤如下: 1. 创建一个Service,在Service实现需要守护的业务逻辑。 2. 在Service的onStartCommand()方法,启动一个定时器。 3. 使用AlarmManager定时启动Service,这样就可以保证Service一直在后台运行。 4. 在Service的onDestroy()方法,重新启动Service,以保证Service一直在后台运行。 示例代码如下: ```java public class GuardService extends Service { private static final int INTERVAL = 60 * 1000; // 定时器间隔时间,60秒 private static final int REQUEST_CODE = 100; // 请求码 private static final String TAG = "GuardService"; // 日志标签 private AlarmManager mAlarmManager; private PendingIntent mPendingIntent; private Intent mIntent; @Override public void onCreate() { super.onCreate(); mAlarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); mIntent = new Intent(this, GuardService.class); mPendingIntent = PendingIntent.getService(this, REQUEST_CODE, mIntent, PendingIntent.FLAG_UPDATE_CURRENT); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(TAG, "onStartCommand"); // 启动定时器 mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), INTERVAL, mPendingIntent); return START_STICKY; } @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public void onDestroy() { super.onDestroy(); // 重新启动Service Intent intent = new Intent(this, GuardService.class); startService(intent); } } ``` 在AndroidManifest.xml文件声明Service: ```xml <service android:name=".GuardService" android:exported="false" /> ``` 这样就可以实现Android AlarmManager守护进程了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值