android-fragments Android从碎片设置警报

7kjnsjlb  于 2022-11-14  发布在  Android
关注(0)|答案(3)|浏览(190)

在Fragment中使用AlarmManager和BroadcastReceiver设置重复报警时遇到真实的问题。在Activity中使用以下代码时没有问题。当移动到Fragment时,BroadcastReceiver从不调用onReceive。
片段:

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>

我只是好奇,我到底哪里做错了?我在想,也许我没有在清单中正确地登记记忆传承人。
谢谢

bbmckpt7

bbmckpt71#

试试这个,开始报警

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

取消报警

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

    alarm.cancel(pintent);
qnyhuwrf

qnyhuwrf2#

将接收方定义更改为以下内容

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

请确保您正在调用startAlarm(View view)以初始化警报。

7z5jn7bk

7z5jn7bk3#

你可能想要的是这样的

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_WAKEUPAlarmManager.ELAPSED_REALTIME_WAKEUP
有一件事你应该注意在5. 0+的最小间隔为一个报警是5分钟。

相关问题