【问题标题】:Show a notification only if Activity is not showing仅当 Activity 未显示时才显示通知
【发布时间】:2011-08-25 13:40:49
【问题描述】:

我有一个想要处理的后台任务。问题是当任务完成时,我想调用一个新的 Activity 来向用户显示结果,只有当我的主 Activity 正在显示时,否则我只想发送一个通知,以便用户可以看到该操作完成了,可以随时打开。

我正在考虑使用服务来处理后台任务的启动和终止,并在它完成时广播一条消息,但在这种情况下,我无法知道是显示了 Activity 还是未处理广播,并且我应该发送通知。

所以这是我的问题,由于我在后台任务和服务方面的知识和经验有限,我决定寻求一些帮助。

提前感谢您阅读我的案例,希望对您有所帮助!

【问题讨论】:

    标签: java android android-intent android-service android-asynctask


    【解决方案1】:

    这是一篇很好的文章,描述了如何实现你想要的:Activity or Notification via Ordered Broadcast

    主要思想是使用有序广播。您应该创建一个BroadcastReceiver,它将在没有任何活动的情况下生存。为此,您应该在AndroidManifest.xml 文件中声明它。此接收器将显示Notification。此外,您应该在您的主要活动中注册另一个具有更高优先级的BroadcastReceiver,这将在屏幕上显示一些内容。然后你只需要发送一个有序的广播。

    【讨论】:

    • 这是我在发布问题后发现的一个可能的答案,并且似乎是很好的做法。这个链接真的很有帮助,非常感谢。我想这就是我要遵循的方式!
    • @Antonis:你能提供一个我们如何实现它的代码吗?
    • 我还是不明白。除了广播接收器之外,还涉及哪些 API。什么参数去哪儿了?
    【解决方案2】:

    像这样试试。

    private static boolean isInForeground;
    
    onResume(){
        isInForground = true;
    }
    onPause(){
       isInForground = false;
    }
    

    如果 isInForground 是 true 则 Activity 处于 Forground(Showing) 中,否则不显示。

    如果您想从任何地方了解,请在 MainActivity 中添加以下内容。

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    
        onResume(){
             pref = PreferenceManager.getDefaultSharedPreferences(this);
             prefEditor = prefs.edit();
             prefEditor.putBoolean("isInForeground",true);
             prefEditor.commit();
        }
    
        onPause(){
                 pref = PreferenceManager.getDefaultSharedPreferences(this);
                 prefEditor = prefs.edit();
                 prefEditor.putBoolean("isInForeground", false);
                 prefEditor.commit();
        }
    

    然后从你的服务。

    pref = PreferenceManager.getDefaultSharedPreferences(this);
    if(pref.getBoolean("isInForeground", false)){
           //MainActivity is in forground
    
    }
    else{
          //not in forground
    }
    

    【讨论】:

      【解决方案3】:

      听起来您想在服务的线程中实现任务。您可以在 Activity 中有一个持久的静态布尔值,表示是否显示该活动。一个活动在onResume() 中对用户可见,但在调用onPause() 时不可见。在onResume() 中将布尔值设置为true,在onPause() 中设置为false。

      【讨论】:

        【解决方案4】:

        您可以使用 SharedPreferences; 在 onStart() 或 onStop() 时更新活动的首选项,并在您的服务中验证它。

        希望我能帮上忙。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-20
          • 1970-01-01
          • 1970-01-01
          • 2016-09-11
          • 2019-08-21
          • 1970-01-01
          相关资源
          最近更新 更多