【问题标题】:AlarmManager android calling specific methodAlarmManager android调用具体方法
【发布时间】:2012-12-19 01:41:26
【问题描述】:

我目前正在开发一个应用程序,我正在使用此邮政编码来获取 GPS 锁定。 What is the simplest and most robust way to get the user's current location on Android?

它就像一个魅力!它非常适合我的要求。 我现在要做的是每 10 分钟触发一次此方法以获取 gps 信号并将其保存在 txt 文件中。 我的问题是我一直无法理解 AlarmManager 是如何工作的,因为它调用 AFAIK 活动的 onCreate() 方法。 即使电话处于休眠状态,如何让 AlarmManager 在后台每 10 分钟调用一次特定方法?

编辑 2: 我使用了 A--C 提供的代码,但由于某种原因,警报没有调用我的类 AlarmBroadcastReceiver 上的方法。 这是我在 MainActivity 中的方法。

    Intent intent = new Intent (this, AlarmBroadcastReceiver.class);
    PendingIntent pendIntent = PendingIntent.getBroadcast(this, 1,  intent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager = (AlarmManager) getSystemService (Context.ALARM_SERVICE);
    alarmManager.cancel(pendIntent); //cancel if active already

    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis()+4000,
            4000, pendIntent);

在 AlarmBroadcastReceiver 类中。

    public class AlarmBroadcastReceiver extends BroadcastReceiver{
public float accuracy;
public double latitude;
public double longitud;
public static boolean Activado=false;
public void onReceive(Context context, Intent intent) {
Log.d("AlarmManager", "Method onReceiveCalled");
    }

我做错了什么?

【问题讨论】:

    标签: java android eclipse events sdk


    【解决方案1】:

    除非Activity 的方法是静态的并且在同一个进程中运行,否则您不能通过 Intents 运行单个方法。

    您可以通过它的 Intent 将额外内容传递给您的 Activity,该 Intent 指定它应该做什么,并在 onCreate() 中处理其逻辑。

    您也可以尝试将功能直接放在 AlarmReceiver 中,因为您可以在该类中使用它。

    当然,您可以将 Activity 替换为处理此问题的后台服务。

    最后,由于您每 10 分钟保存到一个文本文件,因此您可以创建一个专门用于保存的类。您所做的就是从您需要的任何地方使用StringContext 调用该类(我假设文件操作需要Context)。这可以与您的 GPS 代码集成,很可能与另一个构造函数集成,以便 GPS 类知道它专门获取位置并保存它。

    以下是警报设置的示例:

        Intent intent = new Intent (this, AlarmBroadcastReceiver.class);
        PendingIntent pendIntent = PendingIntent.getBroadcast(this, 1,  intent, PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager alarmManager = (AlarmManager) getSystemService (Context.ALARM_SERVICE);
        alarmManager.cancel(pendIntent); //cancel if active already
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis()+600000,
                600000, pendIntent);
    

    所以你需要一个 Intent,它会变成一个 PendingIntent。然后你需要获取一个 AlarmManager 实例。我的代码的最后一行提前 10 分钟注册警报,重复 10 分钟。 AlarmManager.RTC_WAKEUP 强制手机唤醒执行闹钟。

    【讨论】:

    • 我的问题是,触发警报时将调用哪个方法。 onCreate()?好像打开了应用一样?
    • 如果您从 AlarmReceiver 调用 Activity,是的。我上面的代码会触发AlarmReceiver,它是一个BroadcastReceiverBroadcastReceivers 没有用户界面。
    • 我已经稍微编辑了我的问题,因为我现在面临一个不同的问题!
    • 你在 android manifest 中有这行吗? <receiver android:name=".AlarmBroadcastReceiver" > </receiver> ?
    猜你喜欢
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多