Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用AlarmManager在android中以指定的时间间隔运行某些任务?_Android_Alarmmanager - Fatal编程技术网

如何使用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但没有帮助。