2013-07-16 4 views
19

내 앱에서 AlarmManager을 사용하여 특정 시간에 매일 일부 코드를 실행하고 싶습니다. android documentation에서 이것을 발견했습니다 :장치가 다시 부팅되면 AlarmManager를 시작하십시오.

등록 된 알람은 장치가 잠든 동안은 유지되지만 [...] 꺼지면 재부팅됩니다.

그리고 이것이 문제입니다. 사용자가 전화를 재부팅해도 코드를 실행하고 싶습니다. 사용자가 전화를 재부팅하면 현재 알람을 시작하기 위해 앱을 다시 실행해야합니다. 이 문제를 어떻게 방지 할 수 있습니까? 대신에 사용해야하는 더 나은 메커니즘이 있습니까?

+1

완전한 부팅을위한 reciver입니다을 만들고 이전 경보 경우 (일반 알람 매니저를 설정 ... 이런 일 경보의 간단한 시작이다 당신의 앱도 거기에 있습니다.) –

+1

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

+0

매우 유용한 질문입니다. – ivanleoncz

답변

31

부팅 수신기 사용하여 다음 코드 만들기 : 매니페스트에서

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

을, 이 방송 수신기 등록 :

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

그리고 잊지 말라가의 AndroidManifest.xml에 권한을 추가합니다 :

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

사용이 유가

장치 부팅 브로드 캐스트 리시버를 사용하여 서비스를 만들 수 있습니다
<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> 

권한 :

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

당신이

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

같은 매니페스트에 부팅 수신기를 추가해야합니다

그런 다음 아래와 같은 부트 수신기 클래스를 만듭니다. 이 ...

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

내 알람 헬퍼 클래스는

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

매니페스트 파일의 올바른 위치에 사용 권한 ()을 넣어야합니다. (대개 활동 전) –

관련 문제