unity黑屏现状问题总结

总结下unity的游戏接sdk时的黑屏问题现状

现象:

目前黑屏有两种情况:

1. 点击登录面板,从面板中点击跳到三方界面或者跳到第三个界面;再点击返回键时会出现下面的游戏界面黑屏;

2. 点击登录面板之后,按桌面键返回桌面;然后再从最近任务键进入会发现下面的游戏界面黑屏;

原因:

以第一种情况为例,一般情况下出现:

05-28 10:27:04.642  1000  2154  3441 I am_create_activity: [0,41511060,4450,com.ss.android.ugc.aweme/.openauthorize.AwemeAuthorizedActivity,NULL,NULL,NULL,872448000]`

05-28 10:27:04.642  1000  2154  3441 I wm_task_moved: [4450,0,2147483647]`

05-28 10:27:04.649  1000  2154  3441 I am_pause_activity: [25025,39231624,com.hermes.fgame/com.bytedance.ttgame.sdk.module.account.login.ui.LoginActivity,userLeaving=true]`

05-28 10:27:04.654 10454 25025 25025 I am_on_paused_called: [0,com.bytedance.ttgame.sdk.module.account.login.ui.LoginActivity,performPause]`

05-28 10:27:04.663  1000  2154  3329 I am_proc_bound: [0,25874,com.ss.android.ugc.aweme:push]`

05-28 10:27:04.715  1000  2154  3441 I configuration_changed: 536872064`

05-28 10:27:04.778  1000  2154  2194 I am_stop_activity: [0,214407528,com.hermes.fgame/.SDKBridgeActivity]`

05-28 10:27:04.793  1000  2154  2194 I sysui_count: [window_time_0,7]`

`05-28 10:27:04.793  1000  2154  2194 I sysui_multi_action: [757,803,799,window_time_0,802,7]`

05-28 10:27:04.804 10454 25025 25025 I am_on_stop_called: [0,com.hermes.fgame.SDKBridgeActivity,STOP_ACTIVITY_ITEM]`

05-28 10:27:05.975 10421 25905 25905 I am_on_resume_called: [0,com.ss.android.ugc.aweme.openauthorize.AwemeAuthorizedActivity,RESUME_ACTIVITY]`

黑屏的原因是游戏界面调用了onstop,则会出现黑屏;直到其重新调用onResume才能重新可见;

想法:

1. 在stop的时候调用onResume

2. 想办法起到三方授权界面的时候不调用onstop

3. 想办法只生成一个界面

方案1已经被游戏否决了,其实也能理解;改变Activity的生命周期总是要承担很大的风险的,那么方案2和方案3

方案2:如何使调起三方授权界面时不再调用unity游戏界面的onstop


`1554    private void completePauseLocked(boolean resumeNext, ActivityRecord resuming) {`

`1555        ActivityRecord prev = mPausingActivity;`

`1556        if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Complete pause: " + prev);`

`1557`

`1558        if (prev != null) {`

`1559            prev.setWillCloseOrEnterPip(false);`

`1560            final boolean wasStopping = prev.isState(STOPPING);`

`1561            prev.setState(PAUSED, "completePausedLocked");`

`1562            if (prev.finishing) {`

`1563                if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Executing finish of activity: " + prev);`

`1564                prev = finishCurrentActivityLocked(prev, FINISH_AFTER_VISIBLE, false,`

`1565                        "completedPausedLocked");`

`1566            } else if (prev.app != null) {`

`1567                if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Enqueue pending stop if needed: " + prev`

`1568                        + " wasStopping=" + wasStopping + " visible=" + prev.visible);`

`1569                if (mStackSupervisor.mActivitiesWaitingForVisibleActivity.remove(prev)) {`

`1570                    if (DEBUG_SWITCH || DEBUG_PAUSE) Slog.v(TAG_PAUSE,`

`1571                            "Complete pause, no longer waiting: " + prev);`

`1572                }`

`1573                if (prev.deferRelaunchUntilPaused) {`

`1574                    // Complete the deferred relaunch that was waiting for pause to complete.`

`1575                    if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Re-launching after pause: " + prev);`

`1576                    prev.relaunchActivityLocked(false /* andResume */,`

`1577                            prev.preserveWindowOnDeferredRelaunch);`

`1578                } else if (wasStopping) {`

`1579                    // We are also stopping, the stop request must have gone soon after the pause.`

`1580                    // We can't clobber it, because the stop confirmation will not be handled.`

`1581                    // We don't need to schedule another stop, we only need to let it happen.`

`1582                    prev.setState(STOPPING, "completePausedLocked");`

`1583                } else if (!prev.visible || shouldSleepOrShutDownActivities()) {`

`1584                    // Clear out any deferred client hide we might currently have.`

`1585                    prev.setDeferHidingClient(false);`

`1586                    // If we were visible then resumeTopActivities will release resources before`

`1587                    // stopping.`

`1588                    addToStopping(prev, true /* scheduleIdle */, false /* idleDelayed */);`

