在需要执行定时任务的类中定义如下:

Intent intent=new Intent(SimpleWakefulController.this,SimpleWakefulReceiver.class);

Pending intent=PedingIntent.getBroadcast(SimpleWakefulController.this,0,intent,0);

Calendar calendar=Calendar.getInstance();

calendar.setTimeInMillis(System.currentTimeMills());

calendar.add(Calenda.Second,30);

//Schedule the alarm

AlarmManager am=(AlarmManager)getSystemService(AlARM_SERVICE);

am.set(AlarmManager.PTC_WAKEUP,calendar.getTimeINMills(),sender);

//Tell the user about what we did

if(mToast!=null)

mToast.cancel();

在Receiver类继承WakefulBroadcastReceiver中定义:

Intent service=new Intent(context,SimpleWakefulService.class);

startWakefulService(context,service);

在service类中:

onHandleIntent来处理相应的房

为了避免消耗电池,一个空闲的设备很快就会进入休眠,但是有的时候需要应用保持屏幕或CPU唤醒来完成一些工作。

实现的方法取决于你的APP的要求,一般是采取最轻量级的方法,以减少你的APP对系统资源的影响。下面讲述如何处理设备默认的休眠行为和应用需求之间的矛盾。

1.保持屏幕亮起

某些APP需要保持屏幕一直亮起,如游戏和看电影。最好的方法就是在Activity(只是Activity,而不是services或其他App的组件)中使用FLAG_KEEP_SCREEN_ON标志。例如:

public class MainActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  }

和wakelock(下面会讨论到)比较,这个方法好处就是不需要申请权限,平台就能正确地管理移动于应用之间的用户,也不需要你的APP去考虑无用资源的释放。

另一个方法去实现设备亮起就是在应用的布局文件中使用 Android:keepScreenOn属性:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keepScreenOn="true">
    ...
</RelativeLayout>

使用android:keepScreenOn="true"和使用 FLAG_KEEP_SCREEN_ON是一样的,你可以选择较适合的一种。在Activity设置的好处是可以清除 FLAG_KEEP_SCREEN_ON标志,关闭屏幕。

注意:正常情况下,你是不需要清除 FLAG_KEEP_SCREEN_ON标志的,除非你不想屏幕在应用还运行时保持亮起(比如程序有一段时间都没有发生活动,你想把屏幕关闭)。当你的APP跑到后台或恢复前台时,Window manager会进行相应的设置。但是如果你想显式地进行清除这个标志,关闭屏幕,可以使用clearFlag():

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON).

2.保持CPU运行

有时候为了在设备休眠之前能完成一些工作,必须保持CPU运行。你可以使用一个PowerManager系统服务特性——WakeLock实现。Wakelock允许APP控制设备的电源状态。

创建并持有Wakelock对设备电池寿命有很大影响。所以你应该在确实很必要的时候才使用,且使用时间尽可能少。比如在Acitivity中就没必要用了,如前面所述,可以使用FLAG_KEEP_SCREEN_ON标志。

使用WakeLock一个合适的例子就是,当屏幕关闭的时候,后台服务中需要持有WakeLock来保持CPU运行,以继续完成工作。但还是那句话,应尽量避免WakeLock的使用,否则会影响电池寿命。

使用WakeLock的第一步就是在应用的manifest文件中添加WAKE_LOCK权限

<uses-permission android:name="android.permission.WAKE_LOCK" />

如果你的APP包含有broadcast Receiver,且在broadcast Receiver中开启了服务去完成一些工作,那么可以通过 WakefulBroadcastReceiver来管理WakeLock,下面将会讲述,这是我们推荐的方法,如果你的APP不符合这个模式,下面是直接设置WakeLock的方法:

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
Wakelock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
        "MyWakelockTag");
wakeLock.acquire();

调用wakelock.release()来释放WakeLock,这会释放CPU。当你的APP执行完成时不要忘了释放WakeLock,这样能避免消耗电池。

3.使用WakefulBroadcastReceiver

使用Broadcast Receiver和service能让你很好地管理后台任务的生命周期。

WakefulBroadcastReceiver是BroadcastReceiver的一种特例。它会为你的APP创建和管理一个PARTIAL_WAKE_LOCK 类型的WakeLock。WakefulBroadcastReceiver把工作交接给service(通常是IntentService),并保证交接过程中设备不会进入休眠状态。如果不持有WakeLock,设备很容易在任务未执行完前休眠。最终结果是你的应用不知道会在什么时候能把工作完成,相信这不是你想要的。

像其他BroadcastReceiver使用WakefulBroadcastReceiver的第一步就是把它加到manifest中:

<receiver android:name=".MyWakefulReceiver"></receiver>

下面的代码通过startWakefulService()开启MyIntentService,该方法和 startService()相似,不同之处在于WakefulBroadcastReceiver会在服务开启的时候持有一个WakeLock。startWakefulService传递的intent封装了WakeLock的标识符。

public class MyWakefulReceiver extends WakefulBroadcastReceiver {

@Override
    public void onReceive(Context context, Intent intent) {

// Start the service, keeping the device awake while the service is
        // launching. This is the Intent to deliver to the service.
        Intent service = new Intent(context, MyIntentService.class);
        startWakefulService(context, service);
    }
}

当服务结束的时候,会调用 MyWakefulReceiver.completeWakefulIntent()释放WakeLock,completeWakefulIntent的参数是WakefulBroadcastReceiver传来的intent:

