【问题标题】:Android raise Notification when app goes to background (not single activity)当应用程序进入后台时Android会引发通知(不是单个活动)
【发布时间】:2013-03-09 04:57:39
【问题描述】:

我有一个由 3 个活动 A、B 和 C 组成的 Android 应用:

  • A 是应用程序本身(常规 Activity)
  • B 是设置屏幕(使用 PreferenceActivity 制作)
  • C 是关于屏幕(常规 Activity)

活动之间的关系如下:

  • A是主要活动
  • B 的父母是 A
  • C 的父母是 B

Activity A 在进入后台时会引发通知,这是通过在 A 的 onStop() 方法中调用 NotificationManager 的 notify() 来完成的。

当用户启动应用程序时,它会从活动 A 开始,然后如果用户按下主页按钮,则会在显示主页屏幕时立即发出通知。单击通知将使用户返回应用程序。

似乎一切正常,但现在有一种我不喜欢的行为: 当用户启动应用程序然后进入设置(因此显示活动 A,然后显示 B)时,也会引发通知(因为 A 已进入后台以显示 B)。

这是不希望的:只有在应用程序进入后台时才应该发出通知,而不管用户正在查看的活动如何。

如何实现这种正确的行为?

提前致谢, 马可

【问题讨论】:

  • 能否请您发布您尝试过的内容...

标签: android android-activity background notifications


【解决方案1】:

只需创建一个布尔标志 shouldNotify 并在您打开其他活动之一时将其设置为 false。如果没有您的代码,我无法确切地告诉您如何实现它,但这里有一个例子可以让您了解这个想法:

private boolean shouldNotify = true;

@Override 
public void onStart(){
    super.onStart();
    shouldNotify = true;
}

@Override
public void onStop(){
    super.onStop();
    if(shouldNotify){
        sendNotification();
    }
}


// Where you need to put these next snippets depends on how you've made your Activity

/*
 * Launching settings activity
 */
shouldNotify = false;
Intent settingsIntent = new Intent(this, YourSettingsActivity.class);
startActivity(settingsIntent);

【讨论】:

  • 看起来很清楚,谢谢。然后我必须在每个活动的 onStop() 中提出通知,对吗?或者有没有更简洁的方法来避免重复代码?
  • 谢谢,我是按照您的建议以及@benjamin-k 在他之前的回答(扩展应用程序类)中的建议进行的。一个小警告:我必须将 sendNotification() 调用放在 onPause() 而不是 onStart() 中,否则它将不起作用。
【解决方案2】:

您可以设置一个布尔标志,在发出通知之前检查该标志,并在启动 Activity B 之前将其设置为“false”。

当然,这样你就必须在活动 B 和 C 中做同样的事情才能让他们也发出通知。

或者,正如在您可以实现自己的应用程序类并在那里获取回调之前所暗示的那样。

【讨论】:

  • 让B和C同时发出通知会导致Activity之间重复代码,如何避免?您能否发布您提出的第二种选择的链接?
  • 嗯,应用程序对象是(简化的)应用程序范围的单例对象,android 系统实例化并保证它是单个实例。从您的活动中,您可以通过 mActivity.getApplication() 访问它。要实现您自己的代码,您必须实现自己的 Application 子类并将其注册到 android manifest For更多信息请阅读developer.android.com/reference/android/app/Application.html
猜你喜欢
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 2020-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多