【问题标题】:Need help understanding where to put a piece of code, onCreate()/OnStart需要帮助了解将一段代码放在哪里,onCreate()/OnStart
【发布时间】:2011-12-24 07:04:21
【问题描述】:

我试图查看活动生命周期,但我仍然不明白我的代码应该放在哪里。

  1. 在我的onCreate() 中,我得到了 GPS 位置。
  2. 稍后在应用程序中,Camera Intent 被调用,然后被解除。
  3. 再次检索 GPS 位置(我猜onCreate() 正在再次执行?)

我只希望在应用程序启动时检索一次 GPS 位置。

【问题讨论】:

  • 我想我也遇到了这个问题,它与您调用启动另一个活动的方式有关(无论哪个活动接受相机意图)。我认为发生的情况是,通常在您自己的活动中,只有 onStart() 和 onStop() 被调用。但我想由于您的应用程序暂时不是顶级应用程序,android 决定在下次您的应用程序处于“焦点”时调用 onCreate()。 如果我在这里错了,请纠正我,我只是推测
  • 另外,您确定要在“onCreate()”中获取 GPS 位置吗?这听起来更像是一项后台服务,您首先检查您是否已经获得了 GPS 位置。
  • @DavidT。我在创建应用程序时肯定需要 GPS 位置,因为它需要在用户开始使用它时记录用户的位置。

标签: android oncreate activity-lifecycle onstart


【解决方案1】:

您可以检查您是否已经有一个有效的 GPS 位置,然后您可以跳过此步骤并且不再检索它。您可以使用 SharedPreferences 来存储此状态。

希望这会有所帮助!

【讨论】:

  • 您真的不想将其存储在首选项中。如果这样做,您将在 3 周后再次运行应用程序时获得相同的 GPS 位置。
  • 当然,你必须管理这个。例如,在 onDestroy 中,您必须将此值设置为 false。我不是故意把它放在那里然后永远离开:)
【解决方案2】:

在创建活动时调用onCreate()onStart()onCreate() 之后被调用。

您可以在此处阅读有关活动生命周期的信息:http://developer.android.com/reference/android/app/Activity.html

对于您的问题,您可以覆盖 onSaveInstanceState,这是一种帮助您保存 Bundle 的方法, 然后在onCreate方法中取回来(onCreate中的参数就是这个Bundle)。

protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    *Modify the bundle*
}

如果你不能序列化你可以使用的 GPS 位置:

@Override
public Object onRetainNonConfigurationInstance() {
     return objectYouNeed;
}

要检索此对象,请使用getLastNonConfigurationInstance()

希望对你有帮助!

【讨论】:

    【解决方案3】:

    有关背景信息,请参阅my answer about why you can't just "get" a GPS position。在您的 onCreate() 方法中获取一次 GPS 位置(通过延迟初始化检查以查看您是否已经获得 GPS 坐标,以防多次调用 onCreate())可能不是您的应用程序的正确方法,并且可能导致您的应用程序将被 Android 操作系统强制关闭。

    如果您确定设备的最后已知位置对于您的应用程序来说总是足够好,那么每次调用 onCreate() 方法时调用它就可以了,因为它不需要使用 GPS 电路。因此,如果最后一个已知位置足够好,则只需在每次调用 onCreate() 方法时都请求它,并避免延迟初始化类型 sof 检查的复杂性。

    如果最后一个已知位置对您的应用程序来说并不总是足够好,那么您就不能可靠地等待 onCreate() 方法中的修复,因为您冒着定位修复花费太长时间的风险,从而导致 Android 系统强制关闭您没有响应的应用程序,因为它没有及时从 onCreate() 方法返回。相反,您需要在 onCreate() 方法中启动一个后台异步任务(检查您是否还没有运行这样的异步任务),该任务开始侦听位置更新,直到收到足够好的修复,然后记住该位置,停止位置侦听器并因此关闭 GPS 电路。使用如下代码:

    private MyAsynchGpsLocationListener mGpsListener = null;
    
    public ... onCreate() {
      if (mGpsListener == null) {
        mGpsListener = new MyAsynchGpsLocationListener();
        mGpsListener.start();
      }
    }
    
    someMethod() {
      if (mGpsListener != null) {
        Location myLocation = mGpsListener.getLocation();
        if (myLocation != null) {
          // Do something with a "good enough" location
        }
      }
    }
    

    【讨论】:

      【解决方案4】:

      您应该将 GPS 位置保存在实例数据中,然后将其传递回 onCreate 以防活动重新启动。存放地点在onSaveInstance

      【讨论】:

        【解决方案5】:

        仅将其放入 onCreate() 中。

        现在,如果您认为它被多次调用,您不能做一些事情来检查您是否已经拥有它。比如

        onCreate(){
        
        //other code
        
            if(GpsStuff == null)
            {
                //get gps position
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-01-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多