如何使用AlarmManager在android中以指定的时间间隔运行某些任务?
您好如何使用AlarmManager在android中以指定的时间间隔运行某些任务?,android,alarmmanager,Android,Alarmmanager,您好stackoverflow我正在尝试开发一个android应用程序,它可以在特定的时间间隔运行一些任务,我正在使用AlarmManager来完成任务,代码片段如下: if (radioBtnChecked) { MyActivity.this.alarmMgr = (AlarmManager) MyActivity.this.getSystemService(Context.ALARM_SERVICE); Intent serviceIntent = new Int
stackoverflow
我正在尝试开发一个android应用程序,它可以在特定的时间间隔运行一些任务,我正在使用AlarmManager
来完成任务,代码片段如下:
if (radioBtnChecked)
{
MyActivity.this.alarmMgr = (AlarmManager) MyActivity.this.getSystemService(Context.ALARM_SERVICE);
Intent serviceIntent = new Intent(MyActivity.this, MyService.class);
MyActivity.this.pi = PendingIntent.getService(MyActivity.this, 0, serviceIntent, 0);
MyActivity.this.alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 10000, pi);
}//End of if condition
和MyService.java
public class MyService extends Service
{
@Override
public IBinder onBind(Intent intent)
{
return null;
}//End of onBind method
public void onStart(Intent intent, int startId)
{
super.onStart(intent, startId);
Toast.makeText(getApplicationContext(),"Service started", Toast.LENGTH_SHORT).show();
}
}
问题是当我单击单选按钮时,将第一次显示服务启动
消息,但我希望服务启动
消息在10秒后显示。请有人帮我解决这个问题,请分享你的知识,这样我可以纠正我的错误
提前谢谢。试试这个
alarmManagera.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),10000, YourPendingIntent);
试试这个
alarmManagera.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),10000, YourPendingIntent);
按如下方式设置AlarmManager:
private static final int REPEAT_TIME_IN_SECONDS = 60; //repeat every 60 seconds
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis(),
REPEAT_TIME_IN_SECONDS * 1000, pendingIntent);
如果您想在手机启动时唤醒手机,请将AlarmManager.RTC
更改为AlarmManager.RTC_WAKEUP
爆炸了。更多关于AlarmManager的信息
这两个参数还意味着您的报警时间将是UTC时间
编辑:
您的解决方案使用的是AlarmManager.eassed\u REALTIME
,它测量设备启动后的时间,包括睡眠时间。这意味着,如果您想在10秒后运行此代码,然后想重复此代码,并且您的设备正在运行的时间超过10秒,则会立即触发PendingEvent,
编辑2:
如果您想在10秒后只运行一次代码,请尝试以下操作:
private static final int START_AFTER_SECONDS = 10;
...
if (radioBtnChecked)
{
Runnable mRunnable;
Handler mHandler = new Handler();
mRunnable = new Runnable() {
@Override
public void run() {
Intent serviceIntent = new Intent(MyActivity.this, MyService.class);
MyActivity.this.startService(serviceIntent);
}
};
mHandler.postDelayed(mRunnable, START_AFTER_SECONDS * 1000);
}
按如下方式设置AlarmManager:
private static final int REPEAT_TIME_IN_SECONDS = 60; //repeat every 60 seconds
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis(),
REPEAT_TIME_IN_SECONDS * 1000, pendingIntent);
如果您想在手机启动时唤醒手机,请将AlarmManager.RTC
更改为AlarmManager.RTC_WAKEUP
爆炸了。更多关于AlarmManager的信息
这两个参数还意味着您的报警时间将是UTC时间
编辑:
您的解决方案使用的是AlarmManager.eassed\u REALTIME
,它测量设备启动后的时间,包括睡眠时间。这意味着,如果您想在10秒后运行此代码,然后想重复此代码,并且您的设备正在运行的时间超过10秒,则会立即触发PendingEvent,
编辑2:
如果您想在10秒后只运行一次代码,请尝试以下操作:
private static final int START_AFTER_SECONDS = 10;
...
if (radioBtnChecked)
{
Runnable mRunnable;
Handler mHandler = new Handler();
mRunnable = new Runnable() {
@Override
public void run() {
Intent serviceIntent = new Intent(MyActivity.this, MyService.class);
MyActivity.this.startService(serviceIntent);
}
};
mHandler.postDelayed(mRunnable, START_AFTER_SECONDS * 1000);
}
此代码段可能会对您有所帮助
private static final long REPEAT_TIME = 30*1000;
AlarmManager service = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, MyStartServiceReceiver.class);
PendingIntent pending = PendingIntent.getBroadcast(context, 0, i,
PendingIntent.FLAG_CANCEL_CURRENT);
Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND, 30);
service.setInexactRepeating(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), REPEAT_TIME, pending);
在MyService类中,使用onstart命令(Intent-Intent、int-flags、int-startId)
。您已经使用了onStart(Intent-Intent,int-startId),它将执行一次
public class MyService extends Service
{
@Override
public IBinder onBind(Intent intent)
{
return null;
}//End of onBind method
public void onStart(Intent intent, int startId)
{
super.onStart(intent, startId);
Toast.makeText(getApplicationContext(),"Service started", Toast.LENGTH_SHORT).show();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
Toast.makeText(getApplicationContext(),"onStartCommand=Service started", Toast.LENGTH_SHORT).show();
return Service.START_STICKY;
}
}
此代码段可能会对您有所帮助
private static final long REPEAT_TIME = 30*1000;
AlarmManager service = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, MyStartServiceReceiver.class);
PendingIntent pending = PendingIntent.getBroadcast(context, 0, i,
PendingIntent.FLAG_CANCEL_CURRENT);
Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND, 30);
service.setInexactRepeating(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), REPEAT_TIME, pending);
在MyService类中,使用onstart命令(Intent-Intent、int-flags、int-startId)
。您已经使用了onStart(Intent-Intent,int-startId),它将执行一次
public class MyService extends Service
{
@Override
public IBinder onBind(Intent intent)
{
return null;
}//End of onBind method
public void onStart(Intent intent, int startId)
{
super.onStart(intent, startId);
Toast.makeText(getApplicationContext(),"Service started", Toast.LENGTH_SHORT).show();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
Toast.makeText(getApplicationContext(),"onStartCommand=Service started", Toast.LENGTH_SHORT).show();
return Service.START_STICKY;
}
}
将SystemClock.elapsedRealtime()
替换为System.currentTimeMillis()
将SystemClock.elapsedRealtime()
替换为System.currentTimeMillis()谢谢@Sebastian Swierczek或您的详细解释,但它不起作用,问题仍然存在。我想在10秒后继续运行代码,每10秒运行一次@SebastianSwierczek@ChethanShetty然后试着把它混合起来,在我的第二个代码的run()
中放入我的第一个代码。它将在10秒后设置为AlarmManager重复工作。哇,谢谢@Sebastian Swierczek,它真的在工作,但如何停止/终止线程?@ChethanShetty如果您将Runnable添加到消息队列,只需删除回调mHandler.removeCallbacks(mRunnable)
,将其放在活动的onStop()方法中,甚至在startService()之后。即使没有它,在run()
方法结束后,线程也处于空闲状态。感谢@Sebastian Swierczek或您的详细解释,但它不起作用,问题仍然存在。我希望每10秒在10秒后继续运行代码@SebastianSwierczek@ChethanShetty那么试着在run()中混合它
在我的第二个代码中放入我的第一个代码。它将在10秒后设置为AlarmManager重复工作。哇,谢谢@Sebastian Swierczek,它真的在工作,但如何停止/终止线程?@ChethanShetty如果您将Runnable添加到消息队列,只需删除回调mHandler.removeCallbacks(mRunnable)
,将其放在活动的onStop()方法中,甚至在startService()之后。即使没有它,线程在run()
方法结束后也处于空闲状态。谢谢@Kalai.G但问题仍然存在。谢谢@Kalai.G但问题仍然存在。谢谢@Kalai.G但问题仍然存在。谢谢@shakeb Shaheen但没有帮助。谢谢@shakeb Shaheen但没有帮助。