只有当Activity未显示时才显示通知

11
我有一个后台任务需要处理。问题是,当任务完成时,如果我的主Activity正在显示,我想调用一个新的Activity将结果展示给用户,否则我只想发送通知,让用户知道操作已完成,并能够随时打开它。
我考虑使用服务来处理后台任务的启动和终止,并在任务完成时广播一条消息,但在这种情况下,我无法知道Activity是否正在显示或广播是否未被处理,因此我应该发送通知。
所以这就是我的问题,由于我的后台任务和服务方面的知识和经验有限,我决定寻求帮助。
感谢您预先阅读我的情况,希望得到一些帮助!
4个回答

25

这篇文章介绍了如何实现你想要的功能:通过有序广播实现Activity或通知

主要思路是使用有序广播。你应该创建一个不依赖于任何活动的BroadcastReceiver,并在AndroidManifest.xml文件中声明它。这个接收器将显示一个Notification。此外,你还应该在你的主活动中注册另一个优先级更高的BroadcastReceiver,它将在屏幕上显示一些内容。然后你只需要发送一个有序广播即可。


这是我发布问题后发现的可能答案,并且看起来非常不错。链接非常有帮助,真的非常感谢。我认为这就是我要走的路! - akalipetis
1
@Antonis:您能否提供一段代码,告诉我们如何实现这个功能? - Sam
我还是不明白这个。除了BroadcastReceivers之外,还涉及哪些API?哪些参数放在哪里? - TheRealChx101

4
试试这样做。
private static boolean isInForeground;

onResume(){
    isInForground = true;
}
onPause(){
   isInForground = false;
}

如果isInForground为true,则Activity在前台显示,否则不显示。

如果您想从任何地方知道,请在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
}

1

看起来你想要在服务的线程中实现任务。你可以在 Activity 中拥有一个持久化的静态布尔值,用于表示该 Activity 是否正在显示。Activity 在 onResume() 方法中对用户可见,在调用 onPause() 方法时不可见。在 onResume() 方法中将布尔值设置为 true,在 onPause() 方法中将其设置为 false。


0
你可以使用SharedPreferences;在activity的onStart()或onStop()中更新偏好设置,并在服务中进行验证。
希望能对你有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接