【问题标题】:android - unable to receive broadcast from a background serviceandroid - 无法从后台服务接收广播
【发布时间】:2016-11-09 18:28:16
【问题描述】:

我正在使用广播接收器和后台服务。因此,当我的活动进行 onPause() 时,我会启动我的服务并且服务会发送一个广播。现在,我的广播接收器与我的服务属于同一类。我正在接到我的服务电话,但我无法接收广播信息。这是我一直在处理的代码.. [编辑]

private String notifier = "ninja.ibtehaz.thenewproject.Activities.activityNew"; 

@Override
protected void onHandleIntent(Intent intent) {

    boolean flag = ProjectApp.getInstance().isActivityVisible();
    Log.e("rainbow", "onHandleIntent");
    if (!flag) {
        //start emergency activity
        Log.e("rainbow", "starting activity");
        Intent broadcastIntent = new Intent(notifier);
        sendBroadcast(broadcastIntent);
    }
}

[编辑]关于activityNew类>

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.e("rainbow", "In Method: Service started");
    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
    filter.addAction(Intent.ACTION_SCREEN_OFF);
    registerReceiver(receiver, filter);
}

private BroadcastReceiver receiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {

        Log.e("rainbow", "In Method: onReceive");

        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            Log.e("rainbow","Screen went OFF");
        }

        if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            Log.e("rainbow","Screen went ON");
        }


    }
};

清单文件:[已编辑]

<service android:name=".Activities.ServiceBackground">
</service> 
<receiver
    android:name=".Activities.ActivityEmergency"
    android:theme="@android:style/Theme.NoDisplay">
</receiver>

这是我的 logcat 信息:

E/rainbow: onHandleIntent
E/rainbow: starting activity

在那之后我什么都没有得到..

我知道这可能不是最佳做法,我刚开始使用这些东西。 谢谢您的帮助。干杯!

【问题讨论】:

  • 尝试替换 Intent broadcastIntent = new Intent(notifier); with Intent broadcastIntent = new Intent(activityNew.class);
  • @DeepanshuHarbola,它没有用。它要求两个论点...
  • Intent broadcastIntent = new Intent(this,activityNew.class);
  • IntentServiceonHandleIntent() 完成后自行停止。 Context#sendBroadcast() 是异步的,并且相对较慢,因此您的 IntentService 很可能在广播可以传送时已经死亡。此外,您还没有为您正在广播的操作注册接收器。也就是说,您尚未将notifier 操作添加到IntentFilter。此外,无论如何,您还不清楚为什么要尝试向自己广播组件。直接调用本地方法即可。

标签: android service broadcastreceiver broadcast


【解决方案1】:

您正在使用仅包含 Intent.ACTION_SCREEN_OFF 和 Intent.ACTION_SCREEN_ON 的 IntentFilter 注册 BroadcastReceiver,但没有 ninja.ibtehaz.thenewproject.Activities.activityNew。这意味着广播接收器只能在 Intent.ACTION_SCREEN_OFF 或 Intent.ACTION_SCREEN_OFF 被广播时被调用。

现在注意你的 sendBroadcast 代码:

Intent broadcastIntent = new Intent(notifier);
sendBroadcast(broadcastIntent);

您正在广播一个动作“ninja.ibtehaz.thenewproject.Activities.activityNew”,它与您注册的 BroadcastReceiver 绑定的 IntentFilter 不匹配。

尝试使用这些代码:

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(notifier);
registerReceiver(receiver, filter);

【讨论】:

    【解决方案2】:

    广播限制:除少数例外情况外,应用不能使用其清单来注册隐式广播。他们仍然可以在运行时注册这些广播,并且可以使用清单来注册专门针对其应用的显式广播。

    Android 文档:https://developer.android.com/about/versions/oreo/background

    尝试在应用程序活动/服务而不是清单中动态注册如下。

    BroadcastReceiver receiver = new NotificationReceiver();
    IntentFilter filter = new IntentFilter();
    filter.addAction(ACTION_UPDATE_NOW);
    context.registerReceiver(receiver, filter);
    

    【讨论】:

    • 我在 2016 年停止了 Android 开发工作。不过,感谢您的贡献。
    【解决方案3】:

    您正在处理意图方法中注册您的接收器;-) 这肯定行不通。

    您必须提前注册您的接收器,例如。在onCreate() 方法中。

    【讨论】:

    • 我确实更改了我的代码。但我仍然得到相同的结果。我已经用新代码更新了这个问题。你能看看吗? @AndreyKopeyko...
    • 您似乎忘记通过 Manifest 订阅 ACTION_SCREEN_ON 意图。看看这个问题和答案 - stackoverflow.com/questions/16161062/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多