2013-07-16 32 views
19

W mojej aplikacji chcę uruchamiać kod każdego dnia o określonej godzinie przy użyciu AlarmManager. W android documentation Znalazłem to:Uruchomić aplikację AlarmManager, jeśli urządzenie zostanie ponownie uruchomione.

Zarejestrowani alarmy są zatrzymywane, gdy urządzenie jest w trybie uśpienia [...], lecz zostaną usunięte, jeśli jest wyłączony i ponownie uruchomiony.

I to jest problem. Chcę uruchomić kod, nawet jeśli użytkownik ponownie uruchomi telefon. Jeśli użytkownik ponownie uruchomi telefon, musi ponownie uruchomić moją aplikację, aby ponownie uruchomić alarmy. Jak mogę temu zapobiec? Czy istnieje lepszy mechanizm, którego powinienem użyć?

+1

stworzyć reciver do bagażnika kompletne i ustawić Alarm Manager (jasne, czy jakiekolwiek wcześniejsze alarmy są tam również dla twojej aplikacji) –

+1

spróbuj tego http://stackoverflow.com/questions/17315494/android-how-to-start-activity-on-boot-up/17315856#17315856 –

+0

Bardzo przydatne pytanie. – ivanleoncz

Odpowiedz

31

Tworzenie Boot odbiornika za pomocą następującego kodu:

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

W swoim manifeście, zarejestruj ten odbiornik:

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

I nie zapomnij dodać uprawnienia w AndroidManifest.xml:

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

Stosowanie u można utworzyć usługę za pomocą przekazu odbiornik przy starcie urządzenia aż

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

Permission:

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

Trzeba będzie dodać odbiornik bagażnika w swoim manifeście jak ten

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

Następnie utwórz klasę odbiornika rozruchowego, np. to ...

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

Moja klasa alarm pomocnik jest prosty początek dnia alarmu jak to ...

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

Upewnij się, że umieściłeś uprawnienia do używania () w poprawnym miejscu w pliku manifestu. (zwykle przed aktywnością) –