该应用程序未启动时会收到广播吗?

Will the app receive Broadcast when it's not launched?

在我的项目中,我有两个模块:"app" 和 "outerscheme"。在应用程序中,有一个 MainBroadcastReceiver(扩展 Broadcast)。在 outerscheme 中,有一个 MainActivity(扩展 Activity)。代码如下:

外部方案MainActivity核心代码:

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.activity: // start SecondActivity in app module by implicit
            Intent activityIntent = new Intent("SecondActivity");
            activityIntent.setData(Uri.parse("SteveqiSecondActivity://"));
            startActivity(activityIntent);
            break;
        case R.id.broadcast: // start MainBroadcastReceiver in app module by implicit
            Intent broadcastIntent = new Intent();
            broadcastIntent.setAction("Broadcast");
            // add this the app module may be wakeup.
            broadcastIntent.setData(Uri.parse("SteveqiBroadcast://"));
            sendBroadcast(broadcastIntent);
        default:
            break;
    }
}

app Manifest核心代码:

     <activity
        android:name="com.twlkyao.myscheme.SecondActivity"
        android:label="@string/title_activity_second"
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="SecondActivity" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="SteveqiSecondActivity" />
        </intent-filter>
    </activity>   
    <receiver android:name="com.twlkyao.myscheme.MainBroadcastReceiver">
        <intent-filter>
            <action android:name="Broadcast" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="SteveqiBroadcast" />
        </intent-filter>
    </receiver>

第一部分:

当点击R.id.activity按钮时,app模块中的SecondActivity就起来了,所以作为app模块,此时点击R.id.broadcast按钮,MainBroadcastReceiver可以接收广播,然后杀掉app模块进程,点击R.id.broadcast按钮,MainBroadcastReceiver可以再次接收广播,再次杀掉app模块进程,点击R.id.broadcast按钮MainBroadcastReceiver 永远收不到广播。

第二部分:

当我删除 MainBroadcastReceiver 的行 <data android:scheme="SteveqiBroadcast" /> 并重复 第 I 部分 步骤时, MainBroadcastReceiver 永远收不到广播。

我的问题是:

1.Is 应用程序模块必须处于活动状态以便 BroadcastReceiver 可以接收广播?

2.Why当<data android:scheme="SteveqiBroadcast" />存在时BroadcastReceiver可以接收广播,不退出则收不到广播?

如果您为它设置WAKE_LOCK权限,该应用程序仍然可以接收来自广播的消息:

  <uses-permission android:name="android.permission.WAKE_LOCK" />

我对你问题的回答

1) 不需要,但在动态广播接收器的情况下,您的广播接收器将处于活动状态,直到 unRegisterReceiver 被调用

2)广播一个意图时你设置了dada

   Intent broadcastIntent = new Intent();
   broadcastIntent.setAction("Broadcast");
   // add this the app module may be wakeup.
   broadcastIntent.setData(Uri.parse("SteveqiBroadcast://"));//Check this
   sendBroadcast(broadcastIntent);

在您的清单中,您的 Intent 过滤器期望数据(SteveqiBroadcast://)通过广播意图发送

  <data android:scheme="SteveqiBroadcast" />

因此,如果您从清单中删除上述架构,它将不会收到广播。 如果你也想在这种情况下接收广播,请删除

  broadcastIntent.setData(Uri.parse("SteveqiBroadcast://")); 

我已经解决了问题,是ROM的原因,我认为MIUI限制了Broadcast,我已经成功运行三星phone.