2013-07-16 28 views
19

Nella mia app voglio eseguire qualche codice ogni giorno in un momento specifico utilizzando uno AlarmManager. Nel android documentation ho trovato questo:Avvia AlarmManager se il dispositivo viene riavviato

allarmi registrati vengono mantenuti mentre il dispositivo è addormentato [...], ma verrà cancellata se viene spento e riavviato.

E questo è il problema. Voglio eseguire il codice anche se l'utente riavvia il telefono. Se l'utente riavvia il telefono, al momento deve riavviare la mia app per avviare nuovamente gli allarmi. Come posso evitare questo? Esiste invece un meccanismo migliore che dovrei usare?

+1

creare un reciver per l'avvio completo e impostare il manager di allarme (chiaro se eventuali allarmi precedenti ci sono anche per la tua app) –

+1

prova questo http://stackoverflow.com/questions/17315494/android-how-to-start-activity-on-boot-up/17315856#17315856 –

+0

Domanda molto utile. – ivanleoncz

risposta

31

Creare ricevitore avvio seguente codice utilizzando:

public class BootBroadcastReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context pContext, Intent intent) { 
     // Do your work related to alarm manager 
    } 
} 

Nel suo manifesto, registra questo Ricevitore Broadcast:

<receiver 
android:name="com.yourapp.BootBroadcastReceiver" 
android:enabled="true" > 
<intent-filter> 
    <action android:name="android.intent.action.BOOT_COMPLETED" /> 
</intent-filter> 
</receiver> 

E non dimenticare di aggiungere il permesso in AndroidManifest.xml:

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

Usa u può creare servizio utilizzando la trasmissione ricevitore sul caricamento del dispositivo fino

<receiver android:enabled="true" android:name=".YourReceiver" 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
</receiver> 

permesso:

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

Sarà necessario aggiungere un ricevitore di avvio nel manifesta come questo

<application ... > 

    <receiver android:name=".OnBootReceiver" > 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      <uses-permission android:name="android.permission.WAKE_LOCK" /> 
     </intent-filter> 
    </receiver> 
</application> 

E quindi creare la classe del ricevitore di avvio come questo ...

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class OnBootReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context ctxt, Intent intent) { 
AlarmHelper.setAlarm(ctxt); 
} 
} 

La mia classe di allarme helper è un semplice inizio di allarme giornata come questa ...

public class AlarmHelper { 

public static void testAlarm(Context context) { 
Calendar when = Calendar.getInstance(); 
when.add(Calendar.SECOND, 10); 
setAlarm(context, when);  
} 

public static void setAlarm(Context context) { 
Calendar when = Calendar.getInstance(); 
when.add(Calendar.DAY_OF_YEAR, 1); 
when.set(Calendar.HOUR_OF_DAY, 0); 
when.set(Calendar.MINUTE, 0); 
when.set(Calendar.SECOND, 0); 
setAlarm(context, when); 
} 

    @SuppressLint("SimpleDateFormat") 
private static void setAlarm(Context context, Calendar when) { 

SharedPreferences prefs = PreferenceManager 
.getDefaultSharedPreferences(context.getApplicationContext()); 

Boolean showNotifications = prefs.getBoolean("PREF_SHOW_NOTIFICATIONS", 
false); 

if (showNotifications) {  
AlarmManager am = (AlarmManager) context 
.getSystemService(Context.ALARM_SERVICE); 

am.setRepeating(AlarmManager.RTC_WAKEUP, when.getTimeInMillis(), AlarmManager.INTERVAL_DAY, getPendingIntent(context.getApplicationContext())); 

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

Log.i(TAG, "Alarm set " + sdf.format(when.getTime())); 
} 
} 
+0

Assicurati di inserire l'autorizzazione per gli usi () nella posizione corretta nel file manifest. (di solito prima dell'attività) –