没有调用BroadcastReceiver的onReceiver,AlarmManager

Sid*_*rth 9 android alarmmanager

我正在建造一个出租车预订应用程序,我需要每20秒一次当前的驾驶室位置.

我已经定义了一个AlarmManager,需要它每20秒重复一次.但它并没有经常重复.相反,它在233秒之后重复了一次,而且仅仅一次.我在这做错了什么?

我的HomeScreen有一个内部类OnAlarmReceiver,在我的HomeScreen的onCreate中我调用了AlarmManager

    AlarmManager mgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent i = new Intent(this, OnAlarmReceiver.class);
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);
    Calendar cal = Calendar.getInstance();
    cal.add(Calendar.SECOND, 20);
    mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
            cal.getTimeInMillis(), God.UPDATE_PENDING_INTERVAL, pi);
Run Code Online (Sandbox Code Playgroud)

HomeScreen中的内部类

public class OnAlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // PullPendingRequests.acquireStaticLock(context);
        Toast.makeText(context, "Don't panik but your time is up!!!!.", Toast.LENGTH_LONG)
                .show();
        Log.d("Taxeeta:PullPendingRequets", "CallService Location");
        context.startService(new Intent(context, PullPendingRequests.class));
    }
}
Run Code Online (Sandbox Code Playgroud)

我的AndroidManifest文件有

    <service
        android:name="com.taxeeta.support.PullPendingRequests"
        android:enabled="true"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:theme="@android:style/Theme.Light.NoTitleBar" />

    <receiver android:name=".com.taxeeta.HomeScreen.OnAlarmReceiver" />
</application>
Run Code Online (Sandbox Code Playgroud)

输出 adb shell dumpsys alarm

 com.taxeeta
    51471ms running, 5248 wakeups
    5248 alarms: flg=0x4 cmp=com.taxeeta/.HomeScreen$OnAlarmReceiver
Run Code Online (Sandbox Code Playgroud)

输出 adb shell dumpsys alarm | grep taxeeta

 ELAPSED_WAKEUP #7: Alarm{409303b0 type 2 com.taxeeta}
    operation=PendingIntent{408ba2d8: PendingIntentRecord{40887be8 com.taxeeta broadcastIntent}}
 com.taxeeta
    5248 alarms: flg=0x4 cmp=com.taxeeta/.HomeScreen$OnAlarmReceiver
Run Code Online (Sandbox Code Playgroud)

Sid*_*rth 11

为了解决这个问题,我删除了内部类OnAlarmReceiver并修复了androidmanifest.xml文件.

    <receiver
        android:name="com.taxeeta.support.OnAlarmReceiver"
        android:exported="true" >
        <intent-filter>
            <action android:name="android.intent.action.NOTIFY" />
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)


Neo*_*rge 5

如果上面的答案对您不起作用,那么还有另一种方法可以 在触发过期警报时接收任何回调AlarmManager。您只需要检查一下:通过IntentPendingIntent. 例如,您想onReceive在其中一个接收器上接听电话,但您实例化了一个PendingIntentviagetActivitygetService,但实际上您的意思是getReceiver.

创建 实例时PendingIntent,有多种创建方法(getServicegetActivitygetReceivergetForegroundService

如果你想要Activity意图的接收者,那么你:

PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_*);
Run Code Online (Sandbox Code Playgroud)

如果你想要BroadcastReceiver意图的接收者:

PendingIntent.getReceiver(this, 0, intent, PendingIntent.FLAG_*);
Run Code Online (Sandbox Code Playgroud)

如果你想要一个前景Service的意图的接收者:

PendingIntent.getForegroundService(this, 0, intent, PendingIntent.FLAG_*);
Run Code Online (Sandbox Code Playgroud)

如果你想要一个Service意图的接收者:

PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_*);
Run Code Online (Sandbox Code Playgroud)

另外,请确保您的意图指向正确的类。(例如,为活动、服务等创建意图)。如果您像这样错误地通过,您将不会收到任何电话:

Intent intent = new Intent(this, MyReceiver.class); // You wanted receiver

// PendingIntent was created in such a way 
// you wanted this to be received by an activity. 
// you will not receive any call if you set it up like this.
PendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_*); 
Run Code Online (Sandbox Code Playgroud)

我也在这里发布了类似的答案。

HTH