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

时间:2016-11-09 18:28:17

标签: android service broadcastreceiver broadcast

我正在使用广播接收器和后台服务。所以,当我的一个活动进入onPause()时,我开始服务并且服务发送一个广播。现在,我的广播接收器与我的服务属于同一类。我正在接听服务电话,但我无法收到广播信息。这是我一直在努力的代码.. [EDITED]

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

[EDITED] on activityNew 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");
        }


    }
};

和清单文件:[EDITED]

<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

之后我没有得到任何东西..

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

3 个答案:

答案 0 :(得分:1)

您正在使用IntentFilter注册BroadcastReceiver,该IntentFilter仅包含Intent.ACTION_SCREEN_OFF和Intent.ACTION_SCREEN_ON,但没有 ninja.ibtehaz.thenewproject.Activities.activityNew 。这意味着当广播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);

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

您正在处理一个意图方法中注册您的接收器;-)这绝对不会起作用。

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