【问题标题】:Android OnApplicationPause/OnApplicationResumeAndroid OnApplicationPause/OnApplicationResume
【发布时间】:2011-09-22 09:27:42
【问题描述】:

当我的 android 应用程序 进入后台并返回时,有什么方法可以处理?

我想为在线游戏使用通知服务 - 我使用一项服务,当游戏中发生某些事情时会显示警报。我希望仅在我的应用程序处于活动状态(在前台)时才显示警报,因此我需要在应用程序进入前台时启动我的服务,并在应用程序进入后台时停止它。

请注意,我不能使用 Activity.OnPause/OnResume 方法。我的应用程序中有很多活动,如果我要处理 OnPause/OnResume,那么有可能在一瞬间,当用户将一个活动切换到另一个活动时,应用程序看起来像后台,实际上它会是前台

【问题讨论】:

标签: android android-activity onresume onpause


【解决方案1】:

请注意,我不能使用 Activity.OnPause/OnResume 方法。我有很多 我的应用程序中的活动,如果我要处理 OnPause/OnResume,它 有可能在一瞬间,当用户将一个活动切换到另一个活动时, 应用程序看起来像背景,彻底它将是前景 其实

您为什么不编写一个扩展Activity 并在这些方法中启用或禁用服务的基类?之后,从此基础活动扩展您的所有活动。 如果您在活动中覆盖这些方法,您所要做的就是调用超类方法,例如通过在onResume() 中调用super.onResume(),以确保这些仍然被调用。如果你不覆盖它们,一切都会直接进行。

【讨论】:

  • 我不希望每次用户切换活动时都启用/禁用服务。我想从服务器接收通知,例如每 30 秒,但用户可以每秒切换一次活动
  • 在这种情况下,您的问题不清楚。引用:“所以我需要在应用程序进入前台时启动我的服务,并在应用程序进入后台时停止它” - 前台是活动可见时。
  • 没有。我的应用程序包含 许多 活动。当其中一个变得不可见时,另一个就会出现。 OnResume/OnPause 被调用,但 application 状态没有改变
【解决方案2】:

据我所知,这不是一种干净的方法,但是,

您也许可以使用唯一标识符向您的服务onCreate()onPause() 发送一个意图。

然后,您的服务可以启动一个计时器(延迟将比每个活动中调用的 onPauseonCreate 之间的差长),如果在此时间内未通知 onCreate(),将设置Activity 为“已暂停”。

如果您在扩展 Activity 的父类中添加此功能,则可以通过扩展它而不是 Activity 将相同的功能拉入每个类(您必须分别调用 super.onCreate()super.onPause() 的合同方法)。

【讨论】:

    【解决方案3】:

    通过以下方式解决问题(C# 代码,用于 android 的单声道)

    class MyService : Service{
      OnSomethingHappened(){
        ActivityManager am = (ActivityManager) GetSystemService(ActivityService);
        if(am.RunningAppProcesses.Any((arg) => 
          arg.ProcessName == "myprocessname" &&
          arg.Importance == ActivityManager.RunningAppProcessInfo.ImportanceForeground
        )){
           Trace("FOREGROUND!!!!");
        }else{
           Trace("BACKGROUND!!!!");
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 2015-08-12
      相关资源
      最近更新 更多