【问题标题】:Proper way to exit from android_main从 android_main 退出的正确方法
【发布时间】:2012-08-13 19:43:21
【问题描述】:

退出原生活动的正确方法是什么?也就是说,我如何结束我的android_main 函数。如果我什么都不做,程序就会挂起,最终设备会终止它。如果我调用exit(0),它会退出,但会在日志文件中打印一个转储,表明它没有正确清理。

那么我应该如何正确退出应用程序?

编辑:我正在纯粹用 C++ 编写本机活动。我在问如何返回/完成我的android_main 例程。我在这个项目中有 个 Java 代码。

日志失败的top sn-p:

V/threaded_app( 5419): NativeWindowDestroyed: 0x29c490 -- 0x29d788
I/DEBUG   ( 1055): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   ( 1055): Build fingerprint: 'LENOVO/IdeaPad_Tablet_A1_07/A1_07:2.3.4/GRJ22/eng.user.20120209.100319:user/release-keys'
I/DEBUG   ( 1055): pid: 5419, tid: 5427  >>> eu.eversystems.sample <<<
I/DEBUG   ( 1055): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000024
I/DEBUG   ( 1055):  r0 0029d788  r1 463ddb64  r2 5f776e64  r3 00000000

【问题讨论】:

    标签: android android-ndk


    【解决方案1】:

    你可以用

    android:noHistory="true" 
    

    在你所有活动的清单中:) 然后

    finish() 
    

    您当前的活动..您完成了! :) 我希望它有所帮助

    【讨论】:

      【解决方案2】:

      我还没有尝试过,但我想在本机活动指针上调用 ANativeActivity_finish() 会起作用。

      【讨论】:

      【解决方案3】:

      如果您查看 NDK 中的 native-activity 示例,android_main 是一个 void 函数,因此当您想要“退出”时只需“返回”即可。

      但是,您应该注意如何/何时从 android_main 返回。在正常情况下,Android 上的应用程序并不会真正“结束”。它们被带入和带出前台。自然,如果该进程在后台并且不再需要它的操作系统设备,它将如您所说的那样被终止。在这种情况下,我希望设置 android_native_app_glue 库中的“destroyRequested”字段,这应该会触发 android_main 的返回。这将允许您优雅地退出您的应用程序。

      在所有其他情况下,您只是希望您的应用遵守它可能发现的各种状态。

      即:

      /**
       * Command from main thread: the AInputQueue has changed.  Upon processing
       * this command, android_app->inputQueue will be updated to the new queue
       * (or NULL).
       */
      APP_CMD_INPUT_CHANGED,
      
      /**
       * Command from main thread: a new ANativeWindow is ready for use.  Upon
       * receiving this command, android_app->window will contain the new window
       * surface.
       */
      APP_CMD_INIT_WINDOW,
      
      /**
       * Command from main thread: the existing ANativeWindow needs to be
       * terminated.  Upon receiving this command, android_app->window still
       * contains the existing window; after calling android_app_exec_cmd
       * it will be set to NULL.
       */
      APP_CMD_TERM_WINDOW,
      
      /**
       * Command from main thread: the current ANativeWindow has been resized.
       * Please redraw with its new size.
       */
      APP_CMD_WINDOW_RESIZED,
      
      /**
       * Command from main thread: the system needs that the current ANativeWindow
       * be redrawn.  You should redraw the window before handing this to
       * android_app_exec_cmd() in order to avoid transient drawing glitches.
       */
      APP_CMD_WINDOW_REDRAW_NEEDED,
      
      /**
       * Command from main thread: the content area of the window has changed,
       * such as from the soft input window being shown or hidden.  You can
       * find the new content rect in android_app::contentRect.
       */
      APP_CMD_CONTENT_RECT_CHANGED,
      
      /**
       * Command from main thread: the app's activity window has gained
       * input focus.
       */
      APP_CMD_GAINED_FOCUS,
      
      /**
       * Command from main thread: the app's activity window has lost
       * input focus.
       */
      APP_CMD_LOST_FOCUS,
      
      /**
       * Command from main thread: the current device configuration has changed.
       */
      APP_CMD_CONFIG_CHANGED,
      
      /**
       * Command from main thread: the system is running low on memory.
       * Try to reduce your memory use.
       */
      APP_CMD_LOW_MEMORY,
      
      /**
       * Command from main thread: the app's activity has been started.
       */
      APP_CMD_START,
      
      /**
       * Command from main thread: the app's activity has been resumed.
       */
      APP_CMD_RESUME,
      
      /**
       * Command from main thread: the app should generate a new saved state
       * for itself, to restore from later if needed.  If you have saved state,
       * allocate it with malloc and place it in android_app.savedState with
       * the size in android_app.savedStateSize.  The will be freed for you
       * later.
       */
      APP_CMD_SAVE_STATE,
      
      /**
       * Command from main thread: the app's activity has been paused.
       */
      APP_CMD_PAUSE,
      
      /**
       * Command from main thread: the app's activity has been stopped.
       */
      APP_CMD_STOP,
      
      /**
       * Command from main thread: the app's activity is being destroyed,
       * and waiting for the app thread to clean up and exit before proceeding.
       */
      APP_CMD_DESTROY,
      

      示例代码在这里:

      http://developer.android.com/reference/android/app/NativeActivity.html

      【讨论】:

      • 我想知道我是否正确退出,最后的奇怪转储在某种程度上是正常/预期的调试应用程序。
      猜你喜欢
      • 2016-11-12
      • 2011-12-22
      • 1970-01-01
      • 2010-09-26
      • 2012-01-03
      • 1970-01-01
      • 2016-11-23
      • 1970-01-01
      相关资源
      最近更新 更多