標籤:android xml 控制項
四、Activity4.1 Activity
Activity是應用程式的入口。負責建立才視窗(setContextView(View)),和使用者互動等。
4.1.1 基本用法
首先定義一個類繼承自android.app.Activity,在AndroidManifest.xml檔案的application標籤裡聲明一個activity即可。
一般一個程式可能會有多個Activity,需要指定程式運行時首先載入的Activity,在activity標籤內部需要定義action 和category 。首先運行這個Activity。
一個Activity例子。設定ContentView,擷取視圖上的按鈕,添加事件。
Java代碼
- public class ActivityMainExample extends Activity implements View.OnClickListener {
-
- private Button button1;
- private Button button2;
- private Button button3;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- Log.v(CommonConfig.LOG_TAG, "ActivityExample onCreate");
- super.onCreate(savedInstanceState);
- super.requestWindowFeature(Window.FEATURE_NO_TITLE);
- super.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
- super.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
- super.setContentView(R.layout.main);
- this.button1 = (Button) super.findViewById(R.id.button1);
- this.button2 = (Button) super.findViewById(R.id.button2);
- this.button3 = (Button) super.findViewById(R.id.button3);
-
- this.button1.setOnClickListener(this);
- this.button2.setOnClickListener(this);
- this.button3.setOnClickListener(this);
- }
-
- @Override
- public void onClick(View v) {
- if (v.equals(this.button1)) {
-
- } else if (v.equals(this.button2)) {
-
- } else if (v.equals(this.button3)) {
- }
- }
- }
AndroidManifest配置。
Xml代碼
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="liming.activity.example"
- android:versionCode="1"
- android:versionName="1.0">
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name=".ActivityMainExample"
- android:label="mainActivity"
- android:launchMode="standard">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- <uses-sdk android:minSdkVersion="7" />
-
- </manifest>
4.1.2 常用設定
AndroidManifest中的通常設定:
android:launchMode |
啟動模式 |
standard,singleTop,singleTask ,singleInstance, |
android:screenOrientation |
螢幕 |
landscape橫屏,portrait豎屏 |
android:label |
標題名稱 |
直接寫字元,或引用xml檔案中的@string/ |
android:name |
Activity類名 |
注意.。一般是manifest的package加name等於Activity類帶包名的全稱 |
|
|
|
Java常用方法
setContentView() |
設定Activity視圖 |
參數可以是①res/layout中的xml檔案,通過R.layout擷取int的id。②View類型的視圖。 |
findViewById |
尋找View,在XML |
R中的id。一般設定setContentView為R中的layout,通過這個方法尋找每個組件的引用。 |
|
|
|
|
|
|
Java其他方法
去標題 |
super.requestWindowFeature(Window.FEATURE_NO_TITLE)需要在執行setContentView之前操作,否則報錯。 |
全屏 |
super.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); |
橫豎向 |
super.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);/ ActivityInfo.SCREEN_ORIENTATION_PORTRAIT |
螢幕參數widht,height,dpi等 |
Display display = super.getWindowManager().getDefaultDisplay(); DisplayMetrics displayMetrics = new DisplayMetrics(); display.getMetrics(displayMetrics); display.getWidth()等方法 displayMetrics.densityDpi等方法 |
|
|
4.1.3 生命週期
Activity有7個生命週期。Activity程式入口為方法onCreate或onStart。一些初始化的操作需要在這兩個方法中進行,例如設定layout,初始化控制項,添加事件監聽等。
每次啟動Activity都是從OnCreare開始,接著onStart,onResume。
按Back鍵就結束程式:onPause,onStop,onDestroy;
按home鍵切換程式:onPause,onStop,切換回來:onRestart,onStrat,onResume。
在兩個以上Activity切換時。Activity是否被Destroy取決於啟動模式launchMode。
onCreate |
當首次建立Activity時調用。一些設定在該方法中進行:建立視圖,資料繫結等。還以Bundle的形式提供以前儲存的任何狀態的訪問。 |
onRestart |
重新啟動Activity時調用。該活動仍在記憶體中,而不是重起一個新的Activity。 |
onStart |
當Activity在螢幕上可見時調用。跟著onResume(), |
onResume |
當Activity與使用者互動時調用。 |
onPause |
在系統啟動恢複前一個活動時調用。這通常用於未儲存的更改提交到持久性資料、 停止動畫和其他可能會佔用 CPU 等的東西。此方法的實現必須非常快速,因為此方法返回之前不會恢複的下一個活動。跟或 onResume(),如果活動返回到前面或 onStop(),如果它變得對使用者不可見。 |
onStop |
因為另一項Activity已恢複或啟動,這個Activity已不再對的使用者可見時調用。這可能發生或者因為正在啟動一項新的Activity,現有之前的這一個Activity或被銷毀。如果這個Activity出錯或失敗將 onDestroy(),如果被使用者重新選中則調用 onRestart()。 |
onDestroy |
Activity被銷毀前的最後調用。發生這種情況是因為Activity被finishing (或稱為 finish() ,或因為系統暫時銷毀此活動的Activity以節省空間的。您可以使用 isFinishing() 方法,區分這兩種情況。 |
|
|
4.2.4 Activity載入模式
在設定檔中android:launchMode可以進行配置Activity載入模式。四種activity的載入模式:standard,singleTop,singleTask,singleInstance。
1. standard:預設,表示如果需要就建立。這樣會導致,切換一次Activity,就建立一個。切換多少次,按back鍵就會返貨多少次。
例如ActivityMain使用standard模式,當他轉到ActivityOtherOne,又切換到ActivityMain時,原先在ActivityMain上面的EditText最開始輸入的文字也就沒有了。
2. singleTop:如果已經有一個這個Activity執行個體位於Activity棧的頂部時,就不產生新的執行個體。
3. singleTask: 會在一個新的task 中產生這個執行個體,以後每次調用都會使用這個,不會去產生新的執行個體了。
4. singleInstance: 這個跟singleTask基本上是一樣,只有一個區別:在這個模式下的Activity執行個體所處的task 中,只能有這個activity執行個體,不能有其他的執行個體。
4.2 Activity切換
首先簡單介紹Intent(意圖)。Intent類相當於平台中應用程式之間的通訊網路,Intent是一個要執行的操作的抽象說明,相當於各個Activity之間的橋樑。在一個Activity中想切換到另一個Activity,需要使用方法startActivity,並需要定義一個Intent來指定意圖的組件類。
4.2.1最簡單的Activity切換
定義Intent,使用Intent設定需要切換到哪個Activity。使用Activity的startActivity(Intent)方法。
Java代碼
- Intent intent = new Intent(this, ActivityOtherOne.class);
- super.startActivity(intent);
4.2.2使用Intent傳遞資料
當然也可以在切換Activity的時候傳遞資料。可以直接使用intent的putExtra方法,也可以new一個Bundle傳輸入,但是需要讓intent把bundle進行putExtras下。
傳參數端的Activity:
Java代碼
- Intent intent = new Intent(this, ActivityOtherOne.class);
- Bundle bundle = new Bundle();
- bundle.putString("value1", "hello");
- intent.putExtras(bundle);
- intent.putExtra("value2","world");
- super.startActivity(intent);
接收方,例子中的ActivityOtherOne。需要在OnCreate方法中擷取。
Java代碼
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- .
- .
- .
- String value1 = super.getIntent().getExtras().getString("value1");
- String value2 = super.getIntent().getExtras().getString("value2");
- this.myEditText.setText("value1: " + value1 + ", value2: " + value2);
- }
4.2.3帶回傳資料的
1,在主Activitiy(ActivityMainExample)需要使用startActivityForResult方法切換Activity。其中第二個參數requestCode,只有當>= 0,在轉會此Activity時才會調用onActivityResult方法,得到回傳資料。
ActivityMainExample類中代碼
Java代碼
- Intent intent = new Intent(this, ActivityOtherOne.class);
- Bundle bundle = new Bundle();
- bundle.putString("value1", "hello");
- intent.putExtras(bundle);
- intent.putExtra("value2","world");
- super.startActivityForResult(intent, 1);
重寫onActivityResult方法,擷取回傳資料
Java代碼
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- String result1 = data.getExtras().getString("result1");
- String result2 = data.getExtras().getString("result2");
- Log.v(CommonConfig.LOG_TAG, "ActivityExample onActivityResult, requestCode: " + requestCode + ", resultCode: " + resultCode);
- Log.v(CommonConfig.LOG_TAG, "ActivityExample onActivityResult data - result1: " + result1 + ", result2: " + result2);
- }
2,在另一個Activity插入回傳資料,然後finish。
ActivityOtherTwo類中代碼。
Java代碼
- @Override
- public void onClick(View v) {
- super.getIntent().putExtra("result1", "hello android");
- super.getIntent().putExtra("result2", "hello google");
- super.setResult(Activity.RESULT_OK, super.getIntent());
- super.finish();
- }
4.3 其他常用的Activity
一些常用的Activity子類,後面將詳細說明如何使用。寫好後更新連結地址
ActivityGroup http://limingnihao.iteye.com/
TabActivity http://limingnihao.iteye.com/
ListActivity http://limingnihao.iteye.com/
Android開發學習 之 四、Activity