Android SingleInstance的Activity與懸浮窗切換邏輯(startActivity無(wú)反應(yīng))

1凄吏、需求

視頻通話Activity可切換小窗(懸浮窗)顯示。不懂的話就是和微信的視頻通話差不多燃乍。

2楞卡、實(shí)現(xiàn)

視頻通話Activity全局只能存在一個(gè)實(shí)例霜运,遂用SingleInstance啟動(dòng)模式。切換到懸浮窗蒋腮,因?yàn)橐4嬉曨l通話Activity的狀態(tài)信息淘捡,所以不能銷毀Activity,那要怎么樣才能返回到上一個(gè)頁(yè)面呢池摧?這里我們利用SingleInstance啟動(dòng)模式的特性:新建一個(gè)Activity Task單獨(dú)用于存放視頻通話Activity的實(shí)例焦除。我們應(yīng)該知道Android系統(tǒng)有且僅有一個(gè)Activity Task會(huì)處于前臺(tái),當(dāng)一個(gè)新的Task開啟后作彤,原來(lái)的Task就會(huì)默認(rèn)退到后臺(tái)(不可見)膘魄,一般情況下,新的Task中的Activity銷毀后竭讳,會(huì)返回到上一個(gè)Task中的TopActivity頁(yè)面创葡,但是懸浮窗顯示的需求不允許我們銷毀這個(gè)Task中的Activity,那要用什么方法才能返回到上一個(gè)頁(yè)面而不銷毀視頻通話Activity呢绢慢?

/**
 * 把當(dāng)前Activity示例所在的Task移動(dòng)到后臺(tái)
 * {@link android.app.Activity#moveTaskToBack(boolean nonRoot)}
 * @param nonRoot If false then this only works if the activity is the root
 *                of a task; if true it will work for any activity in
 *                a task.
 */
moveTaskToBack(true);

這樣當(dāng)前就達(dá)到了視頻通話Activity在不銷毀情況下隱藏的需求了蹈丸。
關(guān)于懸浮窗如何實(shí)現(xiàn)這里不再贅述了,給大家貼幾條鏈接看下吧呐芥。
Android懸浮窗操作使用總結(jié)
Andorid 應(yīng)用內(nèi)懸浮控件實(shí)踐方案總結(jié)
EasyFloat:浮窗從未如此簡(jiǎn)單

3逻杖、問(wèn)題

到現(xiàn)在基本實(shí)現(xiàn)了此需求的大致邏輯。
點(diǎn)擊懸浮窗回到視頻通話Activity很簡(jiǎn)單思瘟,調(diào)用startActivity重新打開視頻通話Activity就好了荸百。
自測(cè)沒問(wèn)題,提測(cè)后問(wèn)題來(lái)了滨攻。够话。。

榮耀和小米5返回不了視頻通話Activity光绕,startActivity絲毫反應(yīng)都沒有女嘲,日志也什么也沒有,我到最后也沒查出個(gè)所以然來(lái)诞帐。所以索性另尋重啟視頻通話Activity的方法了欣尼。

private void moveToFront() {
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    if (manager != null) {
        List<ActivityManager.RunningTaskInfo> recentTasks = manager.getRunningTasks(Integer.MAX_VALUE);
        if (recentTasks != null && !recentTasks.isEmpty()) {
            for (ActivityManager.RunningTaskInfo taskInfo : recentTasks) {
                ComponentName cpn = taskInfo.baseActivity;
                if (null != cpn && TextUtils.equals(VideoChatActivity.class.getName(), cpn.getClassName())) {
                    manager.moveTaskToFront(taskInfo.id, ActivityManager.MOVE_TASK_NO_USER_ACTION);
                    break;
                }
            }
        }
    }
}

moveTaskToFront方法具體詳情查看下方源碼:

/**
 * Flag for {@link #moveTaskToFront(int, int)}: also move the "home"
 * activity along with the task, so it is positioned immediately behind
 * the task.
 */
public static final int MOVE_TASK_WITH_HOME = 0x00000001;

/**
 * Flag for {@link #moveTaskToFront(int, int)}: don't count this as a
 * user-instigated action, so the current activity will not receive a
 * hint that the user is leaving.
 */
public static final int MOVE_TASK_NO_USER_ACTION = 0x00000002;

/**
 * Equivalent to calling {@link #moveTaskToFront(int, int, Bundle)}
 * with a null options argument.
 *
 * @param taskId The identifier of the task to be moved, as found in
 * {@link RunningTaskInfo} or {@link RecentTaskInfo}.
 * @param flags Additional operational flags.
 */
@RequiresPermission(android.Manifest.permission.REORDER_TASKS)
public void moveTaskToFront(int taskId, @MoveTaskFlags int flags) {
    moveTaskToFront(taskId, flags, null);
}

/**
 * Ask that the task associated with a given task ID be moved to the
 * front of the stack, so it is now visible to the user.
 *
 * @param taskId The identifier of the task to be moved, as found in
 * {@link RunningTaskInfo} or {@link RecentTaskInfo}.
 * @param flags Additional operational flags.
 * @param options Additional options for the operation, either null or
 * as per {@link Context#startActivity(Intent, android.os.Bundle)
 * Context.startActivity(Intent, Bundle)}.
 */
@RequiresPermission(android.Manifest.permission.REORDER_TASKS)
public void moveTaskToFront(int taskId, @MoveTaskFlags int flags, Bundle options) {
    try {
        ActivityThread thread = ActivityThread.currentActivityThread();
        IApplicationThread appThread = thread.getApplicationThread();
        String packageName = mContext.getPackageName();
        getTaskService().moveTaskToFront(appThread, packageName, taskId, flags, options);
    } catch (RemoteException e) {
        throw e.rethrowFromSystemServer();
    }
}

4、總結(jié)

沒問(wèn)題的方法就是好方法停蕉,希望你能用上愕鼓。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市慧起,隨后出現(xiàn)的幾起案子菇晃,更是在濱河造成了極大的恐慌,老刑警劉巖蚓挤,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磺送,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡灿意,警方通過(guò)查閱死者的電腦和手機(jī)估灿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)脾歧,“玉大人甲捏,你說(shuō)我怎么就攤上這事”拗矗” “怎么了司顿?”我有些...
    開封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)兄纺。 經(jīng)常有香客問(wèn)我大溜,道長(zhǎng),這世上最難降的妖魔是什么估脆? 我笑而不...
    開封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任钦奋,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘付材。我一直安慰自己朦拖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開白布厌衔。 她就那樣靜靜地躺著璧帝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪富寿。 梳的紋絲不亂的頭發(fā)上睬隶,一...
    開封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音页徐,去河邊找鬼苏潜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛变勇,可吹牛的內(nèi)容都是我干的恤左。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼贰锁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼赃梧!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起豌熄,我...
    開封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤授嘀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后锣险,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蹄皱,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年芯肤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了巷折。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡崖咨,死狀恐怖锻拘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情击蹲,我是刑警寧澤署拟,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站歌豺,受9級(jí)特大地震影響推穷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜类咧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一馒铃、第九天 我趴在偏房一處隱蔽的房頂上張望蟹腾。 院中可真熱鬧,春花似錦区宇、人聲如沸娃殖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)珊随。三九已至,卻和暖如春柿隙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鲫凶。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工禀崖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人螟炫。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓波附,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親昼钻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子掸屡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348