`1589                }`

`1590            } else {`

`1591                if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "App died during pause, not stopping: " + prev);`

`1592                prev = null;`

`1593            }`

`1594            // It is possible the activity was freezing the screen before it was paused.`

`1595            // In that case go ahead and remove the freeze this activity has on the screen`

`1596            // since it is no longer visible.`

`1597            if (prev != null) {`

`1598                prev.stopFreezingScreenLocked(true /*force*/);`

`1599            }`

`1600            mPausingActivity = null;`

`1601        }`

`1602`

`1603        if (resumeNext) {`

`1604            final ActivityStack topStack = mStackSupervisor.getFocusedStack();`

`1605            if (!topStack.shouldSleepOrShutDownActivities()) {`

`1606                mStackSupervisor.resumeFocusedStackTopActivityLocked(topStack, prev, null);`

`1607            } else {`

`1608                checkReadyForSleep();`

`1609                ActivityRecord top = topStack.topRunningActivityLocked();`

`1610                if (top == null || (prev != null && top != prev)) {`

`1611                    // If there are no more activities available to run, do resume anyway to start`

`1612                    // something. Also if the top activity on the stack is not the just paused`

`1613                    // activity, we need to go ahead and resume it to ensure we complete an`

`1614                    // in-flight app switch.`

`1615                    mStackSupervisor.resumeFocusedStackTopActivityLocked();`

`1616                }`

`1617            }`

`1618        }`

`1619`

`1620        if (prev != null) {`

`1621            prev.resumeKeyDispatchingLocked();`

`1622`

`1623            if (prev.app != null && prev.cpuTimeAtResume > 0`

`1624                    && mService.mBatteryStatsService.isOnBattery()) {`

`1625                long diff = mService.mProcessCpuTracker.getCpuTimeForPid(prev.app.pid)`

`1626                        - prev.cpuTimeAtResume;`

`1627                if (diff > 0) {`

`1628                    BatteryStatsImpl bsi = mService.mBatteryStatsService.getActiveStatistics();`

`1629                    synchronized (bsi) {`

`1630                        BatteryStatsImpl.Uid.Proc ps =`

`1631                                bsi.getProcessStatsLocked(prev.info.applicationInfo.uid,`

`1632                                        prev.info.packageName);`

`1633                        if (ps != null) {`

`1634                            ps.addForegroundTimeLocked(diff);`

`1635                        }`

`1636                    }`

`1637                }`

`1638            }`

`1639            prev.cpuTimeAtResume = 0; // reset it`

`1640        }`

`1641`

`1642        // Notify when the task stack has changed, but only if visibilities changed (not just`

`1643        // focus). Also if there is an active pinned stack - we always want to notify it about`

`1644        // task stack changes, because its positioning may depend on it.`

`1645        if (mStackSupervisor.mAppVisibilitiesChangedSinceLastPause`

`1646                || getDisplay().hasPinnedStack()) {`

`1647            mService.mTaskChangeNotificationController.notifyTaskStackChanged();`

`1648            mStackSupervisor.mAppVisibilitiesChangedSinceLastPause = false;`

`1649        }`

`1650`

`1651        mStackSupervisor.ensureActivitiesVisibleLocked(resuming, 0, !PRESERVE_WINDOWS);`

`1652    }`

想要不被stop那么不能被调用到addToStopping;这就有两种可能

1. 使unity activity调用relaunch的逻辑

prev.relaunchActivityLocked(false /* andResume */, prev.preserveWindowOnDeferredRelaunch);

2. 使unity Activity的visable属性为true

结论

1. 经调研不太好实现,因为unity实现了对所有config change的监听以便于属性变化时及时变化游戏界面

2. 需要三方配合;将三方授权界面Activity的fullscreen属性置为false;如写成Dialog style的形式

经试验,方案2对情况1可行;缺点: 1. 需要授权sdk方的配合 2.对情况2还是没办法解决;

方案3; 将游戏activity和登陆面板合并,将登陆面板以Dialog形式显示,依附于游戏unity activity,此时两种情况应该都能解决; 缺点:改动太大;对于sdk限制也太大

业内方案:

想了下,想要根治这个问题可能只能讲登陆面板置位dialog形式;但是这种方式局限太大了,业界的sdk不可能都是以style形式实现的吧?至少我接的uc渠道就有这个问题;

因此用unity demo继承下uc的sdk,发现情况1和情况2都能复现

bilibili黑屏情况1.jpg
uc黑屏情况2.jpg

因此这个问题确实也是正常的,属于AMS管理Activity的生命周期的正常逻辑

结论:

  1. 如果要有两个Activity;那么点击登录面板之后,按桌面键返回桌面;然后再从最近任务键进入游戏界面黑屏;

  2. 如果有三个activity,且第三个activity为全屏的,那么返回时如果登陆面板不自动取消,那么就会出现unity activity的黑屏;同时,个人认为三方授权界面不要写成fullscreen格式的比较好

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354