无法创建闹钟管理器

问题描述:

对不起,我的英语不好。我面临这个问题。我尝试创建持续的警报通知。警报通知必须每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舱单:

<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

你是什么意思_it不工作?你有错误吗?有什么事情发生? – Keppil

+1

什么都没有发生,但我正在等待通知。 – Alex

你可以尝试SystemClock.elapsedRealtime()?

例如为:

alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 1000 * 5, pendingIntent); 

我依稀记得AlarmManager.ELAPSED_REALTIME_WAKEUP需要SystemClock.elapsedRealtime(),而不是System.currentTimeMillis的()

我却无法找到,我之前阅读。我会在找到它时更新。

编辑:

据:AlarmManager.set(int type, long triggerAtMillis, PendingIntent operation) sdk docs..

参数

  • 类型:一ELAPSED_REALTIME,ELAPSED_REALTIME_WAKEUP,RTC,或RTC_WAKEUP的。以毫秒为单位triggerAtMillis时间报警应该 熄灭,使用
  • 合适:时钟(取决于报警类型)。
  • 操作:警报熄灭时执行的操作;通常来自IntentSender.getBroadcast()。

如果你真的想唤醒每10秒,在setRepeating()考虑注:

注意:定时操作(蜱,超时等)更容易和 使用Handler效率更高。

除此之外,如果你只是10秒测试,它是设计不准确的API 19:

注:为API 19日,所有重复报警是不准确的。如果您的 应用程序需要精确的交货时间,那么它必须使用一次性的精确警报,每次重新计划如上所述。传统 应用,其targetSdkVersion比19 API将更早继续 拥有所有的报警,包括重复报警, 为精确治疗。

因此,警报将不会在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。否则,警报将在执行时刻安排,并因此通过。