2011-08-27 94 views
1

我目前遇到了集成AlarmManager和BroadcastReceiver的问题。在后台运行的Android AlarmManager和BroadcastReceiver服务

我的应用程序,我正在运行一个后台服务,运行无论该应用程序是否运行。我想我得到这部分工作正常。后台服务保留一个根据用户位置而变化的数组。但是,每天早上8点,我希望应用程序将数组变量重置为默认值。经过在线观看后,似乎要通过AlarmManager(每8点钟启动一次任务)和使用BroadcastReceiver(接收警报并执行任务)来完成此任务。

所以基本上代码是这样的:

public class BackgroundService extends Service { 

    private ArrayList thisArray; 

    private BroadcastReceiver thisReceiver = new BroadcastReceiver(){ 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      setArrayToDefault(); 
     } 

    } 

    @Override 
    public void onCreate(){ 

     super.onCreate(); 
     Calendar cal = new GregorianCalendar(); 
     cal.add(Calendar.MINUTE, 2); //example 

     this.registerReceiver(thisReceiver, new IntentFilter("BackgroundService")); 

     AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), ONE_MINUTE, "what to put here?"); //example, repeat every minute 

    } 

    private void setArrayToDefault(){ 
     //here, the array will be changed back to default values 
    } 
} 

我的主要问题是如何设置AlarmManager调用thisReceiver每次它的设置。任何想法?我的方法是否正确?

回答

1

即时通讯我的应用程序,我正在运行一个后台服务,无论该应用程序运行或不运行。

请不要。这就是为什么用户在设置中的管理服务屏幕上用任务杀手和强制停止攻击我们的原因。

我的主要问题是如何设置AlarmManager在每次设置时调用thisReceiver。任何想法?

您尚未注册BroadcastReceiver,因此AlarmManager将无法​​与其联系。

请请请请请请请重新设计您的服务,使它不必运行的所有时间。无论如何,Android会因老年时期而失去你的服务,所以如果你想要一个可靠和稳定的应用程序,无论如何你都需要重新设计。

+0

那么你认为我应该如何解决这个问题?基本上应用程序的一部分是它将获取用户的位置(可能每隔30分钟,无论用户当前是否在运行应用程序)。如果用户当前位于阵列中指定的位置之一并启用了通知,则会向用户发送通知(并且在当天剩余时间内不会再发送通知)。第二天,所有通知将被重新启用(因此需要AlarmManager)。 – ImpStudent

+1

@ImpStudent:“(可能每隔30分钟,无论用户是否正在运行应用程序)” - 使用AlarmManager和我的LocationPoller,因此您无需将服务始终保存在内存中 - https://github.com/commonsguy/cwac-locpoll - 你引用的所有东西都应该保存在数据库或其他持久存储中。 – CommonsWare

+0

好吧我做了更多的阅读,它似乎实际上可以做到我的计划没有使用后台服务。感谢您的指导。 – ImpStudent