2016-10-30 3 views
0

Вот кодЗапуск службы в полночь без запуска приложения

эта функция вызывает из MainActivity.onCreate()

private void setTheTimeToUpdateTables(Context context) { 

     Log.i("Update table function","Yes"); 

     AlarmManager alarmManager=(AlarmManager) getSystemService(ALARM_SERVICE); 

     Intent alarmIntent=new Intent(context,UpdateTables.class); 

     PendingIntent pendingIntent=PendingIntent.getBroadcast(context,0,alarmIntent,PendingIntent.FLAG_UPDATE_CURRENT); 

     alarmManager.cancel(pendingIntent); 


     Calendar alarmStartTime = Calendar.getInstance(); 

     alarmStartTime.set(Calendar.HOUR_OF_DAY, 0); 
     alarmStartTime.set(Calendar.MINUTE, 00); 
     alarmStartTime.set(Calendar.SECOND, 0); 

     alarmManager.set(AlarmManager.RTC_WAKEUP,alarmStartTime.getTimeInMillis(),pendingIntent); 

     Log.d("Alarm","Set for midnight"); 

    } 

Вот код для updateTables

public class UpdateTables extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     Log.i("Service Start", CalculateDaysService.TAG); 
     Log.d("BroadCast Receiver","yes"); 

     context.startService(new Intent(context,CalculateDaysService.class)); 

     Log.i("Done","Yes"); 
    } 
} 

Manifest.XML

<receiver android:name=".UpdateTables" android:enabled="true"/> 

Невозможно вызвать класс updateTable.

Update:

частный недействительный setTheTimeToUpdateTables (контекст Context) {

Log.i("Update table function","Yes"); 

    AlarmManager alarmManager=(AlarmManager) getSystemService(ALARM_SERVICE); 

    Intent alarmIntent=new Intent(context,UpdateTables.class); 

    PendingIntent pendingIntent=PendingIntent.getBroadcast(context,0,alarmIntent,PendingIntent.FLAG_UPDATE_CURRENT); 

    alarmManager.cancel(pendingIntent); 


    Calendar alarmStartTime = Calendar.getInstance(); 

    alarmStartTime.set(Calendar.HOUR_OF_DAY, 10); 
    alarmStartTime.set(Calendar.MINUTE, 29); 
    alarmStartTime.set(Calendar.SECOND, 0); 

    if (alarmStartTime.get(Calendar.HOUR_OF_DAY) >= 10) { 
     alarmStartTime.add(Calendar.DATE, 1); 
    } 

    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,alarmStartTime.getTimeInMillis(),100*1000,pendingIntent); 

    Log.d("Alarm","Set for midnight"); 

} 


<receiver android:name=".UpdateTables" 
      android:enabled="true" 
      android:exported="true"> 

      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      </intent-filter> 

     </receiver> 

ответ

0

изменение

alarmManager.set(AlarmManager.RTC_WAKEUP,alarmStartTime.getTimeInMillis(),pendingIntent); 

Для

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,alarmStartTime.getTimeInMillis(),pendingIntent); 

ИЛИ

alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,alarmStartTime.getTimeInMillis(),pendingIntent); 

И для широковещательного ресивера, вы должны настроить AndroidManifest.xml

набор

android:exported = true 

see this link

UPDATE

AndroidManifest.xml

В <manifest> Тэг

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

в вашем <application> теге

<receiver android:name="com.yourpackage.UpdateTables"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 
+0

Будет ли он звонить без запуска приложения? @emdad –

+0

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

+0

Что именно означает, что загрузка устройства завершается каждый раз. –