android - 无法从后台服务接收广播

android - unable to receive broadcast from a background service

我正在使用广播接收器和后台服务。所以,当我的 activity 进入 onPause() 时,我启动我的服务,服务发送一个广播。现在,我的广播接收器与我的服务在同一个 class 中。我正在接听服务电话,但无法接收广播信息。这是我一直在研究的代码.. [已编辑]

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

[已编辑] activity新 class >

@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 方法中注册您的接收器 ;-) 这肯定行不通。

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

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

现在注意你的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);

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

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

尝试在 Application Activity/Service 而不是 Manifest 中动态注册,如下所示。

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