1

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

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

编辑:我正在纯粹用 C++ 编写本机活动。我在问如何返回/完成我的android_main日常工作。我在这个项目中的 Java 代码为零。

日志失败的顶部片段:

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
4

3 回答 3

1

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

于 2012-08-29T10:29:37.330 回答
0

如果您查看 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

于 2012-10-09T06:14:06.120 回答
-1

你可以使用

android:noHistory="true" 

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

finish() 

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

于 2012-08-17T11:05:21.160 回答