你的意思是,假设3个RadioButton,第一个设为10秒,第二个设为20秒,第三个设为30秒,然后一起倒计时到0吗?如果是这样的话,只需要在Handler的handleMessage中去减时间就行了。
创新互联是专业的莱山网站建设公司,莱山接单;提供成都做网站、网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行莱山网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
xx.setText(Integer.parseInt(xx.getText()-1);
}
};
在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才能保证自己想要的定时器一直工作,但是肯定会引起耗电量的增加。
开发中经常遇到用计时器的时候,例如:每秒输出一次log,这时候就要用到延时操作,这里总结了几种常用的方法。
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的三篇文章。
可以用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"/