編輯:關於Android編程
在項目中,遇到一個問題百思不得其解,那就是:我在app使用過程中,點擊了home鍵,然後去看看微信之類的其他應用,這個時候再點擊app桌面的圖標,這個時候app是重新啟動的,而不是從上次停止的界面開始的。
對於上面的情況,我覺得既然我的app已經在後台還運行著,為什麼就不能繼續重上一個界面繼續運行,非得從新運行呢。然後我就去查資料解決了這個問題。首先講講這個現象的本質。
原因:當點擊app桌面圖標時,app默認是任務你要新建一個應用,而不會去判斷你後台有沒有再運行的相同應用。
經過實踐我發現:當你點擊應用桌面圖標,應用會重新創建你的app的啟動頁,然而,你快速的點擊返回按鈕,你會發現你會回到上一次退出時的界面。經過查閱資料發現,系統會記錄你啟動acitivity的啟動順序的棧。並且把當前的啟動頁放到了最上方,如下圖所示:
注意:資料上面說以前啟動的activity都是不在了,只是系統記錄了他們啟動的順序,然而你按返回鍵,系統就會自動的重新創建新的activity,加入當app依次啟動了1到11的activity,然而,在11這個activity的時候,你點擊了home鍵、或點擊了其他軟件如微信qq等,這個時候你的app進入後台,1到11的這些activity其實被系統回收了,但是系統記錄了這個activity啟動順序的棧,然後當你回到這個應用時,實際上系統是重新創建了Activity11,然後點擊返回鍵,右重新創建了Activity10,就是這樣倒序 創建activity的原理。
然而,當你把App放入後台時,這個時候點擊了app桌面的啟動圖標,這個時候系統會默認你開啟一個新的應用,但是因為一個軟件只能在手機上面運行一個,所以,系統發現你之前的app還在後台,這個時候系統會把新創建的activity放到了之前activity棧的頂部,如上圖所示的Activity1
知道了原因之後,我們就好做處理了。
第一步:查看Activity1的啟動模式,如果Activity1的啟動模式為singleTask
android:launchMode="singleTask"
那麼必須把他刪除掉,或者改為“standard"。 第二步:在你的app的AndroidManifest.xml文件的application標簽下面設置
android:persistent="true"持久化為 true;防止你的app掛後台被回收。 第三步:在activity1的onCreate方法中設置如下方法:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { finish(); return; } setContentView(R.layout.activity1_layout); // Regular activity creation code... }其實就是在setContentView()之前設置如下代碼:
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { finish(); return; }用於判斷這個Activity的啟動標志,看它所在的應用是不是從後台跑到前台的。如果是,則直接把它finish()掉,然後系統會去Activity啟動歷史棧查詢上一個activity,然後再新建它,所以還原到了我們按home鍵出去的那個界面。 好了,就這樣解決了App在後台運行,點擊應用圖標它會重新啟動的問題。希望對你有所幫助!
前言本文在Ubuntu 64位系統上對qemu項目進行交叉編譯,並且只編譯與qemu user mode有關的代碼。下文中的”NDK”若無特殊說明
之所以單列一篇寫進程管理,是因為看到注釋上寫“這是一個復雜的進程管理程序”,但是仔細看了一下好像也沒那麼“復雜”...這一
我們知道,在Android系統中,Activity是以堆棧的形式組織在ActivityManagerService服務中的。與Activity類似,Android系統中的
前面幾篇博文介紹了Android如何自定義控件,其實就是講一下如何“從無到有”的自定義一個全新的控件,繼承View或者繼承ViewG