《第一行代码-Android》学习笔记(二十)

2024-06-17 01:32

本文主要是介绍《第一行代码-Android》学习笔记(二十),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

服务的最佳实践:

1.Android定时任务的两种实现方式:

a) Timmer:当手机进入休眠状态的时候,会导致Timmer定时任务无法正常执行。

b) Alarm:具有唤醒CPU的功能,能够保证每次进入定时任务的时候,CPU都能正常的工作。(唤醒CPU和唤醒屏幕是两个不同的概念)

 

2.如何使用Alarm机制:

a) 获取AlarmManager类的实例:

AlarmManager manager=(AlarmManager)getSystemService(Context.ALARM_SERVICE);

b) 调用set()方法:

i. 第一个参数:指定AlarmManager的工作类型:

1. ELAPSED_REALTIME:定时任务触发时间从系统开机开始算起,但不唤醒CPU

2. ELAPSED_REALTIME_WAKEUP:定时任务触发时间从系统开机开始算起,并唤醒CPU

3. RTC:定时任务的触发时间从1970110点开始算起,但不唤醒CPU

4. RTC_WAKEUP:定时任务的触发时间从1970110点开始算起,并唤醒CPU

SystemClock.elapsedRealtime()方法可以获取到系统开机至今所经历时间的毫秒数;

SystemClock.currentTimeMillis()方法可以获取到从1970110点至今的毫秒数;

ii. 第二个参数:就是定时任务触发的时间,以毫秒为单位

iii. 第三个参数:PendingIntent,可以通过其类方法getBroadcast()方法获取一个能够执行广播的PendingIntent,这样当定时任务执行的时候,广播接收器的onReceiver()方法就可以得到执行。

3.实现长期后台定时服务,只要在pendingintnet获取到的广播接收器中,继续打开这个服务,那么就可以定时一直走下去了。

 

4.代码实例:

 long time = SystemClock.elapsedRealtime() + 10 * 1000;

 AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

 //这个intent用来后面发起广播在·

 Intent i = new Intent(this, AlarmReceiver.class);

 //getBroadcast——通过该函数获得的PendingIntent将会扮演一个广播的功能,就像调用 Context.sendBroadcast()函数一样

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);

manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, time, pendingIntent);

 

 

public class AlarmReceiver extends BroadcastReceiver

{

    @Override

    public void onReceive(Context context, Intent intent)

{

//继续启动服务,实现无限定时任务

        Intent i = new Intent(context, AlarmService.class);

        context.startService(i);

    }

}

 

5.Alarm优化4.4版本之后,出于性能的考虑,系统会自动检测目前有多少Alarm任务存在,然后将几个任务触发时间相近的放在一起执行,降低CPU唤醒的次数。

如果想要和之前一样准确无误,可以调用新方法:setExact()代替set方法。

这篇关于《第一行代码-Android》学习笔记(二十)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1068111

相关文章

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性: