2014-09-24 1 views
1

У меня возникла проблема с Alarm Manager в Android. Я настраиваю диспетчер аварийной сигнализации, чтобы выполнять каждую полночь в 12 часов ночи. Вот мои коды:Alarm Manager не выполняет Execute onReceive

Calendar calendar = Calendar.getInstance(); 
calendar.setTimeInMillis(System.currentTimeMillis()); 
calendar.set(Calendar.HOUR_OF_DAY, 0); 
notificationCount = notificationCount + 1; 
AlarmManager mgr = (AlarmManager) context 
        .getSystemService(Context.ALARM_SERVICE); 
Intent notificationIntent = new Intent(context, 
        ReminderAlarm.class); 
notificationIntent.putExtra("RecurID", recurID);  
notificationIntent.putExtra("RecurStartDate", _recurlist.get(position) 
        .getRecurringStartDate()); 
notificationIntent.putExtra("Date", dateFormat.format(new Date())); 
notificationIntent.putExtra("Type", _recurlist.get(position).getRecurringType()); 
notificationIntent.putExtra("Amount", formatAmount); 
notificationIntent.putExtra("NextPaymentDate", viewHolder.txt_ddate.getText()); 
notificationIntent.putExtra("NotifyCount", notificationCount); 
PendingIntent pi = PendingIntent.getBroadcast(context, 
        notificationCount, notificationIntent, 
PendingIntent.FLAG_UPDATE_CURRENT); 
mgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
        AlarmManager.INTERVAL_DAY, pi); 
ComponentName receiver = new ComponentName(context, BootReceiver.class); 
      PackageManager pm = context.getPackageManager(); 

      pm.setComponentEnabledSetting(receiver, 
        PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
        PackageManager.DONT_KILL_APP);   
return convertView; 

И когда OnReceive, программа будет выполнять вставку и обновление SQL заявление, если он соответствует условиям:

ReminderAlarm класс

public void onReceive(Context context, Intent intent) { 
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); 
    String recurID = intent.getStringExtra("RecurID"); 
    String recurStartDate = intent.getStringExtra("RecurStartDate"); 
    String date = intent.getStringExtra("Date"); 
    String type = intent.getStringExtra("Type"); 
    String amount = intent.getStringExtra("Amount"); 
    String nextPaymentDate = intent.getStringExtra("NextPaymentDate"); 
    String currentDate = "Next Payment On: " 
      + dateFormat.format(new Date()); 

    // If dates match then execute the SQL statements 
    if (currentDate.equals(nextPaymentDate)) { 
     DatabaseAdapter mDbHelper = new DatabaseAdapter(
       context.getApplicationContext()); 
     mDbHelper.createDatabase(); 
     mDbHelper.open(); 
     TransactionRecModel trm = new TransactionRecModel(); 
     CategoryController cc = new CategoryController(mDbHelper.open()); 

     trm.setDate(date); 
     trm.setTransDescription(description); 
     trm.setType(type); 
     trm.setAmount(Float.parseFloat(amount)); 

     // Get the categoryID based on categoryName 
     String catID = cc.getCatIDByName(categoryName); 
     trm.setCategory(catID); 

     // Check if the recurring record exists before insert new 
     // transaction record 
     RecurringController rc1 = new RecurringController(mDbHelper.open()); 
     boolean recurExist = rc1.checkRecurExist(recurStartDate, 
       description, catID); 
     if (recurExist == true) { 
      TransactionRecController trc = new TransactionRecController(
        mDbHelper.open()); 
      // Check if the transaction record exists to prevent duplication 
      boolean moveNext = trc.checkTransExist(trm); 
      if (moveNext == false) { 
       if (trc.addTransactionRec(trm)) { 
        // Update recurring start date after insertion of 
        // transaction 
        RecurringModel rm = new RecurringModel(); 
        rm.setRecurringID(recurID); 
        rm.setRecurringStartDate(date); 

        RecurringController rc = new RecurringController(
          mDbHelper.open()); 
        if (rc.updateRecurringDate(rm)) { 
         mDbHelper.close(); 
        } 
       } 
      } 
     } 
    } 

В моей файл манифеста:

<receiver android:name="ReminderAlarm"></receiver> 
<receiver 
     android:name="BootReceiver" 
     android:enabled="false" > 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" > 
      </action> 
     </intent-filter> 
    </receiver> 

загрузки приемника Класс:

public void onReceive(Context context, Intent i) { 
    scheduleAlarms(context); 
} 

static void scheduleAlarms(Context context) { 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.set(Calendar.HOUR_OF_DAY, 0); 
    calendar.set(Calendar.MINUTE, 1); 
    AlarmManager mgr = (AlarmManager) context 
      .getSystemService(Context.ALARM_SERVICE); 
    Intent notificationIntent = new Intent(context, ReminderAlarm.class); 
    PendingIntent pi = PendingIntent.getService(context, 0, 
      notificationIntent, 0); 

    mgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, 
      calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi); 
} 

Однако менеджер тревоги не выполняется, если это получить прошло 12AM каждый день. Оператор вставки и обновления SQL будет выполняться только при запуске приложений.

Любые идеи? Заранее спасибо.

+0

сделал ваш 'txt_ddate' содержит дату со строкой' "Next Payment On:" '..? – Ranjit

+0

Да. У операторов SQL нет проблем только в том случае, если я никогда не запускаю приложение, которое он не будет выполнять. Предположим, я установил повторяющийся вчера, и частота была ежедневно. Когда на следующий день 12 утра, он должен выполнить SQL, но это не так. Он выполнит его только при запуске приложений на следующий день –

+0

@RanjitPati в коротком предложении, если я не запустил приложения, SQL не будет выполняться, поэтому я думал, что проблема с диспетчером аварийных сигналов? –

ответ

1

Проблема заключается в установлении времени срабатывания будильника. заменить верхние три строки с этим кодом

Calendar calendar = Calendar.getInstance(); 
calendar.set(Calendar.HOUR_OF_DAY, 0); 
calendar.set(Calendar.MINUTE, 1); 
+0

Что он делает? настроить диспетчер аварийной сигнализации на выполнение в 12:01? –

+0

Да, вы используете calendar.setTimeInMillis (System.currentTimeMillis()); , а не установить минуту, так что это может создать проблему в пожарной тревоге. попробуйте этот код, надеюсь, он работает. – Sats

+0

Хорошо, но у меня есть еще одна проблема, которая находится в вопросе. Я получаю NullPointerException в выражении if: if (intent.getAction(). Equals ("android.intent.action.BOOT_COMPLETED")) в классе ReminderAlarm. Есть идеи? –

1

Изменение календаря значение Calendar calendar = Calendar.getInstance(); calendar .set(Calendar.HOUR_OF_DAY, 0); calendar .set(Calendar.MINUTE, 0); calendar .set(Calendar.SECOND, 0); и установить сигнализации.

+0

Зачем нужно устанавливать минуты и секунды? –

+0

потому что 12 утра означает 0 часов, 0 минут и 0 секунд, вот почему – NIPHIN

+0

Хорошо, спасибо большое! но не могли бы вы помочь мне снова взглянуть на вопрос, потому что я столкнулся с другой проблемой. –