0

在使用来自片段内的AlarmManager和BroadcastReceiver设置重复报警时存在实际问题。以下代码在活动中没有问题。移动到片段时,BroadcastReceiver从不会调用onReceive。Android设置来自片段的报警

片段:

public void startAlarm(View view) { 

    Log.i(TAG, "startAlarm"); 

    mAlarmMgr  = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE); 
    Intent intent = new Intent(getActivity(), AlarmReceiver.class); 
    mAlarmIntent = PendingIntent.getBroadcast(getActivity(), 0, intent, 0); 

    mAlarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
          SystemClock.elapsedRealtime(), 
          60 * 1000, 
          mAlarmIntent); 
} 

public void cancelAlarm(View view) { 

    Log.i(TAG, "cancelAlarm"); 

    // If the alarm has been set, cancel it. 
    if (mAlarmMgr!= null) { 
     mAlarmMgr.cancel(mAlarmIntent); 
    } 
} 

报警:

public class AlarmReceiver extends BroadcastReceiver { 

private static final String TAG = AlarmReceiver.class.getName(); 

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

    Log.i(TAG, "onReceive"); 

    // For our recurring task, we'll just display a message 
    Toast.makeText(context, "I'm running", Toast.LENGTH_SHORT).show(); 
}} 

清单:

<receiver android:name=".alarms.AlarmReceiver"> 
    </receiver> 

只是好奇,我可能去错了吗?我在想,也许我没有在Manifest中正确注册Receiver。

感谢

回答

0

接收机定义更改为以下

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

确保您所呼叫startAlarm(View view)初始化报警。

+0

'receiver'元素'启用= TRUE;默认情况下,所以这是多余的。除非您打算让设备上的其他应用程序调用您的接收器,否则您不应该导出您的'BroadcastReceiver'。 – JBirdVegas

+0

谢谢。我已经尝试了这个以及使用android:name的完整软件包名称。仍然没有运气。 – dragnet

0

你可能需要的是更多的东西像这样

private setRepeatingAlarm(Context context) { 
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    Intent intent = new Intent(context, AlarmReceiver.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 
    long interval = 60 * 1000; 
    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent); 
} 

这里的主要区别是使用AlarmManager.RTC_WAKEUP VS AlarmManager.ELAPSED_REALTIME_WAKEUP

有一件事你应该警惕在5.0以上的警报间隔时间是5分钟。

+0

谢谢。尝试了这种方法,并尝试了不精确和间隔重复。已经尝试了RTC_WAKEUP和ELAPSED_REALTIME_WAKEUP以及更长和更短的时间间隔。仍然没有运气。就像我上面提到的那样,所有的代码都可以在预期的Activity中调用。当我将开始和取消方法移动到Fragment时,方法被调用,但没有设置警报。 – dragnet

0

试试这个, 开始alaram

Intent intent = new Intent(getActivity(), Services.class); 
Services.shouldContinue=true; 
Calendar cal = Calendar.getInstance(); 
pintent = PendingIntent.getService(getActivity(), 0, intent, 0); 
alarm = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE); 
if (Services.shouldContinue) { 
alarm.setRepeating(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), 5 * 1000, pintent);   
} 

取消alaram

Services.shouldContinue = false; 
    if (intent != null) { 
     getActivity().stopService(intent); 
    } 

    alarm.cancel(pintent);