应用会在未启动时收到广播吗?

时间:2016-04-07 07:49:17

标签: android android-intent android-activity android-broadcastreceiver

我有两个模块,app和outersheme,模块应用中有MainBroadcastReceiver(扩展Broadcast),outersheme中有MainActivity(扩展Activity) ,代码如下:

outershceme 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按钮后,应用模块中的SecondActivity已启动,因此作为应用模块,此时点击R.id.broadcast按钮,MainBroadcastReceiver即可接收广播,然后终止app模块的进程,单击R.id.broadcast按钮,MainBroadcastReceiver可以再次接收广播,再次杀死app模块,然后单击R.id.broadcast按钮{ {1}}永远无法接收广播。

第二部分:

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

我的问题是:

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

2.为什么BroadcastReceiver可能会在BroadcastReceiver存在时收到广播,并且在线路未退出时无法接收广播?

3 个答案:

答案 0 :(得分:1)

我已经解决了这个问题,因为ROM,我认为MIUI限制了Broadcast,我已经在SamSung手机上成功运行了演示。

答案 1 :(得分:0)

如果你为它设置 WAKE_LOCK 权限,应用程序仍然可以从广播接收消息:

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

答案 2 :(得分:0)

我对你问题的回答

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);

在你的Manifest内你的Intent过滤器期望通过广播意图发送的数据( SteveqiBroadcast://

  <data android:scheme="SteveqiBroadcast" />

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

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