當前位置:首頁 » 安卓系統 » android銷毀棧

android銷毀棧

發布時間: 2022-08-28 15:38:22

❶ android面試一個應用的兩個activity 可以在不同棧里嗎

1、什麼是Activity

通俗一點說Activity就是一個界面,這個界面裡面可以放置各個控制項。Activity的界面也是用xml表示,放置在res->layout下面。每生成一個新的Activity後,我們需要在AndroidManifest.xml中注冊一下這個Activity。

2、請描述一下Activity的生命周期

onCreate(Bundle savedInstanceState):創建Activity時調用,設置在該方法中,還以Bundle的形式提供對以前存儲的任何狀態的訪問

onStart():activity變為在屏幕上對用戶可見時調用

onResume():activity開始與用戶交互時調用(無論是啟動還是重新啟動一個activity,該方法總是被調用)

onPause():activity被暫停或者收回cpu和其他資源時調用,該方法用於保存活動狀態的,也是保護現場,壓棧吧

onStop():activity被停止並轉為不可見階段及後續的生命周期事件時調用。

onRestart():重新啟動activity時調用,該活動仍在棧中,而不是啟動新的activity

onDestroy():activity被完全從系統內存中移除時調用

3、兩個Activity之間跳轉時必然會執行的是哪幾個方法:

onCreate():在activity生命周期開始時調用

onRestoreInstanceState():用來恢復UI狀態

onRestart():當activity重新啟動時調用

onStart():當activity對用戶即將可見時調用

onResume():當activity與用戶交互時,繪制界面

onSaveInstanceState():當activity即將移除棧頂保留UI狀態時被調用

onPause():暫停當前活動的activity,提交持久數據的改變,停止動畫和其他佔用CPu資源的東西,由於下一個activity在這個方法返回之前不會resume,所以這個方法的代碼執行要快

onStop():activity不再可見時調用

onDestroy():在activity銷毀棧時被調用的最後一個方法

4、橫豎屏幕切換時候activity的生命周期

①不設置activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,且豎屏時會執行兩次

②設置activity的android:configChanges=」orientation"時,切屏還是會調用各個生命周期,切橫屏,豎屏時只會執行一次

③設置activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法

5、你後台的Activity被系統回收怎麼辦?

系統會幫我們記錄下回收之前Activity的狀態,再次調用被回收的Activity就要重新調用onCreate()方法,不同於直接啟動的是這回onCreate()裡面帶上參數savedInstanceState,savedInstanceState是一個Bundle對象,基本上可以把它理解為系統幫你維護的一個map對象,使用它可以恢復到回收前的狀態

6、如何將一個activity設置為窗口的樣式

①在你的style.xml文件中可以新建一如下的類似Dialog的style:

<style name="Theme.FloatActivity" parent="android:style/Theme.Dialog></style>

②在AndroidManifest.xml中在你需要顯示為窗口的activity中添加如下屬性:

android:theme="@style/Theme.FloatActivity"即可

也可以直接添加對應需要展示為Dialog style的activity的android:theme屬性值為:android:theme="@android:style/Theme.Dialog"

7、兩個activity之間怎樣傳遞數據

在Intent的對象中增加要傳遞的參數即可

