public class AlarmManagerClass extends BroadcastReceiver
{
    public static boolean haveInternet(Context ctx) {

        NetworkInfo info = (NetworkInfo) ((ConnectivityManager) ctx
                .getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();

        if (info == null || !info.isConnected()) {
            return false;
        }
        if (info.isRoaming()) {
            // here is the roaming option you can change it if you want to
            // disable internet while roaming, just return false
            return false;
        }
        return true;
    }


     @Override
     public void onReceive(final Context context, Intent intent)
     {   PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
     PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
     wl.acquire();

     // Put here YOUR code.
     Log.d(null,"Alarm !");
     Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example

            Thread falador = new Thread() {
                 @Override
                 public void run() {
                     while (haveInternet(context)==false){
                         try {
                            sleep(60000);
                            if (haveInternet(context)==true){
                                PostSync(context);
                                                    return;
                            }
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                     }
                 }
          };
              falador.start
            Log.d(null,"Alarm Exit !");
     wl.release();
     }

 public void SetAlarm(Context context)
 {
     AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
     Intent i = new Intent(context, AlarmManagerClass.class);
     PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
     am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 10, pi); // Millisec * Second * Minute
 }

}


我有一个AlarmManager,每10分钟将PostSync();,其中PostSync是用于将数据同步到服务器的功能。

例如 :
10分钟后,AlarmManager唤醒,并检查是否存在网络连接。如果没有连接,它将在60秒后再次检查。

因此,只要10分钟内没有互联网连接,第一个AlarmManager的任务就不会完成执行,因为它正在等待互联网连接。第二个AlarmManager唤醒并检查是否haveInternet,如果没有,它将休眠一分钟,等等。因此,这是一个无限循环。...这会在此代码上发生吗?

如何确保第一个AlarmManager的任务尚未完成执行,不唤醒第二个AlarmManager?

最佳答案

我认为您应该使用set而不是setRepeating并仅在第一个任务实际完成后安排下一个任务。这样,您将确保永远不会有两个并发的AlarmManager,并且当您连接到Internet时,您的任务每10分钟运行一次。

我认为这样会更简单:您使用AlarmManager#set延迟10分钟。在任务中,您检查是否有Internet连接:


在这种情况下,请做好您的工作,并以10分钟的延迟时间用AlarmManager#set设置下一个警报
否则,将下一个警报设置为AlarmManager#set并延迟60秒


我认为当前使用由警报任务启动的线程的方法很不稳定,如果您使用AlarmManager,请同时使用它或延迟10分钟60秒。

关于android - Android:如何确保AlarmManager不会首先崩溃,AlarmManager尚未完成执行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22067678/

10-12 01:50