【问题标题】:Android AlarmManager and BroadcastReceiver running in background ServiceAndroid AlarmManager 和 BroadcastReceiver 在后台运行 Service
【发布时间】:2011-08-27 02:07:38
【问题描述】:

我目前在集成 AlarmManager 和 BroadcastReceiver 时遇到问题。

我是我的应用程序,我正在运行一个后台服务,无论该应用程序是否正在运行。我想我让这部分工作正常。后台服务保留一个根据用户位置更改的数组。但是,每天早上 8:00,我希望应用程序将数组变量重置为默认值。在网上看了很多之后,似乎这样做的方法是通过 AlarmManager(每上午 8:00 启动任务)和使用 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。任何想法?我的方法正确吗?

【问题讨论】:

    标签: android broadcastreceiver alarmmanager


    【解决方案1】:

    我是我的应用程序,我正在运行一个后台服务,无论该应用程序是否正在运行。

    请不要。这就是用户使用任务杀手和“设置”的“管理服务”屏幕中的“强制停止”来攻击我们的原因。

    我的主要问题是如何设置 AlarmManager 以在每次设置时调用 thisReceiver。有什么想法吗?

    您没有注册BroadcastReceiver,所以AlarmManager 将无法联系到它。

    请请请请请请重新设计您的服务,使其不必一直运行。无论如何,Android 会因为老旧而扼杀你的服务,所以如果你想要一个可靠稳定的应用程序,无论如何你都需要重新设计。

    【讨论】:

    • 那么您认为我应该如何处理这个问题?基本上,该应用程序的一部分是它将获取用户的位置(可能每 30 分钟一次,无论用户当前是否正在运行该应用程序)。如果用户当前位于 Array 中指定的位置之一并且启用了通知,则将向用户发送通知(并且在一天的剩余时间内无法发送更多通知)。第二天,所有通知都将重新启用(因此需要 AlarmManager)。
    • @ImpStudent: "(可能每 30 分钟一次,无论用户当前是否正在运行应用程序)" -- 使用 AlarmManager 和我的 LocationPoller,所以你不需要保留一直在内存中服务 -- github.com/commonsguy/cwac-locpoll -- 你引用的所有其他内容都应该保存在数据库或其他持久性存储中。
    • 好吧,我做了更多的阅读,似乎实际上可以在不使用后台服务的情况下执行我的预期计划。感谢您的指导。
    • 我尝试过使用 LocationPoller,但不知何故,它从未设法获取我的位置。我目前正在使用模拟器。我已正确按照您的演示和指南进行操作,但它仍然无法检测到我的位置。知道有什么问题吗?
    • 您需要通过 DDMS 或 telnet 向模拟器提供位置,而 LocationPoller 正在寻找修复程序(即,有一个活动的 requestLocationUpdates()。就个人而言,我只尝试过 LocationPoller在硬件上,所以可能存在一些我不知道的特定于模拟器的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多