1

无论我如何尝试,我都无法让alarmManager和接收器工作 - 似乎有很多不同的方法可以从我搜索的东西中完成它,但似乎没有任何工作。无法获取AlarmManager和广播工作

我在清单:

<receiver android:name="AlarmReceiver" /> 

我使用内部类的广播接收器:

private class AlarmReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d("ALARM","TRIGGERED"); 
     Notification(filteredList.get(0).getTitle()); 
    } 

} 

我打电话功能SetAlarm启动管理器:

private void SetAlarm(long time) { 

    AlarmManager alarm_mgr = (AlarmManager)(this.getSystemService(Context.ALARM_SERVICE)); 
    Intent intent = new Intent(MainActivity.this, AlarmReceiver.class); 
    //PendingIntent pi = PendingIntent.getService(MainActivity.this, 0, intent, 0); 
    PendingIntent pi = PendingIntent.getBroadcast(this, 111, intent, PendingIntent.FLAG_UPDATE_CURRENT); 


    Calendar calendar = Calendar.getInstance(); 
    alarm_mgr.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pi); 
    Log.d("ALARMSET", "Alarm " + calendar.getTime().toString()); 
} 

,你可以看到,在接收器中我有一个通知电话 - 我不会发布,因为我知道这个工程,但有也是一个不工作的日志。 出于测试目的,我使用日历功能将时间设置为当前时间。 你可以看到pendingIntent,我已经尝试了getService和getBroadcast,我无法弄清楚我需要哪个,但无论如何都不工作。

我确定我错过了一些东西,我不知道是什么,而且我似乎无法在Google上找到任何答案。

AlarmReceiver可以作为内部类吗?我已经把它放在那里,因为我需要访问我的“filteredList”列表对象。

THX

回答

0

没有,居然BroadcastReceiver需求是public.Only那么您可以在清单它注册和访问它们。将AlarmReceiver代码放置在单独的.java文件中。您将在BroadcastReceiver内看到日志。

+0

没错的作品,现在只需要找到一种方法来访问我的列表对象,这样我就可以在通知中使用特定的消息。我可以通过接收器中的字符串? – makapaka 2014-12-04 14:15:33

+0

http://stackoverflow.com/questions/3125009/android-passing-data-from-activity-to-broadcastreceiver-shows-null将帮助你实现将数据传递到广播接收器。如果其工作那么在哪里接受我的答案:-) – MathanG 2014-12-04 14:34:57

+0

烨我忘了额外的第二.. THX! – makapaka 2014-12-04 14:38:29

0

试试这个

private AlarmManager alarmMgr; 
private PendingIntent alarmIntent; 

...

alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
Intent intent = new Intent(context, AlarmReceiver.class); 
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 

// Set the alarm to start at 8:30 a.m. 
Calendar calendar = Calendar.getInstance(); 
calendar.setTimeInMillis(System.currentTimeMillis()); 
calendar.set(Calendar.HOUR_OF_DAY, 8); 
calendar.set(Calendar.MINUTE, 30); 

// setRepeating() lets you specify a precise custom interval--in this case, 
// 20 minutes. 
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
    1000 * 60 * 20, alarmIntent); 

更多细节。看this

1

我使用内部类的广播接收器:

这不起作用。 Android必须能够创建BroadcastReceiver的实例,并且它不能这样做。充其量,你BroadcastReceiver可能是一个静态嵌套类,但你将不得不解决您的清单条目来引用外部类:

<receiver android:name="OuterClass$AlarmReceiver" /> 
0

我stucked 1天这个问题,终于解决了这个。

AlarmManager用来生成广播每30秒,和广播接收器,用于接收该消息并执行...

所以主要的问题是以下2个步骤中

1.在AndroidManifist.xml需要一个操作过滤器。

<receiver android:name="com.istep.gps.straight.MyTimerReceiver"> 
      <intent-filter> 
       <action android:name="com.istep.gps.straight.MyTimerReceiver.Action"/> 
      </intent-filter> 
</receiver> 

2.最重要的是意向需要是空的,没有任何的aaa.class

private void initTimer(Context context) { 
     Intent intent = new Intent().setAction("com.istep.gps.straight.MyTimerReceiver.Action") 
       .putExtra("id",UniqueID.getID(context)); 

     PendingIntent sender = PendingIntent.getBroadcast(context, 18, intent, 0); 
     AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 1000 * 30, sender); 
    } 
0

当您使用日历,你应该setTimeInMillis

Calendar calendar = Calendar.getInstance(); 
calendar.setTimeInMillis(System.currentTimeMillis());