十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
开发中经常遇到用计时器的时候,例如:每秒输出一次log,这时候就要用到延时操作,这里总结了几种常用的方法。
10多年专注成都网站制作,成都定制网页设计,个人网站制作服务,为大家分享网站制作知识、方案,网站设计流程、步骤,成功服务上千家企业。为您提供网站建设,网站制作,网页设计及定制高端网站建设服务,专注于成都定制网页设计,高端网页制作,对酒楼设计等多个领域,拥有多年的网站设计经验。
AlarmManager 是Android的全局定时器,可以在指定时间执行定时任务。定时任务通过PendingIntent 的 getActivity()、getService()或 getBroadcast() 来执行。简单的说就是我们设定一个时间,然后在该时间到来时,AlarmManager为我们广播一个我们设定的Intent出来,在接收到设定的Intent时执行定时任务。
(2) setRepeating(int type,long startTime,long intervalTime,PendingIntent pi);
该方法用于设置重复闹钟,其中参数说明如下:
type:闹钟类型
startTime:首次执行闹钟的时间
intervalTime:两次执行闹钟的时间间隔
pi:闹钟响应动作
(3) setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi);
该方法也用于设置重复闹钟,与第二个方法相似,区别在于其两次闹钟执行的间隔时间不是固定的。
AlarmManager实现定时的方法,我还没有用到过,以上内容是在网上查找资料后自己在一个小demo中小小试验了的,有错误或描述不清的地方请见谅。下面是我参考的介绍AlarmManager的三篇文章。
你的意思是,假设3个RadioButton,第一个设为10秒,第二个设为20秒,第三个设为30秒,然后一起倒计时到0吗?如果是这样的话,只需要在Handler的handleMessage中去减时间就行了。
Handler
handler=new
Handler(){
@Override
public
void
handleMessage(Message
msg)
{
super.handleMessage(msg);
xx.setText(Integer.parseInt(xx.getText()-1);
}
};
可以用Service+Broadcast+Handler来实现。
Handler在Service里
在Service里主要逻辑为:用Handler实现每分钟发送一次广播
Broadcast在Activity里,内部类的形式
Broadcast接收广播并调用某某方法。
核心:Activity开启服务,让服务每隔一分钟就发送一条广播通知调用某某方法。
这是Activity里的代码
public class MainActivity extends Activity {
public Intent startService;
//发送广播需要的Action
public static final String BROADCAST_ACTION="broadcast.action";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//在这里注册广播
IntentFilter filter = new IntentFilter();
filter.addAction(ConstantTool.BROADCAST_ACTION);
registerReceiver(myResver, filter);
//设置服务
startService = new Intent(MusicService.SERVICE_ACTION);
startService.setClass(this, MusicService.class);
}
//假设这是你每分钟都要调用一次的方法
private void initViews() {
}
//这个点击事件来控制什么时候开启服务
private OnClickListener clickListener=new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
startService(startService);
}
};
/**
* 广播
*
* @author Administrator
*
*/
class MyResver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//首先判断你的Action是否一致
if (BROADCAST_ACTION.equals(intent.getAction())) {
//如果一致,那么就调用方法
initVies();
}
}
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
//销毁广播
unregisterReceiver(myResver);
}
}
Service里的代码
public class MusicService extends Service {
//这里面的值可以随意,因为在AndroidManifest里已经注册了
public static final String SERVICE_ACTION="service.action";
public MusicService() {
// TODO Auto-generated constructor stub
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
}
//创建一个Handler
Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
int currentTime = msg.arg1;
Intent broadcast = new Intent(MainActivity.BROADCAST_ACTION);
sendBroadcast(broadcast);
};
};
//创建一个线程
Runnable updateThread = new Runnable() {
@Override
public void run() {
if (mMediaPlayer != null) {
Message msg = mHandler.obtainMessage();
mHandler.postDelayed(updateThread, 60*1000);
}
}
};
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
//在这里判断是否是启动服务的那个Action
if (intent.getAction().equals(SERVICE_ACTION)) {
mHandler.postDelayed(updateThread, 60*1000);
}
}
}
服务绑定
service android:name="com.seekbar.android.service.MusicService"/
在Android上常用的定时器有两种,一种是Java.util.Timer,一种就是系统的AlarmService了。
实验1:使用Java.util.Timer。
在onStart()创创建Timer,每5秒更新一次计数器,并启动。
Java代码
1mTimer = new Timer();
2mTimer.schedule(new TimerTask() {
3 @Override
4 public void run() {
5 ++mCount;
6 mHandler.sendEmptyMessage(0);
7 }
8 }, 5*1000, 5*1000);
当连接USB线进行调试时,会发现一切工作正常,每5秒更新一次界面,即使是按下电源键,仍然会5秒触发一次。
当拔掉USB线,按下电源键关闭屏幕后,过一段时间再打开,发现定时器明显没有继续计数,停留在了关闭电源键时的数字。
实验2:使用AlarmService:
2.1通过AlarmService每个5秒发送一个广播,setRepeating时的类型为AlarmManager.ELAPSED_REALTIME。
Java代码
1AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
2am.setRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, 5*1000, sender);
拔掉USB线,按下电源键,过一段时间再次打开屏幕,发现定时器没有继续计数。
2.2setRepeating是的类型设置为AlarmManager.ELAPSED_REALTIME_WAKEUP
Java代码
1AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
2am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 5*1000, sender);
拔掉USB线,按下电源键,过一点时间再次打开屏幕,发现定时器一直在计数。
如此看来,使用WAKEUP才能保证自己想要的定时器一直工作,但是肯定会引起耗电量的增加。
在我们Android客户端上有时候可能有些任务不是当时就执行,而是过了一个规定的时间在执行此次任务。那么这个时候定时器的作用就非常有用了。首先开启一个简单的定时器
现在我就相当于定义了一个定时器,我现在的定时器是向服务器发送Post请求来返回数据刷新到我的界面上那么接下来就是开启定时器了。开启定时器那就非常简单了
开启定时器特别简单基本上一句话就搞定了
开启定时器需要三个参数
1.就是上面所写的你要做的事情 ,上面我写的上向网络发送请求那么这里就时开启定时器请求网络
2.这个参数是你要多长时间后执行这个定时器,这里我写的是0,那么就是0秒后执行我的定时器。
3.这个是最重要的这就是你每次执行时间的间隔 我这里就是说每10秒向网络发送一次请求如果写成1000就是每一秒向网络发送一次请求
如果第三个参数不写的话那么定时器就是几秒后执行 那么定时器只执行一次就不在执行了
其实定时器如果不销毁的话是一直执行的但其实定时器如果一直执行的话那么我们的程序根本就撑不了多长时间就会崩溃所以说定时器用完就要及时的关闭
定时器的开启在写Fragment或者Activity的时候我一般会写在onStart里面
如果销毁的时候会写在onStop里面销毁定时器也非常简单
基本上这一句话就搞定了执行这句话说明是注销定时器
当我们离开本界面的时候就执行这句话那么定时器就不会在执行了当我们进入本界面在onStart执行定时器那么就又开启了定时器所以说这样就写了一个简易版的定时器
一个简单的定时器请求网络就完成了 HttpHolder holder = new HttpHolder(handler); 这是自己写的网络请求类直接调用输入url的服务器地址获得的就是服务器发来的JSON格式的数据
在onStop里面注销定时器那么每次离开本界面的时候那么定时候就销毁了再回到本界面的时候那么就执行onStart里面的开启定时器那么定时器就开启了所以这样就避免了因为定时器开启而使程序崩溃