多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > 任務列表上小程序獨立顯示原理淺析

任務列表上小程序獨立顯示原理淺析

來源:程序員人生   發布時間:2017-03-18 08:17:37 閱讀次數:4931次

在1月9號晚體驗了小程序以后,我使用魅族手機清除當前已開啟的利用(多任務列表)的時候,我驚奇發現小程序竟然“獨立”于微信有自己的“生命周期”。

以下:

這里寫圖片描述

圖中的 查地鐵,摩拜單車 都是開啟的小程序。這樣的效果是否是和獨立的app1樣呢!我是覺得簡直1模1樣!

出于好奇,查閱相干資料(見文末參考文獻)
初步分析以下:
小程序和微信就是顯示在系統的任務列表也就是開啟的任務縮略圖那里,如上圖列出的就是最近啟動過的任務縮略圖。那末研究思路就有了:找出這個縮略圖的構成進程就可以找到答案了。其中有兩個重要的類以下:
// Recent apps

private RecentsPanelView mRecentsPanel;
private RecentTasksLoader mRecentTasksLoader;

RecentTasksLoader.java 部分代碼以下


        // return a snapshot of the current list of recent apps  
    ArrayList<TaskDescription> getRecentTasks() {  
        cancelLoadingThumbnails();  

        ArrayList<TaskDescription> tasks = new ArrayList<TaskDescription>();  
        final PackageManager pm = mContext.getPackageManager();  
        final ActivityManager am = (ActivityManager)  
                mContext.getSystemService(Context.ACTIVITY_SERVICE);  

        final List<ActivityManager.RecentTaskInfo> recentTasks =  
                am.getRecentTasks(MAX_TASKS, ActivityManager.RECENT_IGNORE_UNAVAILABLE);  

        ActivityInfo homeInfo = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME)  
                    .resolveActivityInfo(pm, 0);  

        HashSet<Integer> recentTasksToKeepInCache = new HashSet<Integer>();  
        int numTasks = recentTasks.size();  

        // skip the first task - assume it's either the home screen or the current activity.  
        final int first = 1;  
        recentTasksToKeepInCache.add(recentTasks.get(0).persistentId);  
        for (int i = first, index = 0; i < numTasks && (index < MAX_TASKS); ++i) {  
            final ActivityManager.RecentTaskInfo recentInfo = recentTasks.get(i);  

            TaskDescription item = createTaskDescription(recentInfo.id,  
                    recentInfo.persistentId, recentInfo.baseIntent,  
                    recentInfo.origActivity, recentInfo.description, homeInfo);  

            if (item != null) {  
                tasks.add(item);  
                ++index;  
            }  
        }  

        // when we're not using the TaskDescription cache, we load the thumbnails in the  
        // background  
        loadThumbnailsInBackground(new ArrayList<TaskDescription>(tasks));  
        return tasks;  
    }  

縮略圖的核心獲得方法:

RecentsPanelView.java 中 調用
refreshRecentTasksList(recentTaskDescriptions);
而終究得調用getRecentTasks()方法
mRecentTaskDescriptions = mRecentTasksLoader.getRecentTasks();

通過源碼分析,不難得出Android系統中,顯示最近程序列表的View是 RecentsPanelView類,通過refreshRecentTasksList()方法加載程序列表,其中RecentTasksLoader 負責最后的加載.
分析到這里,已明白是怎樣回事了,小程序其實不是完全和微信獨立(只是看起來獨立了).”小程序”要實現和獨立app那樣有獨立的任務縮略圖(也就是入口), 只需要把目標activity設置為 新Task 方式啟動就能夠了。

演示demo

點擊“開啟1個小程序吧”按鈕,就打開了新activity(小程序),去任務列表中查看,果然假想以下圖所示。
這里寫圖片描述

如何實現:

實現上面的效果,只是需要兩步:
1. AndroidManifest.xml中為 目標Activity 設置taskAffinity

  <activity android:name=".MiniActivity"
                  android:label="小程序"
                  android:taskAffinity=".NewTask">
        </activity>

2.以NEW_TASK方式啟動Activity

    @Override
    public void onClick(View v) {
        Intent intent = new Intent(MainActivity.this,MiniActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    }

ps:原來開啟的小程序都在新的task里面而已

FLAG_ACTIVITY_NEW_TASK的介紹:

設置此狀態,首先會查找是不是存在和被啟動的Activity具有相同的taskAffinity的task(注意同1個利用程序中默許所有activity 的taskAffinity是1樣的)。如果有,就直接把這個棧整體移動到前臺,并保持棧中的狀態不變,即棧中的activity順序不變,如果沒有,則新建1個棧來寄存被啟動的activity.
也就是說,如果App已啟動,即便用FLAG_ACTIVITY_NEW_TASK新啟動1個Activity, 由于taskAffinity默許相同,也會被壓到1個task中, 自然recent panel 就看不到兩個入口了.
要實現預設的效果還需要為目標activity設置1個參數taskAffinity=“.NewTask”,簡單的說就是設置(新建)該activity自己的啟動方式。

如何讓你的程序不出現在任務列表呢?

目前有兩種方式:
1.在AndroidManifest.xml目標Activity添加 android:excludeFromRecents屬性:

  android:excludeFromRecents="true"

2.在啟動Activity的時候設置FLAG: Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);

參考文獻:
1.系統UI介紹
2.關于如何讓利用程序不顯示在“最近利用程序”的列表中
3.taskAffinity介紹

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 性生生活网站免费 | asianjapanese日本护士 | 羞羞免费网页登界面入口 | 亚洲精品蜜桃久久久久久 | 欧美激情视频一区二区三区 | 亚洲香蕉一区二区三区在线观看 | 亚洲无线观看 | 最新日本免费一区二区三区中文 | 99re66热这里只有精品17 | 中文字幕国产欧美 | 伊人久久久久久久久久 | 91麻豆精品国产91久久久久久 | 性色在线播放 | 狂野欧美性猛交xxxx乱大交 | 国产福利一区二区精品视频 | 日本aa视频 | 亚洲欧美在线综合一区二区三区 | 全黄大全大色全免费大片 | 国产国语在线播放视频 | 国产欧美日韩精品一区二 | 国内精品免费视频精选在线观看 | 成人免费视频一区二区三区 | 激情视频区 | 德国free性video极品 | free日本xxxx另类hd | 欧美另类成人 | 久久精品久久精品国产大片 | 一区二区三区四区无限乱码 | 久久人人澡人人爽人人爱 | 亚洲理论a中文字幕在线 | 欧美jizzhd精品欧美巨大 | 国产福利一区二区三区视频在线 | 国内国内在线精品视频 | 亚洲天天做夜夜做天天欢 | 午夜欧美成人久久久久久 | 国内免费高清视频在线观看 | 免费一级肉体全黄毛片高清 | 日韩国产在线观看 | 免费女人18毛片a级毛片视频 | 亚洲国产成人久久一区二区三区 | 欧美色综合天天综合高清网 |