Android 如果活动正在运行,则发送本地广播,否则从后台服务发送通知
如果活动正在运行,我需要使用LocalBroadcast从后台服务更新活动。如果应用程序或活动当前未运行,我想添加一个挂起的通知 我浏览了以下帖子: 我有以下疑问-Android 如果活动正在运行,则发送本地广播,否则从后台服务发送通知,android,android-notifications,localbroadcastmanager,Android,Android Notifications,Localbroadcastmanager,如果活动正在运行,我需要使用LocalBroadcast从后台服务更新活动。如果应用程序或活动当前未运行,我想添加一个挂起的通知 我浏览了以下帖子: 我有以下疑问- 如何检查应用程序/活动是否从后台服务运行 如果我在活动的onPause()和onResume()中注册并取消注册广播侦听器,我是否仍需要检查活动是否正在运行 根据上面的链接#2-如果活动不在屏幕上,其接收者将不会被注册,因此事件将以清单注册广播接收者的形式转到默认处理程序,该处理程序将发出通知-如果可能,如何实现这一点 如果
- 如何检查应用程序/活动是否从后台服务运行
- 如果我在活动的onPause()和onResume()中注册并取消注册广播侦听器,我是否仍需要检查活动是否正在运行李>
- 根据上面的链接#2-
-如果可能,如何实现这一点如果活动不在屏幕上,其接收者将不会被注册,因此事件将以清单注册广播接收者的形式转到默认处理程序,该处理程序将发出通知
如果还有其他解决方案,请也分享。我在过去一周也遇到了同样的情况。我找到了一个更好的解决方案,可能会对你有所帮助 查找该活动是否为服务中当前正在运行的活动
boolean isNotificationRequired = true;
ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
Log.d("TEST", "CURRENT Activity ::" + taskInfo.get(0).topActivity.getClassName());
ComponentName componentInfo = taskInfo.get(0).topActivity;
componentInfo.getPackageName();
现在,仅当isNotificationRequired为true时才发送通知
if(isNotificationRequired){
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
this).setSmallIcon(R.drawable.ic_launcher)
.setContentTitle("Notification Title")
.setContentText("Notification Message");
PendingIntent notifyIntent = PendingIntent.getActivity(this, requestcode,
resultIntent, PendingIntent.FLAG_ONE_SHOT);
mBuilder.setContentIntent(notifyIntent);
mBuilder.setAutoCancel(true);
mBuilder.setDefaults(Notification.DEFAULT_VIBRATE
| Notification.DEFAULT_SOUND | Notification.DEFAULT_LIGHTS);
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(requestcode, mBuilder.build());
}
否则,发送广播并更新您的活动
(对于我来说,如果我发送现有的意图,它在接收器中没有正确接收。因此我创建了新的意图,并将现有意图的数据传递到这个新意图的putExtras()中。)
然后在您的活动中,通过创建broadcat接收器来处理广播。别忘了实例化。无需在manifest.xml中提及接收方
public class YourCurrentRunningActivity extends Activity {
YourBroadcastReceiver receiver = new YourBroadcastReceiver();
protected void onCreate(Bundle savedInstanceState) {
(this).registerReceiver(receiver, new IntentFilter("TestAction"));
public class YourBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent arg1) {
// Perform the Actions u want.
}
}
}
然后,您可以在onStop()/onPause()/onDestroy()中注销接收器,如下所示:
this.unregisterReceiver(receiver);
在onPause()和onResume()中注册和取消注册广播侦听器是一个很好的解决方案,您可以在服务中注册侦听器,每次活动转到后台时,调用服务中注册的侦听器,并设置要添加的内容notification@Leon_SFS,你能详细说明一下你所说的“在服务中注册侦听器”是什么意思吗?我指的是你的服务中的广播侦听器,“活动发送广播”和“服务获取并知道活动已关闭”。OHK,这意味着每当活动关闭时,我们都可以了解服务中的状态。谢谢谢谢这种方法的一个缺点是-不推荐使用ActivityManager-
从LOLLIPOP开始,这种方法不再适用于第三方应用程序:引入以文档为中心的recents意味着它可以向调用者泄漏个人信息。为了向后兼容,它仍然会返回其数据的一小部分:至少是调用方自己的任务,可能还有一些其他任务,例如home,这些任务都是已知的不敏感的
我最终还是接受了您的建议,除了检查活动。很高兴听到您的建议。你能告诉我你是如何在不使用ActivityManager的情况下找到当前活动的吗?如上所述-你可以使用另一个广播接收器,它在你的活动的onPause()中被触发,你可以在你的服务中获得此信息。还有另一种方法,这可能不是推荐的做法-您可以在活动中使用静态变量,并在onPause()和onResume()中设置/重置它;您可以在服务中读取此变量。
else {
Log.i("TEST", "Sending broadcast to activity");
Intent newIntent = new Intent();
newIntent.setAction("TestAction");
sendBroadcast(newIntent);
}
public class YourCurrentRunningActivity extends Activity {
YourBroadcastReceiver receiver = new YourBroadcastReceiver();
protected void onCreate(Bundle savedInstanceState) {
(this).registerReceiver(receiver, new IntentFilter("TestAction"));
public class YourBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent arg1) {
// Perform the Actions u want.
}
}
}
this.unregisterReceiver(receiver);