课题对Android近期任务列表Recent Applications的简单分析Word下载.docx
《课题对Android近期任务列表Recent Applications的简单分析Word下载.docx》由会员分享,可在线阅读,更多相关《课题对Android近期任务列表Recent Applications的简单分析Word下载.docx(18页珍藏版)》请在冰点文库上搜索。
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:
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<
numIcons&
&
mIcons[numButtons].getVisibility()==View.VISIBLE){
94numButtons+=1;
95}
96if(numButtons!
=0){
97intnextFocus=backward?
numButtons-1:
0;
98for(inti=0;
i<
numButtons;
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;
numIcons;
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:
151if(b==v){
152RecentTagtag=(RecentTag)b.getTag();
153switchTo(tag);
154break;
155}
156}
157dismiss();
158}
159
160//
161privatevoidswitchTo(RecentTagtag){
162if(tag.info.id>
163//Thisisanactivetask;
itshouldjustgototheforeground.
164finalActivityManageram=(ActivityManager)
165getContext().getSystemService(Context.ACTIVITY_SERVICE);
166am.moveTaskToFront(tag.info.id,ActivityManager.MOVE_TASK_WITH_HOME);
167}elseif(tag.intent!
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!
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!
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<
ActivityManager.RecentTaskInfo>
recentTasks=
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;
numTasks&
(index<
NUM_BUTTONS);
++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!
243intent.setComponent(info.origActivity);
244}
245
246//Skipthecurrenthomeactivity.
247if(homeInfo!
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!
260finalActivityInfoactivityInfo=resolveInfo.activityInfo;
261finalStringtitle=activityInfo.loadLabel(pm).toString();
262Drawableicon=activityInfo.loadIcon(pm);
263
264if(title!
=null&
title.length()>
0&
icon!
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<
NUM_BUTTONS;
++index){
286mIcons[index].setVisibility(View.GONE);
287}
288}
289
290/**
291*ThisisthelistenerfortheACTION_CLOSE_SYSTEM_DIALOGSintent.