课题对Android近期任务列表Recent Applications的简单分析.docx
- 文档编号:22807128
- 上传时间:2023-04-28
- 格式:DOCX
- 页数:18
- 大小:21.44KB
课题对Android近期任务列表Recent Applications的简单分析.docx
《课题对Android近期任务列表Recent Applications的简单分析.docx》由会员分享,可在线阅读,更多相关《课题对Android近期任务列表Recent Applications的简单分析.docx(18页珍藏版)》请在冰豆网上搜索。
课题对Android近期任务列表RecentApplications的简单分析
对Android近期任务列表(RecentApplications)的简单分析
这里的近期任务列表就是长按Home键出来的那个Dialog,里面放着近期打开过的应用,当然3.0以上系统的多任务切换键也是。
这个Dialog的实现在Android源码的.
接下来就对这个源码分析一下。
先把整个源码贴出来:
1publicclassRecentApplicationsDialogextendsDialogimplementsOnClickListener{
2//Elementsfordebuggingsupport
3//privatestaticfinalStringLOG_TAG="RecentApplicationsDialog";
4privatestaticfinalbooleanDBG_FORCE_EMPTY_LIST=false;
5
6staticprivateStatusBarManagersStatusBar;
7
8privatestaticfinalintNUM_BUTTONS=8;
9privatestaticfinalintMAX_RECENT_TASKS=NUM_BUTTONS*2;//allowforsomediscards
10
11finalTextView[]mIcons=newTextView[NUM_BUTTONS];
12ViewmNoAppsText;
13IntentFiltermBroadcastIntentFilter=newIntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
14
15classRecentTag{
16ActivityManager.RecentTaskInfoinfo;
17Intentintent;
18}
19
20HandlermHandler=newHandler();
21RunnablemCleanup=newRunnable(){
22publicvoidrun(){
23//dumpextramemorywe'rehangingonto
24for(TextViewicon:
mIcons){
25icon.setCompoundDrawables(null,null,null,null);
26icon.setTag(null);
27}
28}
29};
30
31publicRecentApplicationsDialog(Contextcontext){
32super(context,com.android.internal.R.style.Theme_Dialog_RecentApplications);
33
34}
35
36/**
37*Wecreatetherecentapplicationsdialogjustonce,anditstaysaround(hidden)
38*untilactivatedbytheuser.
39*
40*@seePhoneWindowManager#showRecentAppsDialog
41*/
42@Override
43protectedvoidonCreate(BundlesavedInstanceState){
44super.onCreate(savedInstanceState);
45
46Contextcontext=getContext();
47
48if(sStatusBar==null){
49sStatusBar=(StatusBarManager)context.getSystemService(Context.STATUS_BAR_SERVICE);
50}
51
52Windowwindow=getWindow();
53window.requestFeature(Window.FEATURE_NO_TITLE);
54window.setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG);
55window.setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
56WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
57window.setTitle("Recents");
58
59setContentView(com.android.internal.R.layout.recent_apps_dialog);
60
61finalWindowManager.LayoutParamsparams=window.getAttributes();
62params.width=WindowManager.LayoutParams.MATCH_PARENT;
63params.height=WindowManager.LayoutParams.MATCH_PARENT;
64window.setAttributes(params);
65window.setFlags(0,WindowManager.LayoutParams.FLAG_DIM_BEHIND);
66
67//默认显示8个
68mIcons[0]=(TextView)findViewById(com.android.internal.R.id.button0);
69mIcons[1]=(TextView)findViewById(com.android.internal.R.id.button1);
70mIcons[2]=(TextView)findViewById(com.android.internal.R.id.button2);
71mIcons[3]=(TextView)findViewById(com.android.internal.R.id.button3);
72mIcons[4]=(TextView)findViewById(com.android.internal.R.id.button4);
73mIcons[5]=(TextView)findViewById(com.android.internal.R.id.button5);
74mIcons[6]=(TextView)findViewById(com.android.internal.R.id.button6);
75mIcons[7]=(TextView)findViewById(com.android.internal.R.id.button7);
76mNoAppsText=findViewById(com.android.internal.R.id.no_applications_message);
77
78//关键在哪,你懂得...
79for(TextViewb:
mIcons){
80b.setOnClickListener(this);
81}
82}
83
84@Override
85publicbooleanonKeyDown(intkeyCode,KeyEventevent){
86if(keyCode==KeyEvent.KEYCODE_TAB){
87//IgnoreallmetakeysotherthanSHIFT.Theappswitchkeycouldbea
88//fallbackactionchordedwithALT,METAorevenCTRLdependingonthekeymap.
89//DPadnavigationishandledbytheViewRootelsewhere.
90finalbooleanbackward=event.isShiftPressed();
91finalintnumIcons=mIcons.length;
92intnumButtons=0;
93while(numButtons 94numButtons+=1; 95} 96if(numButtons! =0){ 97intnextFocus=backward? numButtons-1: 0; 98for(inti=0;i 99if(mIcons[i].hasFocus()){ 100if(backward){ 101nextFocus=(i+numButtons-1)%numButtons; 102}else{ 103nextFocus=(i+1)%numButtons; 104} 105break; 106} 107} 108finalintdirection=backward? View.FOCUS_BACKWARD: View.FOCUS_FORWARD; 109if(mIcons[nextFocus].requestFocus(direction)){ 110mIcons[nextFocus].playSoundEffect( 111SoundEffectConstants.getContantForFocusDirection(direction)); 112} 113} 114 115//ThedialogalwayshandlesthekeytopreventtheViewRootfrom 116//performingthedefaultnavigationitself. 117returntrue; 118} 119 120returnsuper.onKeyDown(keyCode,event); 121} 122 123/** 124*Dismissthedialogandswitchtotheselectedapplication. 125*/ 126publicvoiddismissAndSwitch(){ 127finalintnumIcons=mIcons.length; 128RecentTagtag=null; 129for(inti=0;i 130if(mIcons[i].getVisibility()! =View.VISIBLE){ 131break; 132} 133if(i==0||mIcons[i].hasFocus()){ 134tag=(RecentTag)mIcons[i].getTag(); 135if(mIcons[i].hasFocus()){ 136break; 137} 138} 139} 140if(tag! =null){ 141switchTo(tag); 142} 143dismiss(); 144} 145 146/** 147*Handlerforuserclicks.Ifabuttonwasclicked,launchthecorrespondingactivity. 148*/ 149publicvoidonClick(Viewv){ 150for(TextViewb: mIcons){ 151if(b==v){ 152RecentTagtag=(RecentTag)b.getTag(); 153switchTo(tag); 154break; 155} 156} 157dismiss(); 158} 159 160// 161privatevoidswitchTo(RecentTagtag){ 162if(tag.info.id>=0){ 163//Thisisanactivetask;itshouldjustgototheforeground. 164finalActivityManageram=(ActivityManager) 165getContext().getSystemService(Context.ACTIVITY_SERVICE); 166am.moveTaskToFront(tag.info.id,ActivityManager.MOVE_TASK_WITH_HOME); 167}elseif(tag.intent! =null){ 168tag.intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY 169|Intent.FLAG_ACTIVITY_TASK_ON_HOME); 170try{ 171getContext().startActivity(tag.intent); 172}catch(ActivityNotFoundExceptione){ 173Log.w("Recent","Unabletolaunchrecenttask",e); 174} 175} 176} 177 178/** 179*Setupandshowtherecentactivitiesdialog. 180*/ 181@Override 182publicvoidonStart(){ 183super.onStart(); 184reloadButtons(); 185if(sStatusBar! =null){ 186sStatusBar.disable(StatusBarManager.DISABLE_EXPAND); 187} 188 189//receivebroadcasts 190getContext().registerReceiver(mBroadcastReceiver,mBroadcastIntentFilter); 191 192mHandler.removeCallbacks(mCleanup); 193} 194 195/** 196*Dismisstherecentactivitiesdialog. 197*/ 198@Override 199publicvoidonStop(){ 200super.onStop(); 201 202if(sStatusBar! =null){ 203sStatusBar.disable(StatusBarManager.DISABLE_NONE); 204} 205 206//stopreceivingbroadcasts 207getContext().unregisterReceiver(mBroadcastReceiver); 208 209mHandler.postDelayed(mCleanup,100); 210} 211 212/** 213*Reloadthe6buttonswithrecentactivities 214*/ 215privatevoidreloadButtons(){ 216 217finalContextcontext=getContext(); 218finalPackageManagerpm=context.getPackageManager(); 219finalActivityManageram=(ActivityManager) 220context.getSystemService(Context.ACTIVITY_SERVICE); 221finalList 222am.getRecentTasks(MAX_RECENT_TASKS,ActivityManager.RECENT_IGNORE_UNAVAILABLE); 223 224ActivityInfohomeInfo= 225newIntent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME) 226.resolveActivityInfo(pm,0); 227 228IconUtilitiesiconUtilities=newIconUtilities(getContext()); 229 230//Performancenote: OurandroidperformanceguidesaystopreferIteratorwhen 231//usingaListclass,butbecauseweknowthatgetRecentTasks()alwaysreturns 232//anArrayList<>,we'lluseasimpleindexinstead. 233intindex=0; 234intnumTasks=recentTasks.size(); 235for(inti=0;i 236finalActivityManager.RecentTaskInfoinfo=recentTasks.get(i); 237 238//fordebugpurposesonly,disallowfirstresulttocreateemptylists 239if(DBG_FORCE_EMPTY_LIST&&(i==0))continue; 240 241Intentintent=newIntent(info.baseIntent); 242if(info.origActivity! =null){ 243intent.setComponent(info.origActivity); 244} 245 246//Skipthecurrenthomeactivity. 247if(homeInfo! =null){ 248if(homeInfo.packageName.equals( 249intent.getComponent().getPackageName()) 250&&homeInfo.name.equals( 251intent.getComponent().getClassName())){ 252continue; 253} 254} 255 256intent.setFlags((intent.getFlags()&~Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) 257|Intent.FLAG_ACTIVITY_NEW_TASK); 258finalResolveInforesolveInfo=pm.resolveActivity(intent,0); 259if(resolveInfo! =null){ 260finalActivityInfoactivityInfo=resolveInfo.activityInfo; 261finalStringtitle=activityInfo.loadLabel(pm).toString(); 262Drawableicon=activityInfo.loadIcon(pm); 263 264if(title! =null&&title.length()>0&&icon! =null){ 265finalTextViewtv=mIcons[index]; 266tv.setText(title); 267icon=iconUtilities.createIconDrawable(icon); 268tv.setCompoundDrawables(null,icon,null,null); 269RecentTagtag=newRecentTag(); 270tag.info=info; 271tag.intent=intent; 272tv.setTag(tag); 273tv.setVisibility(View.VISIBLE); 274tv.setPressed(false); 275tv.clearFocus(); 276++index; 277} 278} 279} 280 281//handlethecaseof"noiconstoshow" 282mNoAppsText.setVisibility((index==0)? View.VISIBLE: View.GONE); 283 284//hidetherest 285for(;index 286mIcons[index].setVisibility(View.GONE); 287} 288} 289 290/** 291*ThisisthelistenerfortheACTION_CLOSE_SYSTEM_DIALOGSintent.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课题对Android近期任务列表Recent Applications的简单分析 课题 Android 近期 任务 列表 Recent Applications 简单 分析