編輯:關於Android編程
作為Android入門級別的組件,Activity在Android的開發中承載了太多的東西,我們的項目開發中少不了與Activity打交道。所以需要我們熟練掌握Activity的使用。
總體介紹圍繞下面的幾個議題進行討論,以前也總結過Activity的特點,那時候剛學習Android總結的也過於死板,這次准備集中把Android知識進行梳理一下,所以比較有總結性。
Activity的使用。 Activity的模式。 Activity的通訊. Activity的管理。 Activity常見問題:在項目的開發中,Activity承載了我們的頁面展示,它通過setContentView(int Id)方法綁定顯示的布局,然後進行顯示。Activity的基本使用。
(1)、繼承Activity,實現Activity的生命周期方法。
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override protected void onStart() { super.onStart(); Log.d(TAG, "onStart"); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "onStop"); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "onResume"); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "onPause"); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy"); } }
(2)、在Manifest.xml清單文件中注冊Activity。四大組件在使用的時候都必須在清單文件中進行列舉。
我們知道Activity承載了我們應用幾乎全部的頁面顯示工作,那麼我們如何進行頁面之前的跳轉呢?這裡就需要使用Intent類進行頁面的跳轉。
顯示跳轉,針對我們在同一個應用中知道跳轉頁面的名字。
Intent intent = new Intent(MainActivity.this, LoginActivity.class); startActivity(intent);
隱式跳轉,當我們不知道一個應用的類名,只知道action、category屬性時,進行使用:
Intent loginIntent = new Intent(); loginIntent.setAction("com.intent.action.LOGIN"); loginIntent.addCategory("com.intent.category.LOGIN"); startActivity(loginIntent);
注意,這裡的action和category要和聲明的Activity在清單文件中注冊的保持一致。隱式Intent通過Android解析,將Intent映射給可以處理此Intent的Activity、IntentReceiver或Service。
Intent解析機制主要是通過查找已注冊在AndroidManifest.xml中的所有IntentFilter及其中定義的Intent,最終找到匹配的Intent。
在這個解析過程中,Android是通過Intent的action、type、category這三個屬性來進行判斷的,判斷方法如下:
如果Intent指明定了action,則目標組件的IntentFilter的action列表中就必須包含有這個action,否則不能匹配; 如果Intent沒有提供type,系統將從data中得到數據類型。和action一樣,目標組件的數據類型列表中必須包含Intent的數據類型,否則不能匹配。 如果Intent中的數據不是content: 類型的URI,而且Intent也沒有明確指定它的type,將根據Intent中數據的scheme (比如 http: 或者mailto:) 進行匹配。同上,Intent 的scheme必須出現在目標組件的scheme列表中。 如果Intent指定了一個或多個category,這些類別必須全部出現在組建的類別列表中。比如Intent中包含了兩個類別:LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY,解析得到的目標組件必須至少包含這兩個類別。 每一個通過startActivity()方法發出的隱式Intent都至少有一個category,就是 “android.intent.category.DEFAULT”,所以只要是想接收一個隱式Intent的Activity都應括”android.intent.category.DEFAULT” category,不然將導致 Intent 匹配失敗。我們知道Activity有許多startXXX方法,所以我們這次總結下:
- startActivity():啟動單個Activity
- startActivities(Intent[] intent,Bundle options):直接跳到最後一個Intent對應的頁面,當點擊返回鍵的時候,會逐個返回。常見常見:我們從主頁點擊產品進到某個產品的詳情頁面,然後返回鍵返回到產品列表頁面。就可以使用這個。
- startActivityIfNeeded()當啟動的Activity設置了singleTop、singleTask時並且request Code小於0時不啟動。
- startActivityForResult():啟動一個你想數據回調的頁面,當頁面存在的時候,回調數據到onActivityResult方法中。
在Activity的生命周期中,我們經常討論的前台生命周期(onResume——onPause),可視聲明周期,這裡我們很少談論真正在哪個階段我們是可以與界面交互的。我們都知道在onCreate()方法中對一個View進行getHeight()、getWidth()會獲取空值,為什麼呢?這是因為此時的View還沒有進行寬高的測量,在Activity的生命周期中,真正使我們開始於Activity交互的周期在 onWindowFocusChanged()中,我們可以獲取控件的高度和寬度。站在Window視圖的角度來看,Activity的生命周期又可具體到:
entry: onStart—->onResume—->onAttachedToWindow———–>onWindowVisibilityChanged–visibility=0———->onWindowFocusChanged(true)——-> exit: onPause—->onStop—->onWindowFocusChanged(false) ———————- (lockscreen) exit : onPause—–>onWindowFocusChanged(false)——–>onWindowVisibilityChanged–visibility=8————>onStop(to another activity)在Android開發中,Activity有四種模式,我們可以在Manifest.xml文件中注冊時進行設置:
這裡,我們需要補充一點知識,關於Activity的管理方式,這裡是借助棧類型數據結構進行管理,所以這四種模式分別對應了Activity的四種管理方式:
standard:標准默認模式,每次創建一個Activity都會創建一個對應的實例。 singleTop:可以有多個實例,如果Activity在棧頂的時候,啟動相同的Activity,不會創建新的實例,而會調用其onNewIntent方法。 singleTask:只有一個實例。在同一個應用程序中啟動他的時候,若Activity不存在,則會在當前task創建一個新的實例,若存在,則會把task中在其之上的其它Activity destory掉並調用它的onNewIntent方法。 singleInstance:只有一個實例,並且這個實例獨立運行在一個task中,這個task只有這個實例,不允許有別的Activity存在。合理運用這四種模式,能夠使應用的體驗和資源使用率更好。比如:singleTask適合作為程序入口點,因為app的入口點就一個。singleInstance適合需要與程序分離開的頁面,例如鬧鈴提醒,將鬧鈴提醒與鬧鈴設置分離。
在同一個進程中的Activity之間少不了交互,那麼Activity之間怎麼進行數據的交互呢?
Intent承載傳遞數據 廣播 第三方通訊組件這裡,我們主要介紹下前兩種的使用,後兩種以後再介紹。
(1)、Intent傳遞數據
在Android中提供了Intent機制來協助應用間的交互與通訊,Intent負責對應用中一次操作的動作、動作涉及數據、附加數據進行描述,Android則根據此Intent的描述,負責找到對應的組件,將 Intent傳遞給調用的組件,並完成組件的調用。Intent有六大屬性值需要注意:
在上面的介紹中,我們可以發現Intent超級強大的用途,可用於啟動組件,也可以用於傳遞數據,所以Intent的設計就是為了在組件之間進行“溝通”傳遞使用。在啟動Activity的時候,我們可以使用putExtra方法進行設置數據。然後傳遞到跳轉到的頁面。
- 從一個應用打開另一個應用。
- 完全退出應用。
- 動畫切換
- 從另一個頁面回調數據。
1、從一個應用啟動另一個應用
這裡,我們使用Intent的setComponent方法來設置啟動的頁面。通過建立ComponentName對象來實現。
Intent loginIntent = new Intent();
ComponentName componentName = new ComponentName("com.dsw.pluginapp","com.dsw.pluginapp.MainActivity");
loginIntent.setComponent(componentName);
startActivity(loginIntent);
3、從跳轉頁面回調數據
在Android的頁面之間,經常有數據回調,這個時候我們就可以采用startActivityForResult方法啟動Activity,然後使用onActivityResult進行回調。
啟動Activity
Intent loginIntent = new Intent();
ComponentName componentName = new ComponentName(getApplicationContext(),"com.iflytek.testandroid.LoginActivity");
loginIntent.setComponent(componentName);
startActivityForResult(loginIntent, requstCode);
回調的處理,重寫onActivityResult方法。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == this.requstCode){
if(resultCode == RESULT_OK){
tv.setText(data.getStringExtra("name"));
}
}
}
回調數據同樣通過Intent進行封裝。
Intent intent = new Intent();
intent.putExtra("name", "From LoginActivity");
setResult(RESULT_OK, intent);
finish();
這樣就完成了數據的回調。
2、Activity啟動動畫切換
在Activity的跳轉時,我們可以增加動畫效果,一種是通過設置xml配置Activity的theme進行設置。一種是通過代碼進行設置。
(1)、通過XML設置style進行設置。
首先新建一個style,設置如下屬性。
然後創建theme。
最後在manifest中給activity設置theme屬性即可。
(2)、通過代碼設置。
通過代碼設置使用overridePendingTransition(id,id)進行設置。通過調用overridePendingTransition() 可以實時修改Activity的切換動畫。但需注意的是:該函數必須在調用startActivity()或者finish()後立即調用,且只有效一次。
4、完全退出應用
我們知道,一般我們從進入到一個應用,然後操作很多頁面,我們都會遇到這樣的場景,比如:點擊進入某個頁面,然後點擊返回鍵,返回到上一個頁面,上一個頁面的數據還保存著,但是我們也可能通過多個頁面的跳轉然後又返回到主頁面,此時點擊返回鍵就退出應用。這是就利用到我們的Activity的啟動模式,一般在Activity中我們針對首頁的頁面,通過設置android:launchMode=”singleTask”即可進行解決。
RT..我之前感覺Android網絡通信很神奇,Magic...最近學習了網絡知識,現在來總結一下怎麼做 好了,就拿例子來說明原理. 說下這個Demo的用處: 1.用戶可
有這樣一種場景:點擊一下某個按鈕或者圖片(view),改變了樣式(一般改變背景顏色)。這個時候一種解決方案,可能就是狀態選擇器。接下來就介紹如何實現狀態選擇器:步驟:一、
1.生命周期場景演示 : 切換到該Fragment11-29 14:26:35.095: D/AppListFragment(7649): onAttach11-29 1
市面上的大多數應用,多多少少都會通過動畫,讓應用多一些靈動性和趣味性,並且在視圖之間的切換會顯得更加自然。例如許多應用都定制了自己的下拉刷新中的動畫,讓應用增色不少。An