zoukankan      html  css  js  c++  java
  • Android规划周期任务

    问题:应用总要周期性的执行某项任务,例如检查服务器上的更新或者提醒用户做某些事情。

    解决方案:用AlarmManager来管理和执行任务。AlarmManager可用于计划未来的单次或重复操作,甚至在应用没有运行时也可以执行任务

    AlarmManager通过发出PendingIntent来发出警告触发时执行各种系统的组件,例如Activity、Broadcast、Receiver、Service。

    编写被触发的BroadcastReceiver

    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.widget.Toast;
    
    public class AlarmReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            //可以执行一个有趣的操作,我们这里只是显示当前时间
            Calendar now = Calendar.getInstance();
            java.text.DateFormat formatter = SimpleDateFormat.getTimeInstance();
            Toast.makeText(context, formatter.format(now.getTime()), 100).show();
            
        }
    }

    BroadcastReceiver必须在Manifest文件中用<receiver>标签声明,否则AlarmManager就无法将其触发。

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

    设置和取消提醒是通过PendingIntent实现的。我们创建一个直接指向应用的BroadcastReceiver的Intent,然后用getBroadcast()(因为我们创建了指向BroadcastReceiver的引用)从中创建一个PendingIntent。

    import android.os.Bundle;
    import android.os.SystemClock;
    import android.app.Activity;
    import android.app.AlarmManager;
    import android.app.PendingIntent;
    import android.content.Context;
    import android.content.Intent;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Toast;
    
    public class MainActivity extends Activity implements OnClickListener {
    
        private PendingIntent mAlarmIntent;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //为两个按钮附加监听器
            findViewById(R.id.start).setOnClickListener(this);
            findViewById(R.id.stop).setOnClickListener(this);
            //创建提醒触发器
            Intent launchIntent = new Intent(this, AlarmReceiver.class);
            mAlarmIntent = PendingIntent.getBroadcast(this, 0, launchIntent, 0);
        }
    
        @Override
        public void onClick(View view) {
            AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            long interval = 5*1000;
            switch (view.getId()) {
            case R.id.start:
                Toast.makeText(this, "Scheduled", 100).show();
                //ELAPSED_REALTIME根据时间触发提醒,如果设备处于休眠状态,会将设备激活。
                manager.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime()+interval, interval, mAlarmIntent);
                break;
            case R.id.stop:
                Toast.makeText(this, "Canceled", 100).show();
                manager.cancel(mAlarmIntent);
                break;
            default:
                break;
            }
        }
    }
  • 相关阅读:
    QFramework 使用指南 2020(二):下载与版本介绍
    QFramework 使用指南 2020 (一): 概述
    Unity 游戏框架搭建 2018 (二) 单例的模板与最佳实践
    Unity 游戏框架搭建 2018 (一) 架构、框架与 QFramework 简介
    Unity 游戏框架搭建 2017 (二十三) 重构小工具 Platform
    Unity 游戏框架搭建 2017 (二十二) 简易引用计数器
    Unity 游戏框架搭建 2017 (二十一) 使用对象池时的一些细节
    你确定你会写 Dockerfile 吗?
    小白学 Python 爬虫(8):网页基础
    老司机大型车祸现场
  • 原文地址:https://www.cnblogs.com/chenjianxiang/p/3866417.html
Copyright © 2011-2022 走看看