android半透明activity
㈠ 如何在Android中實現懸浮Activity
這里主要有三個任務:
計算已有的Activity的尺寸並確定它的新坐標位置;
使Activity透明,可以看見其背景;
處理背景使其不能再和用戶進行交互。
計算窗口大小
前面提到,我們需要以一個已有的手機APP為基礎(使用了ActionBarSherlock庫),這個庫我們已經以一個外部庫的形式集成到項目中,並帶有源代碼。
如果對ABS的源碼很熟悉或者曾對原生ActionBar的構架有了解,就會發現:如果改變Activity的大小,那在調用setContentView方法的時候,功能沒有實現:ActionBar的大小和位置都沒有變化。這時要做的就是在更高的級別里操作,在系統繪制ActionBar的時候——ABS或者原生的ActionBar,這時候還沒有任何窗口的數據,這樣我們就可以按照需要調整了。
最顯而易見的方式就是改變Window的尺寸,所以這里需要以下這段代碼:
看起來不錯,效果已經基本實現了。
還有一個小問題:以上測試的都是在Nexus7 android4.3上執行,而這個App在Nexus7 的android4.2版本中,Activity沒有顯示。
經過多次調試和日誌檢查後,發現我們的Activity(就叫MainActivity吧)沒有被銷毀(沒有調用onDestroy方法),所以Android系統就把它忽略了,沒有繪制它。為什麼呢?因為Android 4.4 KitKat新增了一個優化演算法。因為這個優化演算法,Android系統看到Activity為全屏顯示模式(不管WindowManager的改變),就會繪制這個MainActivity,但是它之上的東西就被忽略了,所以我們就看不到任何顯示了。
我們研究了下這個問題,然後發現對話框和其他不全屏顯示的部件都可以正常繪制,所以我們需要在主題theme里加上這幾行:
1
2
3
4
<item name="android:windowIsFloating">true</item>
<item name="android:windowCloseOnTouchOutside">false</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:backgroundDimEnabled">true</item>
這樣問題就解決了。綜上所述,我們就實現了一個懸浮、透明的Activity。
㈡ 怎樣將android控制項背景設置成透明
1、打開安卓的配置文件。
2、只需要在配置文件中把需要設置為透明的activity的樣式設置為android:theme="@android:style/Theme.Translucent"
3、這樣就可以把背景設置為透明。
㈢ 如何管理Android中Activity的生命周期
一、基礎
1.1自己創建的activity必須要繼承類Activity(或其子類)。在activity里,為了實現activity各種狀態的切換,你必須實現指定的回調方法。以下是最為重要的兩個回調方法
onCreate():
這是必須實現的回調方法,啟動一個 activity時會首先調用此方法。因此,在onCreate()的方法體里,你應該初始化該activity必要的控制項。值得注意的是,在這里你必須調用setContentView(View view)方法去呈現用戶的界面。
onPause():
在用戶將要離開activity時調用此方法(指的是此時activity處於半透明狀態且沒有獲取用戶的焦點)。通常在這樣的狀態下,你需要處理用戶數據的提交、動畫處理等操作。
1.2銷毀activity
你可以調用finish()方法去銷毀一個activity。同樣得,你可以調用finishActivity()方法去銷毀一個你剛剛啟動的activity。
tips:
在多數情況下,你是不需要顯式地調用finish…()方法去銷毀一個activity。在將要討論到的activity生命周期里,你可以知道,Android系統會為你管理activity的生命周期,所以你並不需要顯式銷毀activity(即調用finish類方法)。顯式地調用finish類方法,會對用戶的體驗產生不利的影響,除非你確實是不希望用戶返回到此activity(界面),才去顯式調用finish類方法。
二、認識activity的生命周期
2、1
Activity的生命周期對它的任務、backstack和與此有關聯的activity有著直接的影響。因此想開發出一個健壯的有彈性的Android程序,你需要學會如何去管理activity的生命周期(即調用各種回調方法)。
activity的生命周期主要包含一些三種狀態:
(1)運行態(Resumedstate)
此時Activity程序顯示在屏幕前台,並且具有焦點,可以與用戶的操作進行交互,如向用戶提供信息、捕獲用戶單擊按鈕的事件並做處理。
(2)暫停態(PausedState)
此時Activity程序失去了焦點,並被其他處於運行態的otherActivity取代在屏幕顯示,但otherActivity程序並沒有覆蓋整個屏幕或者具有半透明的效果—此狀態即為暫停態。處於暫停態的Activity仍然對用戶可見,並且是完全存活的(此時Activity對象存留在內存里,保留著所有狀態與成員信息並保持與窗口管理器的連接)。如果系統處於內存不足的情況下,會殺死這個Activity。
(3)停止態(StoppedState)
當Activity完全被另一個otherActivity覆蓋時(此時otherActivity顯示在屏幕前台),則處於停止態。處於停滯態的Activity依然是存活的(此時Activity對象依然存留在內存里,保留著所有的狀態和與成員信息,但沒有與窗口管理器保持連接),而且它對用戶是不可見的,如果其他地方需要內存,系統會銷毀這個Activity。
處於暫停態(PausedState)或者停止態(Stopped
State)的Activity,系統可以通過調用finish()方法或者直接終止它的進程來銷毀此Activity(從內存中清楚此Activity對象)。被finish()或者銷毀的Activity再重新打開時,是需要再次初始化此Activity的。
2、2
當一個Activity從一種狀態轉到另一種狀態時,會通過調用回調方法來通知這種變化。這些回調方法都是可以重寫的,你可以根據程序的的需要來選擇重寫對應的回調方法。以下列出了Activity生命周期里的基本回調方法:
public class ExampleActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// The activity is being created.
}
@Override
protected void onStart() {
super.onStart();
// The activity is about to become visible.
}
@Override
protected void onResume() {
super.onResume();
// The activity has become visible (it is now
"resumed").
}
@Override
protected void onPause() {
super.onPause();
// Another activity is taking focus (this activity is
about to be "paused").
}
@Override
protected void onStop() {
super.onStop();
// The activity is no longer visible (it is now
"stopped")
}
@Override
protected void onDestroy() {
super.onDestroy();
// The activity is about to be destroyed.
}
}
筆記:在方法體里,必須先調用父類對應的實現方法super.Xxx(),再執行其他的操作(如上面代碼所示)。為了習慣,下面也提供一些代碼來測試一些這些方法的使用,在博客的最後面。
總的來說,這些回調方法定義了Activity整個生命周期。在生命周期里通過重寫這些回調方法,,你可以監控以下下三個嵌套的方法循環。
完整存活的時間:
Activity的完整存活的時間是自第一次調用onCreate()開始,直至調用onDestroy()為止。Activity在onCreate()中設置所有「全局」狀態以完成初始化,而在onDestroy()中釋放所有系統資源。例如,如果Activity有一個線程在後台運行從網路下載數據,它會在onCreate()創建線程,而在 onDestroy()銷毀線程。
可見狀態的時間:
Activity的可見狀態是自onStart()調用開始直到相應的onStop()調用結束。在此期間,用戶可以在屏幕上看到Activity,盡管它也許並不是位於前台或者也不與用戶進行交互。在這兩個方法之間,我們可以保留用來向用戶顯示這個Activity所需的資源。例如,當用戶不再看見我們顯示的內容時,我們可以在onStart()中注冊一個BroadcastReceiver來監控會影響UI的變化,而在onStop()中來注消。onStart() 和 onStop() 方法可以隨著應用程序是否為用戶可見而被多次調用。
顯示在前台的時間:
Activity的前台顯示是自onResume()調用起,至相應的onPause()調用為止。在此期間,Activity位於前台最上面並與用戶進行交互。Activity會經常在暫停和恢復之間進行狀態轉換——例如當設備轉入休眠狀態或者有新的Activity啟動時,將調用onPause() 方法。當Activity獲得結果或者接收到新的Intent時會調用onResume() 方法。
㈣ 如何管理Android中Activity的生命周期
管理Android中Activity的生命周期
在一個activity的生命周期中,系統會像金字塔模型一樣去調用一系列的生命周期回調函數。Activity生命周期的每一個階段就像金字塔中的台階。當系統創建了一個新的activity實例,每一個回調函數會向上一階移動activity狀態。處在金字塔頂端意味著當前activity處在前台並處於用戶可與其進行交互的狀態。
當用戶退出這個activity時,為了回收該activity,系統會調用其它方法來向下一階移動activity狀態。在某些情況下,activity會隱藏在金字塔下等待(例如當用戶切換到其他app),此時activity可以重新回到頂端(如果用戶回到這個activity)並恢復用戶離開時的狀態。
根據activity的復雜度,也許不需要實現所有的生命周期方法。但了解每一個方法的回調時機並在其中填充相應功能,使得確保app能夠像用戶期望的那樣執行是很有必要的。如何實現一個符合用戶期待的app,我們需要注意下面幾點:
使用app的時候,不會因為有來電通話或者切換到其他app而導致程序crash。
用戶沒有激活某個組件時不會消耗寶貴的系統資源。
離開app並且一段時間後返回,不會丟失用戶的使用進度。
設備發生屏幕旋轉時不會crash或者丟失用戶的使用進度。
只有三個狀態是靜態的,這三個狀態下activity可以存在一段比較長的時間。(其它幾個狀態會很快就切換掉,停留的時間比較短暫)
Resumed:該狀態下,activity處在前台,用戶可以與它進行交互。(通常也被理解為"running" 狀態)
Paused:該狀態下,activity的部分被另外一個activity所遮蓋:另外的activity來到前台,但是半透明的,不會覆蓋整個屏幕。被暫停的activity不再接受用戶的輸入且不再執行任何代碼。
Stopped:該狀態下, activity完全被隱藏,對用戶不可見。可以認為是在後台。當stopped, activity實例與它的所有狀態信息(如成員變數等)都會被保留,但activity不能執行任何代碼。