Android SingleTask/ SingleInstance проблема
Я разрабатываю игру для Android, в которой я хочу иметь только один экземпляр.
игра имеет основное действие, которое я назвал GameActivity, и другое действие, которое я назвал CreateAccountActivity.
Я определил в манифесте GameActivity быть android:launchMode="singleTask"
,
когда приложение запускается в первый раз, я запускаю CreateAccoutActivity, используя startActivityForResult
метод.
проблема в том, что когда я нажимаю кнопку "Домой" и затем запускаю свое приложение, ничего не происходит (с точки зрения пользователя, но я вижу из журналов, что CreateAccountActivity уничтожено, GameActivity onActivityResult
называется, а затем он тоже уничтожен (он получает RESULT_CANCEL
конечно.
вот логи:
12-28 14:30:11.910: V/WindowManager(24745): Dsptch > Window{47ce9868 com.sec.android.app.twlauncher/com.sec.android.app.twlauncher.Launcher paused=false}
12-28 14:30:11.910: V/InputDevice(24745): ID[0]=0(0) Dn(0=>1)
12-28 14:30:11.973: D/dalvikvm(7770): GC_EXTERNAL_ALLOC freed 313 objects / 12648 bytes in 25ms
12-28 14:30:12.004: V/InputDevice(24745): ID[0]=0(0) Up(1=>0)
12-28 14:30:12.039: D/dalvikvm(7770): GC_EXTERNAL_ALLOC freed 88 objects / 2680 bytes in 25ms
12-28 14:30:12.110: D/dalvikvm(7770): GC_EXTERNAL_ALLOC freed 24 objects / 864 bytes in 25ms
12-28 14:30:12.157: V/WindowManager(24745): Dsptch > Window{47ce9868 com.sec.android.app.twlauncher/com.sec.android.app.twlauncher.Launcher paused=false}
12-28 14:30:12.157: I/ActivityManager(24745): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.*****.tq/.GameActivity }
12-28 14:30:12.161: D/Launcher.Workspace(7770): WorkspaceDraw: Workspace drawWallpaperImage()
12-28 14:30:12.168: I/CreateAccountActivity(9369): onDestroy
12-28 14:30:12.172: I/Launcher(7770): onPause()
12-28 14:30:12.184: W/Launcher(7770): WallpaperManager setVisibility visible true
12-28 14:30:12.203: I/GameActivity(9369): Game activity onActivityResult
12-28 14:30:12.203: I/GameActivity(9369): disconnecting from main server
12-28 14:30:12.203: I/ConnectionManager(9369): Disconnecting...
12-28 14:30:12.207: I/GameActivity(9369): Game activity onNewIntent is called
12-28 14:30:12.215: I/Launcher(7770): onWindowFocusChanged(false)
12-28 14:30:12.219: I/Launcher(7770): onResume(). mIsNewIntent : false
12-28 14:30:12.219: E/Launcher(7770): MTP-LAUNCHER: media scanning not yet finished .
12-28 14:30:12.219: I/Launcher(7770): onResume() ended
12-28 14:30:12.219: I/Launcher(7770): onWindowFocusChanged(true)
12-28 14:30:12.223: W/InputManagerService(24745): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@47d9fa18
12-28 14:30:12.227: D/Launcher.Workspace(7770): WorkspaceDraw: Workspace drawWallpaperImage()
12-28 14:30:12.235: I/GameActivity(9369): Game activity destroyed
12-28 14:30:12.762: D/BatteryService(24745): update start
12-28 14:30:12.770: D/BatteryService(24745): updateBattery level:100 scale:100 status:5 health:2 present:true voltage: 4240 temperature: 360 technology: Li-ion AC powered:false USB powered:true icon:17302163
12-28 14:30:12.801: I/StatusBarPolicy(24745): BAT. status:5 health:2
12-28 14:30:12.801: D/WifiService(24745): ACTION_BATTERY_CHANGED pluggedType: 2
12-28 14:30:13.231: W/Launcher(7770): WallpaperManager setVisibility visible false
12-28 14:30:13.375: D/Launcher.Workspace(7770): WorkspaceDraw: Workspace drawWallpaperImage()
Для простоты я описываю это так: Activity A = MAIN - singleTask Activity B = (undefined - стандартная)
A setsForResult B -> кнопка home -> кнопка запуска игры -> B разрушена -> вызывается onActivityResult -> A уничтожено -> кнопка запуска игры -> A starttForResult B ...
РЕДАКТИРОВАТЬ
Теперь я сомневаюсь, нужно ли мне вообще использовать singleTask.
Правда ли, что независимо от того, откуда я начинаю свою деятельность с помощью Android, а не с помощью намерения, которое я закодировал, Android всегда будет перезапускать мое приложение, и не будет многократных случаев моей деятельности?
если это так, все хорошо-хорошо:)
1 ответ
Из документации деятельности
действие "singleTask" может иметь или не иметь другие действия над ним в стеке. Если это так, он не в состоянии обработать намерение, и намерение отбрасывается. (Даже если намерение отброшено, его прибытие привело бы к тому, что задача вышла на передний план, где она и останется.)
При нажатии на запуск игры, создание этого Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.*****.tq/.GameActivity
GameActivity(A) пытается обработать намерение в onNewIntent(). Вы можете поместить Log.d("GameActivity", "onNewIntent называется"), чтобы проверить это. (B) просто уничтожается, прежде чем можно будет установить результат.
Может быть, вы могли бы установить setResult() в CreateAccountActivity.onDestroy(), чтобы вы могли обрабатывать его в GameActivity?