抱歉我的英语不好。我遇到了这个问题。我尝试创建持久警报通知。警报通知必须每10秒钟开始一次。我正在使用Alarm Manager,但它确实无法正常工作。我做错了什么?
public class RemindReceiver extends BroadcastReceiver {
private Class<?> activityClass;
public RemindReceiver() {
}
public RemindReceiver(Class<?> activityClass) {
this.activityClass = activityClass;
}
@Override
public void onReceive(Context context, Intent intent) {
NotificationManager notifyManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(R.mipmap.ic_launcher, "Some Text", System.currentTimeMillis());
Intent intentTL = new Intent(context, activityClass);
notification.setLatestEventInfo(context, "Title", "Some Text",
PendingIntent.getActivity(context, 0, intentTL, PendingIntent.FLAG_CANCEL_CURRENT));
notification.flags = Notification.DEFAULT_LIGHTS | Notification.FLAG_AUTO_CANCEL;
notifyManager.notify(1, notification);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, System.currentTimeMillis(), 1000 * 5, pendingIntent);
}
public void setRemind(Context context) {
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, RemindReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, System.currentTimeMillis(), 1000 * 5 , pendingIntent);
}}
片段:
public class PersonListFragment extends Fragment {
private RemindReceiver remindReceiver;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.person_list_fragment_layout, container, false);
Button nextButton = (Button) rootView.findViewById(R.id.next_button);
ListView personListView = (ListView) rootView.findViewById(R.id.name_list_view);
List<Person> personList = PersonListGenerator.generate();
PersonListAdapter adapter = new PersonListAdapter(getActivity(), personList);
personListView.setAdapter(adapter);
Context context = getActivity().getApplicationContext();
remindReceiver = new RemindReceiver(PersonListActivity.class);
remindReceiver.setRemind(context);
remindReceiver.onReceive(getActivity(), new Intent());
nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getActivity(), ExpandablePersonListActivity.class);
startActivity(intent);
}
});
return rootView;
}}
我的Android Manifest:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<receiver android:name=".utility.RemindReceiver"
android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
答案 0 :(得分:0)
你能试试SystemClock.elapsedRealtime()吗?
e.g:
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 1000 * 5, pendingIntent);
我依旧记得需要SystemClock.elapsedRealtime()的AlarmManager.ELAPSED_REALTIME_WAKEUP而不是System.currentTimeMillis()
然而,我无法找到我以前读到的地方。我发现它时会更新。编辑:
根据:AlarmManager.set(int type, long triggerAtMillis, PendingIntent operation) sdk docs..
参数
- type:ELAPSED_REALTIME,ELAPSED_REALTIME_WAKEUP,RTC或RTC_WAKEUP之一。 triggerAtMillis警报应该以毫秒为单位的时间 离开,使用
- 适当:时钟(取决于闹钟类型)。
- 操作:警报响起时执行的操作;通常来自IntentSender.getBroadcast()。
答案 1 :(得分:0)
如果您真的想每隔<强> 10秒醒来,请考虑setRepeating()
处的说明:
注意:对于计时操作(刻度,超时等),它更容易 使用
Handler
更有效率。
除此之外,如果您只是测试10秒,那么从API 19开始设计不准确:
注意:从API 19开始,所有重复警报都不准确。如果你的 应用程序需要精确的交付时间,然后必须使用一次性 确切的警报,每次重新安排,如上所述。遗产 targetSdkVersion早于API 19的应用程序将 继续发出所有警报,包括重复警报, 确切地对待。
因此,警报将不会在10秒内发出,因为它会被延迟。
对我来说,这意味着有时会等待一分钟或更长时间才能报警,这在API-19之前有效。
因此,只有在不使用setRepeating
时才能获得准确的警报唤醒行为。
(除此之外,@ Damian有正确的方向,答案是时间需要匹配):使用
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + 1000 * 5,
1000 * 5,
pendingIntent);
或尝试当前的系统时间:
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis() + 1000 * 5,
1000 * 5,
pendingIntent);
请更改您的代码以包含+1000 * 5
。否则警报会在执行时安排,因此通过。