如果一个应用程序是为了运行状态触发意图是什么?(Should an app be in runnin

2019-09-18 00:12发布

我有一个非常简单的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不叫。 所以我的问题是,我收到意图监听应用程序正在运行,只有当? 我认为意图被设计为运行目标监听器类,当应用程序没有运行。

谢谢

Answer 1:

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

在Android 3.1+,强制关闭会阻止你的应用程序从任何重新运行,直到用户手动运行你的一个活动,或者其他什么东西(例如,第三方应用程序)启动您的应用程序。


UPDATE

我怀疑你正在这个词的多重含义混淆“停止”。 让我们穿行的过程中,避免了单词“停止”,看它是否有帮助。

当你的应用程序在第一次安装在Android设备上,是已知的一些如“snicklefritzed”的状态。 而应用程序是在这个“snicklefritzed”状态,没有明显注册的BroadcastReceiver正常工作。 要移动应用了“snicklefritzed”状态,一些第三方的应用程序(如主屏幕发射器)必须明确要求来运行你的应用程序的东西(如活动)。 所以,事件的正常过程是用户下载你的应用程序,在启动器图标点击它,你的应用程序移动到“正常”状态,并从“snickelfritzed”状态了。 而在“正常”状态,你的BroadcastReceiver将正常工作。

让我们假设你的BroadcastReceiver是针对ACTION_BOOT_COMPLETED广播。 该“snicklefritzed”状态无关,与你的应用程序当前是否正在运行或不-这仅取决于如果你的应用程序曾经运行与否。 因此,如果用户安装的应用程序,但与你的应用程序做任何事情之前重新启动他们的电话,你ACTION_BOOT_COMPLETED接收器不会得到在开机时间控制。 但是,如果用户运行在您的应用程序的东西, 然后重启手机,您的接收器将接收ACTION_BOOT_COMPLETED正常播出。

通常情况下,应用程序搬出“snicklefritzed”状态,并且永远不会返回到该状态。 有一两件事,这导致一个应用程序被“snicklefritzed”再次是,如果用户点击强制关闭这个应用程序中的设置。 在这里,直到用户说,否则用户明确告知的Android您的应用程序行为不正常,不应该再运行。 如果,当然,用户再次启动您的活动,您将回到“正常”状态。



Answer 2:

你要添加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>

欢呼声中,捷思锐



文章来源: Should an app be in running state in order to trigger intent?