Android 应用程序生命周期和广播接收器

Android 应用程序生命周期和广播接收器,android,broadcastreceiver,broadcasting,Android,Broadcastreceiver,Broadcasting,我想知道当你从你的主要活动中创建一个广播接收器(在我的例子中是一个接近警报接收器)时,会发生什么情况,而应用程序进程由于未知原因被终止 我希望在我注册的广播接收器中接收到我的近距离警报,无论我的应用程序状态如何,这会发生吗?或者我是否需要特别采取措施来确保这一点 编辑以澄清: 我必须从我的应用程序中注册接收者,而不是通过清单。由于我需要多个Proximitylert,对于每个(变化的)位置,我将需要动态创建接收器,因为我需要为每个位置注册接收器,不幸的是,使用唯一的id 创建我的意图/挂起内容/

我想知道当你从你的主要活动中创建一个广播接收器(在我的例子中是一个接近警报接收器)时,会发生什么情况,而应用程序进程由于未知原因被终止

我希望在我注册的广播接收器中接收到我的近距离警报,无论我的应用程序状态如何,这会发生吗?或者我是否需要特别采取措施来确保这一点

编辑以澄清:

我必须从我的应用程序中注册接收者,而不是通过清单。由于我需要多个Proximitylert,对于每个(变化的)位置,我将需要动态创建接收器,因为我需要为每个位置注册接收器,不幸的是,使用唯一的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);

如果无论应用程序的状态如何,您都希望触发您的
广播接收器
,那么您应该通过应用程序
AndroidManifest.xml
文件注册它们

这是怎么做的

  • 定义一个扩展
    BroadcastReceiver
    的类,并实现
    onReceive()
    方法。 我看到您已经完成了-
    ProximityIntentReceiver
    就是那个类

  • 在AndroidManifest.xml文件中添加:

    
    ...
    
  • 其中,
    MyReceiver
    是您的接收方类的名称(
    ProximityIntentReceiver
    ),my.app.ACTION是接收方将侦听的操作(在您的情况下,我猜是
    PROX\u ALERT\u INTENT\u ID


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

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

    你好!非常感谢您花时间回复。我编辑了我的问题以澄清。问题是,如果我想监听多个近距离警报,我想我必须从应用程序中创建它,因为在这种情况下,我需要注册多个过滤器,当然它们必须动态创建。@Mathias:你必须找到某种方法,通过在清单中注册接收者来实现你的目标。当应用程序未运行时,您无法动态注册接收器并使其可用。通过在每个
    pendingent
    中打包不同的额外内容,使用
    getBroadcast()的第二个参数,您可以使用单个
    broadcast接收器注册多个接近警报
    PendingContent
    提供一个不同的ID值,这样它们最终不会成为同一个对象。@Commonware感谢您的时间!这是个棘手的问题。看,如果我想有多个Proximityalert,我必须用不同的意图ID注册它们。但是我不能事先知道这些(我不知道其中有多少个),所以我看不出如何将其放入清单中,因为意图过滤器是静态的,我事先不知道意图过滤器ID字符串是什么…@Mathias:请重新阅读我的评论。有一个“意图过滤器ID字符串”。您不需要多个“intent filter ID string”值就可以拥有多个未完成的
    pendingent
    对象。而且,当一个“意图过滤器ID字符串”足够时,您不需要多个“意图过滤器ID字符串”来接收广播。你在创造你自己的问题,然后当你的问题成为问题时抱怨。嘿,再次感谢你抽出时间。我认为/认为在我的意图/挂起内容中需要不同ID的原因是不同的线程表示,除非您使用不同的意图ID向“addProximityAlert”发送不同的意图,否则它们将被覆盖,并且只使用最后一个。(参见上面的代码)。也就是说,要同时拥有不同的Proximityalert,您需要具有不同ID的不同意图。但我可能错了。。。
    <application>
    ...
        <receiver
            android:name=".MyReceiver"
            android:exported="false" >
            <intent-filter>
                   <action android:name="my.app.ACTION" />
            </intent-filter>
        </receiver> 
    </application>