在Intent對象的請求中加入鍵值對,對應名字.putExtra(「鍵值對的名字","鍵值對的值");在另一個activity中將Intent的請求中的數據取出來:

Intent intent= getIntent();String value = intent.getStringExtra("testIntent")

8、在同一個程序,但不同的activity中是否可以放在不同的Task任務棧中?

可以放在不同的Task中。需要為不同的activity設置不同的taskaffinity屬性,啟動activity的Intent需要包含FLAG_ACTIVITY_NEW_TASK標記

❷ Android 深入探討sigleTask和singletop的區別

1.singleTask和singletop都是保真了Activity在棧中的唯一性

2.singleTask和singleTop實例存在時,都不會重新創建 new task

不同之處有如下幾點:

如果singleTask啟動的ActivityA位於棧底,在棧頂startActivity到這個ActivityA時會調動
onNewIntent->onStart->onResume。

但singleTask啟動的的ActivityA不存在時,會重新創建ActivityA,調用方式OnCreate->OnStart->OnResume

2.如果singletop啟動的ActivityB在棧底時,在棧頂startActivity到這個ActivityB時會重新調動
onCreate->onStart->onResume,但不會調用OnDestroy

並且singletop啟動的的ActivityB不存在時,會重新創建ActivityB,調用方式OnCreate->OnStart->OnResume

3.singleTask在棧底時,從棧頂startActivity到棧底ActivityA,那麼該棧startActivity的發起者的中間部分Activity會被銷毀。而singletop是逐級跳躍到棧頂

singleTask

追加一點singleInstance,雖然也是保證唯一性,但改模式的Activity是全局性的唯一性,生命周期和應用程序相同,不能及時回收,此外的話Activity在MVC充當Controller的角色,

這點顯然對singleIntance來說不適合,因此不建議使用。

4.singleTask不適合充當ChildActivity,但singletop適合

5.對作業棧,默認情況下,沒有任何影響,因為棧的taskid是相同的,可以獲取getTaskid(),默認情況下每個activity的taskid相同

但是,如果自定義了棧的標簽(這個標簽相同的singletask activity在同一個作業棧中),那麼taskid就會初選差別

android:taskAffinity="com.sample.lanchmode.tester.main",那麼一旦另一個作業棧被銷毀,下次必然重建(相信我,這不是廢話)。

為了一句不是廢話,我需要來證明一下。

當我們的初始載入WelcomeActivity界面--->HomeActivity界面時,如果將HomeActivity的啟動模式設置為sigleTask+android:taskAffinity="自定義(一般是類名)",

①那麼WelcomeActivity銷毀後,在到達HomeActivity之後,HomeActivity回作為一個新的作業棧棧底而存在,所以由HomeActivity啟動的Activity的TaskId和HomeActivity相同。

②這個過程,WelcomeActivity和HomeActivity的TaskId是不相同的,問題出現了,當我們按下 Home鍵,然後在點擊桌面上的app圖標你會發現,WelcomeActivity再次出現了,

而且再次進入了HomeActivity,並且這個HomeActivity調用了OnNewIntent,卻沒掉用OnCreate,所以來說他一直存在這,但你需要再次過渡才能找到它。

(對於追求捕獲Home鍵讓app退出的讀者是一個喜訊,這樣可以做到每次Home之後都能再次進入登錄界面),在這個過程中沒有直接進入HomeActivity,而是WelcomeActivity(有人說不對么,不應該是這樣么,在這里不想解釋)。

注意,使用了不同作業棧的Activity,會在最近打開的app顯示一個應用會出現2個界面。

在這里,需要強調一下singleTask+android:taskAffinity不一定必須使用,請依據需求而定,網上有人推薦使用,但我卻想說,不要盲目,並不是所有的應用都適合。

1-->
singleTask+android:taskAffinity對於效率而言,優勢並不存在,比如設置進程的,但對於帶有登錄狀態的app需要慎用,否則造成信息泄露等問題,開發中只使用singleTask即可。

2-->
singleTask+android:taskAffinity適用於單用戶保密性的app(可做到Home之後下次必須登錄才能查看信息),建議在這方面試試。

轉載

❸ 清空棧與銷毀棧,該怎麼解決

1.清空了,只是棧頂指針從頭開始,棧所佔用空間已在。銷毀,就是棧內存釋放,這個棧就死亡了!
2.是的,只修改指針。棧大小不變,棧大小作為棧指針的邊界條件使用
3.你說的是順序棧,包括兩種情況。動態數組形式的和鏈表形式的。
鏈表形式的需要逐個結點釋放。如果是動態分配,整體一次釋放。

❹ 棧的清空與銷毀

對棧的操作一般應該使用指針,而不是簡單的數組~~
如果按樓主這么寫一個例子的話對清空可以直接這樣簡單的定義

void clear( SqStack &tem)
{
int i=0;
for(;i<STACKSIZE;i++)
{
items[i]=0;
}
top=0;
}

銷毀棧就直接不用寫了~~因為不是指針的話銷不銷毀沒有意義

❺ android 中怎樣能夠清除activity堆棧,也就是退出整個應用

如果退出整個程序,如下操作:方式一:Intent intent=new Intent(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_HOME);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);this.startActivity(intent);System.exit(0); 方式二:android.os.Process.killProcess(android.os.Process.myPid()); android 完全退出程序有幾個activity,有一需求是在一個activityA點擊back鍵退出系統而不是跳到之前的activity首先想到的是清空activityA的堆棧,使用intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 但是該activityA不是已經存在於堆棧底端的,所以清除的只是堆棧中該activityA上面的activity,但後退後還是會返回堆棧中該activityA下面的activity。

