2013-07-16 19 views
19

In meiner App möchte ich jeden Tag zu einer bestimmten Zeit einen Code mit einer AlarmManager ausführen. Im android documentation fand ich dies:Starten Sie AlarmManager, wenn das Gerät neu gestartet wird

Registrieren Alarme zurückgehalten werden, während das Gerät im Ruhezustand befindet, [...] aber wird gelöscht, wenn sie ausgeschaltet ist und neu gestartet.

Und das ist das Problem. Ich möchte den Code ausführen, selbst wenn der Benutzer das Telefon neu startet. Wenn der Benutzer das Telefon neu startet, muss er meine App neu starten, um die Alarme erneut zu starten. Wie kann ich das verhindern? Gibt es einen besseren Mechanismus, den ich stattdessen verwenden sollte?

+1

eine reciver für Boot erstellen vollständig und stellen Sie den Alarmmanager (klar, ob alle vorherigen Alarme gibt es auch für Ihre App) –

+1

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

+0

Sehr nützliche Frage. – ivanleoncz

Antwort

31

erstellen Boot-Receiver mit folgendem Code:

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

In Ihrem Manifest, Registrieren Sie diesen Broadcast-Empfänger:

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

Und vergessen Sie nicht die Erlaubnis in AndroidManifest.xml hinzuzufügen:

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

Mit u-Dienst Broadcast-Empfänger auf dem Gerät Boot

up erstellen
<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> 

Berechtigung:

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

Sie müssen wie diese

einen Boot-Empfänger in Ihrem Manifest hinzufügen
<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> 

Und dann erstellen Sie die Boot-Receiver-Klasse wie Diese ...

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); 
} 
} 

Mein Alarm Helfer Klasse ist ein einfacher Start der Tagalarm so ...

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

Stellen Sie sicher, dass Sie die uses-Berechtigung () an der richtigen Stelle in der Manifestdatei angeben. (normalerweise vor der Aktivität) –