【问题标题】:App lifecycle and broadcast receivers应用程序生命周期和广播接收器
【发布时间】:2012-12-29 11:08:56
【问题描述】:

我想知道当您从主要活动中创建广播接收器(在我的情况下为接近警报接收器)时会发生什么情况,并且应用程序进程由于某种未知原因而被终止?

我希望在我注册的广播接收器中接收我的接近警报,无论我的应用程序状态如何,这会发生还是我需要做一些特别的事情来确保这一点?

编辑澄清:

我必须从我的应用程序中注册接收器,而不是通过清单。由于我想要多个邻近警报,因此对于每个(不同的)位置,我需要动态创建接收器,因为我需要为每个位置注册接收器,并使用唯一的 id,不幸的是。

用于创建我的意图/待定意图/广播接收器的代码:

    double latitude = location.getLat();
    double longitude = location.getLon();
    Intent intent = new Intent(PROX_ALERT_INTENT_ID);
    PendingIntent proximityIntent = PendingIntent.getBroadcast(activity.getApplicationContext(), 0, intent, 0);
    lm.addProximityAlert(
        latitude, // the latitude of the central point of the alert region
        longitude, // the longitude of the central point of the alert region
        POINT_RADIUS, // the radius of the central point of the alert region, in meters
        PROX_ALERT_EXPIRATION, // time for this proximity alert, in milliseconds, or -1 to indicate no                           expiration
        proximityIntent // will be used to generate an Intent to fire when entry to or exit from the alert region is detected
    );

    IntentFilter filter = new IntentFilter(PROX_ALERT_INTENT_ID);

    activity.registerReceiver(new ProximityIntentReceiver(location), filter);

【问题讨论】:

    标签: android broadcastreceiver broadcasting


    【解决方案1】:

    如果您想让您的BroadcastReceivers 触发而不管您的应用程序状态如何,那么您应该通过您的应用程序AndroidManifest.xml 文件注册它们。

    这是怎么做的。

    1. 定义一个扩展BroadcastReceiver 的类并实现onReceive() 方法。 我看到你已经这样做了 - ProximityIntentReceiver 就是那个类。

    2. 在您的 AndroidManifest.xml 文件中添加:

      <application>
      ...
          <receiver
              android:name=".MyReceiver"
              android:exported="false" >
              <intent-filter>
                     <action android:name="my.app.ACTION" />
              </intent-filter>
          </receiver> 
      </application>
      

    MyReceiver 是您的接收器类的名称(在您的情况下为 ProximityIntentReceiver),而 my.app.ACTION 是您的接收器将侦听的操作(在您的情况下,我猜这是 @ 的值987654329@)。

    注意:说你的接收者的名字是.MyReceiver 假设它位于你的应用程序的根包中。如果不是这种情况,那么您需要提供从根目录开始的该类的路径。

    【讨论】:

    • 您好!非常感谢您花时间回复。我已经编辑了我的问题以澄清。问题是如果我想监听多个接近警报,我认为我必须从应用程序中创建它,因为在这种情况下我需要注册多个过滤器,当然它们必须动态创建。
    • @Mathias:您必须找到一些方法来通过在清单中注册您的接收器来实现您的目标。您不能动态注册接收器在您的应用未运行时让它们可用。您可以使用单个BroadcastReceiver 注册多个接近警报,方法是在每个PendingIntent 中打包不同的附加内容,使用getBroadcast() 的第二个参数为PendingIntent 提供不同的ID 值,这样它们就不会全部最终成为同一个对象。
    • @CommonsWare 感谢您抽出宝贵时间!这是一个棘手的问题。看,如果我想拥有多个 ProximityAlerts,我必须使用不同的意图 ID 注册它们。但是我不能事先知道那些(我不知道会有多少),所以我看不到如何将它放在清单中,因为意图过滤器是静态的,我不知道事先说明意图过滤器 ID 字符串是什么...
    • @Mathias:请重新阅读我的评论。有一个“intent-filter ID 字符串”。您不需要多个“意图过滤器 ID 字符串”值来拥有多个未完成的 PendingIntent 对象。而且,当一个就足够时,您不需要多个“意图过滤器 ID 字符串”来接收广播。您正在发明自己的问题,然后在您的问题成为问题时抱怨。
    • 您好,再次感谢您抽出宝贵时间。我认为/认为我的意图/待定意图中需要不同 ID 的原因是各种线程说,除非您向“addProximityAlert”发送具有不同意图 ID 的不同意图,否则它们将被简单地覆盖并且只使用最后一个。 (见我上面的代码)。 IE。要同时发出不同的邻近警报,您需要具有不同 ID 的不同意图。不过我可能错了……
    【解决方案2】:

    @Mathias:我动态注册广播接收器并在应用程序被终止时仍处于活动状态的方式是运行服务并从那里注册接收器。希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 2014-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多