❻ android 如何跳轉後在指定另一個頁面銷毀,不一定是前一個頁面,就是我想哪個銷毀就銷毀哪個

要棧裡面有那個頁面的實例才可以,把你打開過的頁面的實例索引保存起來,想銷毀的時候獲取,判斷一下是否為空,不為空就銷毀

c語言銷毀棧的函數。大家看看寫的對不

這兩個函數一個是銷毀棧DestroyStack,一個是清空棧ClearStack
銷毀是把整個棧都釋放掉,清空只是把棧里元素清除。
因為你的棧元素是int型基本變數,所以棧元素內容是直接存放在棧空間的,並沒有另外申請內存保存棧元素,所以在從棧里移除棧元素時,不需要調用free函數。
實際上你的DestroyStack可以很直接的如下:
int DestroyStack(stack &s)
{
free(s.base); //釋放棧空間,這里假設s.base是個指針而不是數組
//如果s結構也是動態申請的,也需要執行free(s);
}
至於ClearStack,書上寫的是沒問題的,清空棧,不是要釋放棧空間,而是把棧里的元素都清除,最直接的做法就是把棧頂指針指向棧底指針,棧頂和棧底指針相同時,就表示棧內無元素,棧空間還是保留,下次可以繼續把棧元素壓棧和彈棧。

❽ android怎樣緩存數據面試題

