2

我有一个非常简单的 IntentReceiver 可以在时间变化时接收事件。这是代码:

public class IntentRec extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("IntentRec", intent.getAction());
    }
}

<application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
    <receiver android:name=".IntentRec">
        <intent-filter>
            <action android:name="android.intent.action.TIME_SET"/>
        </intent-filter>
    </receiver>
    <activity android:name="MyActivity"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
</application>

但是,我在应用程序运行时收到了意图。但是,如果我关闭(使用强制关闭)应用程序,则不会调用 onReceive。所以我的问题是,我是否仅在侦听器应用程序运行时才收到意图?我认为意图旨在在应用程序未运行时运行目标侦听器类。

谢谢

4

2 回答 2

6

解决方案很简单:停止单击强制关闭。

在 Android 3.1+ 上,强制关闭将阻止您的应用程序中的任何内容再次运行,直到用户手动运行您的活动,或其他东西(例如,第三方应用程序)启动您的应用程序。


更新

我怀疑您对“停止”一词的多种含义感到困惑。让我们来看看这个过程,避免使用“停止”这个词,看看它是否有帮助。

当您的应用首次安装在 Android 设备上时,它处于被某些人称为“snicklefritzed”的状态。当应用程序处于这种“snicklefritzed”状态时,没有清单注册BroadcastReceiver将起作用。要将应用程序移出“snicklefritzed”状态,某些第三方应用程序(如主屏幕启动器)必须明确请求在您的应用程序中运行某些内容(如活动)。因此,正常的事件过程是用户下载您的应用程序,单击它的启动器图标,然后您的应用程序进入“正常”状态并远离“snickelfritzed”状态。在“正常”状态下,您BroadcastReceiver将正常工作。

假设您BroadcastReceiver是用于ACTION_BOOT_COMPLETED广播的。“snicklefritzed”状态与您的应用程序当前是否正在运行无关 - 它仅取决于您的应用程序是否曾经运行过。因此,如果用户安装了您的应用程序,但在对您的应用程序进行任何操作之前重新启动了他们的手机,您的ACTION_BOOT_COMPLETED接收器将无法在启动时获得控制权。但是,如果用户在您的应用程序中运行某些东西,然后重新启动手机,您的接收器将正常接收ACTION_BOOT_COMPLETED广播。

通常,应用程序会退出“snicklefritzed”状态,并且永远不会返回到该状态。如果用户在“设置”中单击此应用的“强制关闭” ,则会导致应用再次“炸裂”。在这里,用户明确告诉 Android 你的应用程序行为不端,在用户另有说明之前不应再次运行。当然,如果用户再次启动您的活动,您将回到“正常”状态。

于 2012-06-10T23:42:56.367 回答
0

您必须添加android:process=":remote"才能BroadcastReceiver独立于您的活动接收。

<receiver android:name=".IntentRec"
    android:process=":remote"> //We declare that this is in a remote process
    <intent-filter>
        <action android:name="android.intent.action.TIME_SET"/>
    </intent-filter>
</receiver>

干杯,Zed

于 2012-06-10T23:39:26.910 回答