public class MyIntentService extends IntentService {
    public static final int NOTIFICATION_ID = 1;
    private NotificationManager mNotificationManager;
    NotificationCompat.Builder builder;
    public MyIntentService() {
        super("MyIntentService");
    }
    @Override
    protected void onHandleIntent(Intent intent) {
        Bundle extras = intent.getExtras();
        // Do the work that requires your app to keep the CPU running.
        // ...
        // Release the wake lock provided by the WakefulBroadcastReceiver.
        MyWakefulReceiver.completeWakefulIntent(intent);
    }
}

关于定时执行任务的解决方法,PendingIntent alarm braocastRecevier等等相关推荐

  1. java 定时执行方法_Java定时执行任务 方法总结

    JAVA技巧(Java定时执行任务的实现方法)2009年02月07日 星期六 10:36定时执行任务的三种方法: 1)java.util.Timer. 2)ServletContextListener ...

  2. php定时执行任务,PHP定时执行任务的3种方法详解

    PHP定时执行的三种方式实现 1.windows 的计划任务 2.linux的脚本程序 3.让web浏览器定时刷新 具体实现 1.windows计划任务 PHP很少在win服务器上跑,具体实现也不再深 ...

  3. ThinkPHP实现定时执行任务的两种方法 - 博客频道 - CSDN.NET

    在平常的项目中我们总是会遇到需要将某个方法任务定时执行的问题,定时执行方法任务如果我们拥有服务器的权限,我们可以直接在服务器设置定时任务,例如在Windows的任务计划程序中进行设置,在Linux中编 ...

  4. android 开启一个定时线程_Android中定时执行任务的3种实现方法

    在android中,有主线程和子线程,子线程不能操作ui进行更改,目前我们不考虑ui问题和线程通信问题,一起跟着爱站技术频道小编的步伐来了解Android中定时执行任务的3种实现方法. 在Androi ...

  5. 【PaddlePaddle系列】报错解决方法合集 (不定时更新)

    [PaddlePaddle系列]报错解决方法合集 (不定时更新) 参考文章: (1)[PaddlePaddle系列]报错解决方法合集 (不定时更新) (2)https://www.cnblogs.co ...

  6. TensorFlow 常见错误与解决方法——长期不定时更新

    TensorFlow 常见错误与解决方法--长期不定时更新 参考文章: (1)TensorFlow 常见错误与解决方法--长期不定时更新 (2)https://www.cnblogs.com/seni ...

  7. PHP自动判断用户会员过期,php,_定时扣除用户过期积分,但平台用户量比较大,有没有好的解决方法?,php - phpStudy...

    定时扣除用户过期积分,但平台用户量比较大,有没有好的解决方法? 最近网站实行用户积分过期制度,只保留用户近三月积分,三月前未使用积分进行扣除 但平台用户量比较大,感觉这样做会出问题,有没有好的解决方法 ...

  8. ThinkPHP实现定时执行任务的两种方法

    在平常的项目中我们总是会遇到需要将某个方法任务定时执行的问题,定时执行方法任务如果我们拥有服务器的权限,我们可以直接在服务器设置定时任务,例如在Windows的任务计划程序中进行设置,在Linux中编 ...

  9. java定时执行某个方法_Java中定时执行任务的三种方法

    Java中定时执行任务的三种方法 1)java.util.Timer 这个方法应该是最常用的,不过这个方法需要手工启动你的任务: Timer timer=new Timer(); timer.sche ...

最新文章

  1. 亿级流量架构之服务器扩容思路及问题分析
  2. Maven项目发布的配置
  3. Python IDLE 快捷键
  4. 高等数学在计算机的应用论文,(高等数学论文计算机软件及应用.doc
  5. 鸿蒙系统下载 绿色,WiseFolderHider(文件夹加密软件)4.3.7
  6. 网站被移动运营方屏蔽怎么办?
  7. 如何学习数字集成电路:数字IC必读书籍
  8. itunes备份文件夹更换
  9. 挪车电话也有商机,易扫挪车App
  10. python ogr创建shp
  11. 地铁发展黄金期 安防应用受考验
  12. Oracle ORA-01031:权限不足
  13. PostgreSQL的MVCC
  14. [GBase 8s 教程]GBase 8s UNION 操作符
  15. 用Feed43为任意网站定制RSS feed教程~
  16. Unity3D摄像机Camera参数详解
  17. empty() received an invalid combination of arguments - got (tuple, dtype=NoneType, device=NoneType),
  18. 事件循环机制 (Event Loop)
  19. 2W五千字的C++基础知识整理汇总
  20. 数据库 三范式 BCFN

热门文章

  1. C# 系统应用之窗体最小化至任务栏及常用操作
  2. RxSwift之订阅UITableViewCell里的按钮点击事件
  3. 树莓派AI视觉云台——4、树莓派的登录控制方式
  4. 【机器视觉】 import算子
  5. 【Qt】DOM创建和操作XML文档
  6. 【Linux】一步一步学Linux——mii-tool命令(154)
  7. 【物联网】OpenWrt编译和修改基础--预科
  8. linux系统下的程序开发报告册,linux系统及应用应用开发实验报告册
  9. 51nod 1096 距离之和最小 思维题,求中位数
  10. TCP/IP学习笔记(四)TCP超时重传及拥塞控制