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);
我正在使用广播接收器和后台服务。所以,当我的 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);