共有七個周期函數,按順序分別是: onCreate(), onStart(), onRestart(), onResume(), onPause(),onStop(), onDestroy()。
onCreate(): 創建Activity時調用,設置在該方法中,還以Bundle的形式提供對以前存儲的任何狀態的訪問。
onStart(): Activity變為在屏幕上對用戶可見時調用。
onResume(): Activity開始與用戶交互時調用(無論是啟動還是重新啟動一個活動,該方法總是被調用。
onPause(): Activity被暫停或收回cpu和其他資源時調用,該方法用戶保護活動狀態的,也是保護現場。
onStop(): Activity被停止並轉為不可見階段及後續的生命周期事件時調用。
onRestart(): Activity被重新啟動時調用。該活動仍然在棧中,而不是啟動新的Activity。
1、完整生命周期: 即從一個Activity從出現到消失,對應的周期方法是從onCreate()到onDestroy()。
2、可見生命周期: 當Activity處於可以用戶看見的狀態,但不一定能與用戶交互時,將多次執行從onStart()到onStop()。
3、前景生命周期: 當Activity處於Activity棧最頂端,能夠與其他用戶進行交互時,將多次執行從onResume()到onPause()。

2. 兩個Activity之間跳轉時必然會執行的是哪幾個方法。
答: 兩個Activity之間跳轉必然會執行的是下面幾個方法。
onCreate()//在Activity生命周期開始時調用。
onRestoreInstanceState()//用來恢復UI狀態。
onRestart()//當Activity重新啟動時調用。
onStart()//當Activity對用戶即將可見時調用。
onResume()//當Activity與用戶交互時,繪制界面。
onSaveInstanceState()//即將移出棧頂保留UI狀態時調用。
onPause()//暫停當前活動Activity,提交持久數據的改變,停止動畫或其他佔用GPU資源的東西,由於下一個Activity在這個方法返回之前不會resume,所以這個方法的代碼執行要快。
onStop()//Activity不再可見時調用。
onDestroy()//Activity銷毀棧時被調用的最後一個方法。

3. 橫豎屏切換時候Activity的生命周期。
答:
1、不設置Activity的android: configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次。
2、設置Activity的android: configChanges=「orientation」時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次。
3、設置Activity的android: configChanges=「orientation|keyboardHidden」時,切屏不會重新調用各個生命周期,只會執行onConfiguration方法

4. 如何將一個Activity設置成窗口的樣式。
答: 第一種方法,在styles.xml文件中,可以新建如下的類似Dialog的style。
<style name=「Theme.FloatActivity」 parent=「android:style/Theme.Dialog」> </style>。
第二種方法,在AndroidManifest.xml中在需要顯示為窗口的Activity中添加如下屬性: android: theme=「@style/Theme.FloatActivity」即可。也可以直接添加對應需要展示為Dialog style的Activity的android: theme屬性為android: theme=「@ android: style/Theme.Dialog」。

5. 兩個Activity之間怎麼傳遞數據?
答: 可以在Intent對象中利用Extra來傳遞存儲數據。
在Intent的對象請求中,使用putExtra(「鍵值對的名字」,」鍵值對的值」);在另外一個Activity中將Intent中的請求數據取出來:
Intent intent = getIntent();
String value = intent.getStringExtra(「testIntent」);

6. 怎麼讓在啟動一個Activity是就啟動一個service?
答: 首先定義好一個service,然後在Activity的onCreate裡面進行連接並bindservice或者直接startService。

7. Activity怎麼和service綁定,怎麼在activity中啟動自己對應的service?
答:
1、activity能進行綁定得益於Serviece的介面。為了支持Service的綁定,實現onBind方法。
2、Service和Activity的連接可以用ServiceConnection來實現。需要實現一個新的ServiceConnection,重現onServiceConnected和OnServiceDisconnected方法,一旦連接建立,就能得到Service實例的引用。
3、執行綁定,調用bindService方法,傳入一個選擇了要綁定的Service的Intent(顯示或隱式)和一個你實現了的ServiceConnection的實例

8.什麼是Service以及描述下它的生命周期。Service有哪些啟動方法,有什麼區別,怎樣停用Service?
答: Android Service是運行在後台的代碼,不能與用戶交互,可以運行在自己的進程,也可以運行在其他應用程序進程的上下文里。需要通過某一個Activity或者Context對象來調用。Service有兩個啟動方法,分別是Context.startService()和Context.bindService()。如果在Service執行耗時的操作需要啟動一個新線程來執行。
Android Service只繼承了onCreate(), onStart(),onDestroy()三個方法,當我們第一次啟動Service時,先後調用onCreate(), onStart()這兩個方法,當停止Service時,則執行onDestroy()方法時。如果Service已經啟動了,當我們再次啟動Service時,不會再執行onCreate()方法,而是直接執行onStart()方法。

9. 什麼時候使用Service?
答: 比如播放多媒體的時候,用戶啟動了其他Activity,這個時候程序要在後台繼續播放,比如檢測SD卡上文件的變化,再或者在後台記錄你的地理信息位置的改變等等。

10. 請描述一下Intent 和 Intent Filter。
答: Intent在Android中被翻譯為」意圖」,他是三種應用程序基本組件-Activity,Service和broadcast receiver之間相互激活的手段。在調用Intent名稱時使用ComponentName也就是類的全名時為顯示調用。這種方式一般用於應用程序的內部調用,因為你不一定會知道別人寫的類的全名。而Intent Filter是指意圖過濾,不出現在代碼中,而是出現在android Manifest文件中,以<intent-filter>的形式。(有一個例外是broadcast receiver的intent
filter是使用Context.registerReceiver()來動態設定的,其中intent filter也是在代碼中創建的)
一個intent有action,data,category等欄位。一個隱式intent為了能夠被某個intent filter接收,必須通過3個測試,一個intent為了被某個組件接收,則必須通過它所有的intent filter中的一個。

11. Intent傳遞數據時,可以傳遞哪些類型數據?
答: intent間傳送數據一般有兩種常用的方法: 1、extra 2、data。
extra可以用Intent.putExtra放入數據。新啟動的Activity可用Intent.getExtras取出Bundle,然後用Bundles.getLong,getInt,getBoolean,getString等函數來取放進去的值。
Data則是傳輸url。url可以是指我們熟悉的http,ftp等網路地址,也可以指content來指向ContentProvider提供的資源。Intent.setData可以放入數據,Intent.getData可以取出數據。

12. 說說Activity,Intent,Service是什麼關系 ?
答: 一個Activity通常是一個單獨的屏幕,每一個Activity都被實現為一個單獨的類,這些類都是從Activity基類中繼承而來的。Activity類會顯示由視圖控制項組成的用戶介面,並對視圖控制項的事件做出響應。
Intent的調用是用來進行屏幕之間的切換。Intent描述應用想要做什麼。Intent數據結構中兩個最重要的部分是動作和動作對應的數據,一個動作對應一個動作數據。
Service是運行在後台的代碼,不能與用戶交互,可以運行在自己的進程里,也可以運行在其他應用程序進程的上下文里。需要一個Activity或者其他Context對象來調用。
Activity跳轉Activity,Activity啟動Service,Service打開Activity都需要Intent表明意圖,以及傳遞參數,Intent是這些組件間信號傳遞的承載著。

13. 請描述一下BroadcastReceiver。
答: Broadcast Receiver用於接收並處理廣播通知(broadcast announcements)。多數的廣播是系統發起的,如地域變換、電量不足、來電簡訊等。程序也可以播放一個廣播。程序可以有任意數量的broadcast receivers來響應它覺得重要的通知。Broadcast receiver可以通過多種方式通知用戶: 啟動activity、使用NotificationManager、開啟背景燈、振動設備、播放聲音等,最典型的是在狀態欄顯示一個圖標,這樣用戶就可以點它打開看通知內容。通常我們的某個應用或系統本身在某些事件(電池電量不足、來電簡訊)來臨時會廣播一個Intent出去,我們利用注冊一個broadcast
receiver來監聽這些Intent並獲取Intent中的數據。

14. 在manifest和代碼中如何注冊和使用 broadcast receiver 。
答: 在android的manifest中注冊
<receiver android: name =「Receiver1」>
<intent-filter>
<!----和Intent中的action對應--->
<actionandroid: name=「com.forrest.action.mybroadcast」/>
</intent-filter>
</receiver>
在代碼中注冊
1、 IntentFilter filter = new IntentFilter(「com.forrest.action.mybroadcast」);//和廣播中Intent的action對應;
2、 MyBroadcastReceiver br= new MyBroadcastReceiver();
3、 registerReceiver(br, filter);

15. 請介紹下ContentProvider是如何實現數據共享的。
答: 一個程序可以通過實現一個Content provider的抽象介面將自己的數據完全暴露出去,而且Content provider是以類似資料庫中的表的方式將自己的數據暴露。Content provider存儲和檢索數據,通過它可以讓所有的應用程序訪問到,這也是應用程序之間唯一共享數據的方法。
要想使應用程序的數據公開化,可通過2種方法:創建一個數據自己的Content Provider或者將你的數據添加到一個已經存在的Content Provider中,前提是有相同數據類型並且有寫入Content Provider的許可權,Android提供了Content Resolverr,外界的程序可以通過Content Resolver介面訪問Content Provider提供的數據。

16. 請介紹下Android的數據存儲方式。
答: Android提供了5中存儲數據的方式,分別是以下幾種
1、使用Shared Preferences存儲數據,用來存儲key-value,pairs格式的數據,它是一個輕量級的鍵值存儲機制,只可以存儲基本數據類型。
2、使用文件存儲數據,通過FileInputStream和FileOutputStream對文件進行操作。在Android中,文件是一個應用程序私有的,一個應用程序無法讀寫其他應用程序的文件。
3、使用SQLite資料庫存儲數據,Android提供的一個標准資料庫,支持SQL語句。
4、使用Content Provider存儲數據,是所有應用程序之間數據存儲和檢索的一個橋梁,它的作用就是使得各個應用程序之間實現數據共享。它是一個特殊的存儲數據的類型,它提供了一套標準的介面用來獲取數據,操作數據。系統也提供了音頻、視頻、圖像和個人信息等幾個常用的Content Provider。如果你想公開自己的私有數據,可以創建自己的Content Provider類,或者當你對這些數據擁有控制寫入的許可權時,將這些數據添加到Content Provider中實現共享。外部訪問通過Content Resolver去訪問並操作這些被暴露的數據。
5、使用網路存儲數據

17. 請介紹下Android中常用的五種布局。
答: 最常用的布局方式為Absolute Layout、Relative Layout、Linear Layout、FrameLayout、TableLayout。其中Linear Layout和Relative Layout是最常用的方式,他們可以通過在xml配置文件或者代碼中進行布局。
1、Frame Layout是最簡單的布局方式,放置的控制項都只能羅列到左上角,控制項會有重疊,不能進行復雜的布局。
2、Linear Layout可以通過orientation屬性設置線性排列的方向是垂直還是縱向的,每行或每列只有一個元素,可以進行復雜的布局。
3、Absolute Layout可以讓子元素指定準確的x、y坐標值,並顯示在屏幕上。Absolute Layout沒有頁邊框,允許元素之間相互重疊。它是絕對坐標,所以在實際中不提倡使用。

4、Relative Layout允許子元素制定他們相對於其他元素或父元素的位置(通過ID制定)。因此,你可以以右對齊,或上下,或置於屏幕中央的形式來排列兩個元素。元素按順序排列,因此如果第一個元素在屏幕的中央,那麼相對於這個元素的其他元素將以屏幕中央的相對位置來排列。這個是相對於Absolute Layout的,採用相對坐標,所以在實際中比較常用。
5、Table Layout將以子元素的位置分配到行或列。一個Table Layout由許多的Table Row組成,每個Table Row都會定義一個row。Table Layout容器不會顯示row、column或者cell的邊線框。每個row擁有0個或多個的cell; 和html中的table差不多。在實際中也經常使用。

18. 談談UI中, Padding和Margin有什麼區別?
答: Padding是控制項的內容相對控制項的邊緣的邊距,而Margin是控制項邊緣相對於其他控制項的邊距。如下圖所示:

19. android本身的一些限制,比如apk包大小限制,讀取大文件時的時間限。
答:apk包大小限制不好說,有的apk為100M,還是能裝到手機上。一般的apk大小為5~10M左右。讀取大文件的時間應該是在main線程裡面,時間限制為5秒左右。

20. ListView如何提高其效率?
答:1、使用分頁載入,不要一次性載入所有數據。
2、復用convertView。在getItemView中,判斷converView是否為空,如果不為空,可復用。
3、非同步載入圖片。Item中如果包含有webimage,那麼最好非同步載入。
4、快速滑動時,不顯示圖片。當快速滑動列表(SCROLL_STATE_FLING),item中的圖片或獲取需要消耗資源的view,可以不顯示出來;而處於其他兩種狀態(SCROLL_STATE_IDLE和SCROLL_STATE_TOUCH_SCROLL),則將那些view顯示出來

❾ 怎麼徹底銷毀棧

手動寫零吧。

free(Optr.ttop)之前:
memset(Optr.ttop, 0, //stack的size);

熱點內容
創建郵箱地址伺服器連接錯誤 發布:2025-01-13 09:49:24 瀏覽:723
linux編輯文檔 發布:2025-01-13 09:47:51 瀏覽:435
二手製冷壓縮機 發布:2025-01-13 09:43:59 瀏覽:585
網魚電腦密碼多少 發布:2025-01-13 09:33:46 瀏覽:464
如何取消子賬號密碼 發布:2025-01-13 09:22:41 瀏覽:347
抖音搜索有緩存 發布:2025-01-13 09:17:28 瀏覽:590
c語言字元數組連接 發布:2025-01-13 08:55:11 瀏覽:901
國二c語言編程題目 發布:2025-01-13 08:45:41 瀏覽:285
ipad軟體如何加密 發布:2025-01-13 08:28:59 瀏覽:278
android的文件操作 發布:2025-01-13 08:24:48 瀏覽:173