• 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;
            }
        }
    }
  • 相关阅读:
    Unknown host mirrors.opencas.cn You may need to adjust the proxy settings in Gradle 报错及解决办法
    Design editor is unavaiable until next gradle sync报错及解决办法
    mkdir创建目录失败
    读书笔记之梦断代码(三)
    Android学习——更新数据
    Android学习——添加数据
    Android学习——升级数据库
    Android学习——创建数据库
    开课第十一周周总结
    Android学习——数据库简介
  • 原文地址:https://www.cnblogs.com/chenjianxiang/p/3866417.html
Copyright © 2020-2023  润新知