日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

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

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

來源:程序員人生   發(fā)布時間:2017-03-18 08:17:37 閱讀次數(shù):4940次

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

以下:

這里寫圖片描述

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

出于好奇,查閱相干資料(見文末參考文獻)
初步分析以下:
小程序和微信就是顯示在系統(tǒng)的任務列表也就是開啟的任務縮略圖那里,如上圖列出的就是最近啟動過的任務縮略圖。那末研究思路就有了:找出這個縮略圖的構(gòu)成進程就可以找到答案了。其中有兩個重要的類以下:
// 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 中 調(diào)用
refreshRecentTasksList(recentTaskDescriptions);
而終究得調(diào)用getRecentTasks()方法
mRecentTaskDescriptions = mRecentTasksLoader.getRecentTasks();

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

演示demo

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

如何實現(xiàn):

實現(xiàn)上面的效果,只是需要兩步:
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的介紹:

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

如何讓你的程序不出現(xiàn)在任務列表呢?

目前有兩種方式:
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.系統(tǒng)UI介紹
2.關于如何讓利用程序不顯示在“最近利用程序”的列表中
3.taskAffinity介紹

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 久久久午夜精品理论片中文字幕 | 久久国产精品成人免费浪潮 | 久久精品网 | 国产区在线观看 | 国产一区在线播放 | 日韩在线小视频 | 亚洲精品久久久久久久久久久 | 狠狠躁日日躁夜夜躁影院 | 欧美日韩一区在线观看 | 九一国产精品视频 | 国产精品久久久久久久久久免 | 成人区精品一区二区婷婷 | 成年人在线看片 | 欧美高h | 日韩一区网站 | 超碰伊人网 | 国产在线精品二区 | 人人爱av | 国产三级一区 | 三级电影免费观看 | 伊人888| 国产精品久久久久久久久久久久久久 | 成人一区二区三区免费视频 | 国产综合一区二区 | 91久久久久久久久久 | 精品三级在线 | 国产精品视频大全 | 中文字幕 在线观看 | 亚洲v日韩v综合v精品v | 在线看污 | 最近中文字幕视频在线观看 | 亚洲欧美中文日韩在线v日本 | 国产精品伊人 | 精品久久九 | 国产精品日韩欧美一区二区 | 久久久久久久久91 | 亚洲激情视频 | 精品视频一二三区 | 久久久久久麻豆 | 亚洲成人一区二区 | 欧洲天堂网 |