Android 如果活动正在运行,则发送本地广播,否则从后台服务发送通知

Android 如果活动正在运行,则发送本地广播,否则从后台服务发送通知,android,android-notifications,localbroadcastmanager,Android,Android Notifications,Localbroadcastmanager,如果活动正在运行,我需要使用LocalBroadcast从后台服务更新活动。如果应用程序或活动当前未运行,我想添加一个挂起的通知 我浏览了以下帖子: 我有以下疑问- 如何检查应用程序/活动是否从后台服务运行 如果我在活动的onPause()和onResume()中注册并取消注册广播侦听器,我是否仍需要检查活动是否正在运行 根据上面的链接#2-如果活动不在屏幕上,其接收者将不会被注册,因此事件将以清单注册广播接收者的形式转到默认处理程序,该处理程序将发出通知-如果可能,如何实现这一点 如果

如果活动正在运行,我需要使用LocalBroadcast从后台服务更新活动。如果应用程序或活动当前未运行,我想添加一个挂起的通知

我浏览了以下帖子:

我有以下疑问-

  • 如何检查应用程序/活动是否从后台服务运行

  • 如果我在活动的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);