編輯:關於Android編程
一. 再探Activity生命周期
為了研究activity的生命周期,簡單測試代碼如下。
package com.example.testactivity;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
public class MainActivity extends Activity {
private static final String LOG_TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.i(LOG_TAG, "MainActivity------onDestroy");
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
Log.i(LOG_TAG, "MainActivity------onRestart");
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.i(LOG_TAG, "MainActivity------onResume");
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Log.i(LOG_TAG, "MainActivity------onStart");
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.i(LOG_TAG, "MainActivity------onStop");
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
Log.i(LOG_TAG, "MainActivity------onPause");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
查看logcat,輸出如下:
1.點擊進入 app 後,點擊back button退出:
2.點擊進入app後,直接鎖屏:
解鎖屏幕後,activity被喚醒:
3.點擊app進入 app後,點 home鍵退出,又進入:
4.點擊 home鍵進入後直接鎖屏
然後喚醒
5.點擊app進入後,點home鍵退出,然後鎖屏:
然後喚醒進入
說明:
1)onpause()方法在用戶離開activity時被調用(這一般並不表示activity要被銷毀了)。這個函數一般用來提交哪些需要保存狀態的數據。
2)對標簽的說明
除label,name,icon外還需指定一個或多個來確定該activity可以響應的intent。
是過濾器,action說明次activity時application的main入口,指定這個activity需要在系統的application 列表中列出!
注:android application要求所有應用程序組件(Activity,Service,ContentProvider,BroadcastReceiver)都必須顯示進行配置.
二.Activity之間的值傳遞
1)bundle(適用於數據比較少的情況)
Intent intent = new Intent();
intent.setClass(A.class,B.class);
intent.putExtra(“name”,”value”);
startActivity(intent);
之後再B.class中用
Intent intent = new Intent();
intent.getExtras()來獲取
2)Bundle(數據較多時使用)
Intent intent = new Intent(A.class,B.class));
Bundle bundle = new Bundle();
bundle.putString(“Stringkey1”,”value1”);
bundle.putString(“booleankey2”,”value2”);
intent.putExtra(“key”,bundle);
startActivity(intent);
之後再B.class中用
Intent intent = new Intent();
Bundle bundle = intent.getBundleExtra(“key”);
bundle.getBoolean(“booleankey2”);
bundle.getString(“Stringkey1”);來獲取。
3)解析startActivityForResult
適用於A跳轉到B,再返回到A,同時還要保留之前的用戶輸入。由於由頁面 A跳轉到頁面 B之後,A所在頁面的Activity已經被Destroy。所以,如果要重新返回A並顯示數據,就必須將A所在頁面的Activity再次喚醒,與此同時調用某個方法來獲取並顯示相應的數據。
所以一般用以下幾個步驟來實現
a.從A跳轉到B時使用startActivityForResult(Intent intent, int requestcode)方法;
b.再A頁面的Activity重寫onActivityResult方法,
onActivityResult(int requestcode, int resultcode, intent data);
其中參數1是提供給onActivityResult,用來確認數據是從哪個activity返回的,並且該參數和從A跳轉到B時使用startActivityForResult方法的requestcode相對應。
參數2由新的activity在關閉前向前面的activity返回數據時使用。
參數3是一個 intent,帶有從B所在Activity返回的數據。
A 所在頁面activity實現
onActivityResult(int requestcode, int resultcode, intent data){
String result = data.getExtras().getString("result");
}
B所在activity實現:
Intent intent = new Intent();
intent.putExtra("result","value");
B.this.SetResult(RESULT_OK,intent);
B.this.finish();
未完待續。。。
---------------------------------------
好,今天接著來進一步解析Activity的生命周期。
自己畫了一下activity的生命周期圖,感覺很糟糕的樣子。。
如圖所示,activity的整個生命周期有四種狀態,而對這四種狀態的描述通常使用一下7種方法來完成。
Activity的四種狀態分別是:
a.running
當activity運行於屏幕前台(處於activity棧的棧頂),此時它獲取了 焦點可以相應用戶操作,屬於running狀態,同一時刻只能有一個 activity處於running(active)狀態。
b.paused
此時Activity已經失去焦點,但是仍然對用戶可見,例如:在該activity之上有另外一個透明的 Activity或Toast,AlertDialog等彈出窗口時,該Activity則處於暫停狀態。暫停的Activity仍然 是處於存活狀態,(它保留著所有的狀態和成員信息並保持著和窗口管理器的連接),但當此時出現system memory不夠用時,就會被系統殺掉。
c.Stopped
指定Activity完全被另一個Activity遮擋時,它將處於停機狀態,但它仍保留著所有的狀態和成員信 息。只是此時指定的Activity對用戶不可見,但當此時出現system memory不夠用時,就會被系統殺掉。
d.Dead
Activity尚未啟動,或者已經被手動中止,或者已經被system回收。導致Activity處於非活動狀態。
手動中止可以在程序中調用finish方法;而被system回收,則是可能是因為內存不足。當system內存不足時,Dalvak虛擬機的內存回收規則如下:
first:先回收與其它Activity,Service,Intent,Receiver無關的進程(優先回收獨立的 Activity)。所以,一些耗時的操作最好寫成Service。
second:不可見(stopped)的Activity。
Third:Service進程(經過前兩步後,內存不足時采取)。
Fourth: 當前正在運行的(Running)Activity。
伴隨Activity生命周期的7個方法:
當Activity從一種狀態進入另一種狀態時system會自動調用下面相應的方法來通知用戶這種變化。
a.Activity第一次被實例化的時候system會調用onCreate()方法(整個生命周期只調用一次)來進行初始化設置:
為Activity提供所需布局文件;為按鈕綁定監聽器等靜態的設置操作。
b.Activity可見,但尚未獲得焦點,即不能與用戶進行交互時調用:onStart(),
c.Activity已經stopped之後重新被system啟動時調用onRestart();
d.當Activity獲得用戶焦點能進行交互時system調用onResume().
e.當system啟動另外一個Activity時,在新的Activity啟動之前被system調用來保存當前獲得用戶焦點的Activity中的持久數據,停止動畫等。當系統而非用戶自己出於回收內存而關閉了Activity。此時,用戶會期望當他再次回到這個Activity時,它仍保持著上次離開時的樣子,此時便調用onSaveInstanceState(),該方法用來保存Activity被殺之前的狀態,它在onPause之前被觸發,當system為了節省內存開銷銷毀了該Activity(或許用戶並不想銷毀)時就需要重寫這個方法了,當該Activity再次被實例化時會通過onCreate(Bundle saveInstanceState)將已經保存的臨時狀態數據傳入。需要注意的是
onSaveInstanceState() 方法並不會經常被調用,它的默認觸發條件為按下home鍵,按下電源鍵,橫豎屏切換三種情況。所以我們可以通過重寫onSaveInstanceState() 來記錄Activity的臨時數據。
而記錄持久數據時,應該使用onPause()來存儲。
f.當Activity完全被另一個Activity覆蓋不可見時system調用onStop();
g.當Activity被kill時system調用onDestroy(),用來釋放onCreate()方法中創建的資源,如結束線程等。需要注意的是和onCreate相對應,onDestroy()方法,在Activity的整個生命周期中也只被調用一次。
至此,關於Activity的梳理已經差不多了,最後需要注意一下的是設置Activity的android:configChanges=“”的設置。
本文實例為大家分享了Android ViewPager指示器的制作方法,供大家參考,具體內容如下1.概述 ViewPageIndicator這個開源框架大家都接觸過,個
Android的animation由四種類型組成Android動畫模式Animation主要有兩種動畫模式:一種是tweened animation(漸變動畫) XM
android 異步任務的一個後台方法本質是開啟一個線程完成耗時操作,其他onPostExecute方法和onPreExecute方法運行在UI主線程用於更新UI界面。為
學習android三天了,發現這個ListView在android裡應用非常的多,於是就花了一些時間仔細學習了一下! 以下是我個人的理解,如果有錯誤或不周到的地方,還請各