我正在建造一个出租车预订应用程序,我需要每隔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);
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));
}
}
我的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>
adb shell dumpsys alarm
com.taxeeta
51471ms running, 5248 wakeups
5248 alarms: flg=0x4 cmp=com.taxeeta/.HomeScreen$OnAlarmReceiver
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
答案 0 :(得分: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>
答案 1 :(得分:1)
如果上述答案对您不起作用,那么当AlarmManager
触发过期警报时, 不 会有另一种方式接收任何回调。您只需要检查一下:在Intent
的实例化上发送错误的PendingIntent
。例如,您希望在其中一个接收方上接听电话onReceive
,但是您通过PendingIntent
或getActivity
实例化getService
,但实际上您的意思是{{1} }。
创建getReceiver
的实例时,有很多方法可以创建它PendingIntent
,getService
,getActivity
,getReceiver
:
如果您想要getForegroundService
意图的接收者,那么您:
Activity
如果你想PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_*);
意图的接收者:
BroadcastReceiver
如果你想要一个前景PendingIntent.getReceiver(this, 0, intent, PendingIntent.FLAG_*);
意图的接收者:
Service
如果你想要PendingIntent.getForegroundService(this, 0, intent, PendingIntent.FLAG_*);
意图的接收者:
Service
此外,请确保您的意图指向正确的类。 (例如,为活动,服务等创建意图)。如果您错误地通过这样的话,不会收到任何电话:
PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_*);
我也发布了类似的答案here。
HTH
答案 2 :(得分:1)
上述解决方案对我不起作用。
另外,通过代码动态注册可以达到目的:
Intent intent = new Intent();
intent.setAction("android.intent.action.NOTIFY");
//Register the receiver
context.registerReceiver(new OnAlarmReceiver(),new IntentFilter());
答案 3 :(得分:0)
这段代码对我有用,并确保你在android清单文件中添加了接收器。
AlarmManager service = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, OnAlarmReceiver.class);
PendingIntent pending = PendingIntent.getBroadcast(context, 0, i,
PendingIntent.FLAG_CANCEL_CURRENT);
Calendar cal = Calendar.getInstance();
// Start 20 seconds after boot completed
cal.add(Calendar.SECOND, 20);
//
// Fetch every 20 seconds
// InexactRepeating allows Android to optimize the energy consumption
service.setInexactRepeating(AlarmManager.RTC_WAKEUP,
cal.getTimeInMillis(), 1000*20, pending);