首页 > 代码库 > Android规划周期任务
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; } }}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。