從心開始學Android:Activity

一、AndroidManifest文件中註冊

<activity
    android:name=".MainActivity"
    android:label="@string/app_name" >
    <intent-filter>
          <action android:name="android.intent.action.MAIN" />
          <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity

Activity的註冊聲明要放在<application>標籤下,name是包名,label是activity中標題欄的內容,<intent-filter>標籤下的兩句聲明是讓這個Activity作爲這個程序的主活動,即打開程序的時候最先打開的就是這個界面。如果一個程序中沒有主Activity,雖然這個程序也是可以安裝的,但是你無法在啓動器中看到或者打開這個程序。這種程序一般都是第三方調用的。

二、隱藏標題欄

當我們需要隱藏掉標題欄的時候,有以下兩種方法:

1、在代碼中隱藏:我們可以在oncreat();方法中加入

requestWindowFeature(Window.FEATURE_NO_TITLE); 

注意:這行代碼的意思就是不在活動中顯示標題欄,但是這行代碼一定要寫在 setContentView();前面,不然會報錯;

2、在AndroidManifest文件中修改:在<application>標籤下加上android:theme="@android:style/Theme.NoTitleBar"

三、界面跳轉和數據的傳遞:Intent

    Intent的用法大致分爲顯示意圖和隱示意圖兩種:

    1、顯示Intent的用法

Intent intent = new Intent(MainActivity.this,MainActivityTwo.class);
startActivity(intent);

intent接收到的兩個參數,第一個是Context是啓動活動的上下文,第二個參數Class是要跳轉到的Activity;由於這種啓動Activity的方式非常明顯,因此被稱爲顯示Intent。

    2、隱式Intent的用法

相比較於顯示Intent的用法,隱式意圖就比較含蓄,隱式意圖啓動activity是通過指定activity的action和category信息,讓系統自己去分析這個intent,並找到相匹配的activity.

要跳轉到的activity的信息:

<activity android:name=".MainActivityTwo" >
    <intent-filter>
    <action android:name="android.intent.action.ACTION_TEST" />
    <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

<action>標籤中是當前activity可以響應的action,而<category>中則是包含了一些附加的信息,這些信息更加精確的指出課當前activity能夠響應的intent中還可能帶有的category,只有當<action>和<category>同時匹配到intent中的action和category的時候,這個activity才能夠響應該intent。這個使用隱式Intent進行跳轉的寫法:  

Intent intent = new Intent("android.intent.action.ACTION_TEST");
startActivity(intent);

這裏之所以沒有指定category,是因爲android.intent.category.DEFAULT是一種默認的category,在調用startActivity()方法的時候會自動將這個category加到intent;這裏需要說明的是,一個intent只能指定一個action,但是卻可以有多個category,當在intent中增加一個category的時候:

Intent intent = new Intent("android.intent.action.ACTION_TEST");
intent.addCategory("android.intent.category.MY_DEFAULT");
startActivity(intent);
可以使用addCategory()方法添加一個category,此時AndroiManifest文件下activity的應添加上相對應的<category>,不然系統找不到響應intent的activity

就會報錯;

<activity
    android:name=".MainActivityTwo" >
    <intent-filter>
        <action android:name="android.intent.action.ACTION_TEST" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.MY_DEFAULT" />
    </intent-filter>
</activity>
3、隱式意圖的更多用法

使用隱式intent,我們不僅可以啓動自己程序內的activity,還可以啓動其他程序的activity,使Android的多個程序間的功能共享成爲可能,例如顯示一個網頁

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com")); 
startActivity(intent);

這裏我們首先設置了intent的action是Intent.ACTION_VIEW,這是Android系統的內置動作,它的常量值爲android.intent.action.VIEW。然後通過Uri.parse()將一個網址字符串解析成一個Uri對象,在調用Intent的setData()方法將這個Uri對象傳進去。

在<intent-filter>下的<data>的標籤中我們可以配置以下內容:

1) android:scheme  用於指定數據的協議部分,如http協議,geo表示地理位置,tel表示撥打電話Uri.parse("tel:123456")

2) android:host 用於指定數據的主機名部分,如上面的www.baidu.com部分

3) android:post 用於指定數據的端口部分,一般緊跟主機名之後

4) android:path 用於指定主機名和端口之後的部分,如一段網址中跟在域名之後的部分

5) android:mimeType 用於指定處理的數據類型。

        4、使用intent傳遞數據

傳送數據:

Intent intent = new Intent(MainActivity.this,MainActivityTwo.class);
intent.putExtra("extra_data", data);
startActivity(intent);
putExtra()方法接收兩個參數,第一個是鍵,第二個是數據,鍵是爲了從intent中取值

接收數據:

Intent intent2 = getIntent();
String data = intent2.getStringExtra("extra_data");
5、返回數據給上一個activity

Android既可以傳遞數據給下一個Activity,也可以返回數據給上一個activity,Activity中有個startActivityForResult()方法,這個方法也是用於啓動activity的,只不過這個方法是期待activity在銷燬的時候能夠返回一個結果給上一個activity,這個方法接收兩個參數,第一個是Intent,第二個是請求碼(int類型,是一個唯一值就行),用於判斷數據的來源。

在第一個activity中:

Intent intent = new Intent(MainActivity.this,MainActivityTwo.class);
startActivityForResult(intent, 1);
在第二個activity中:

Intent intent = new Intent();
intent.putExtra("extra_data", data);
setResult(RESULT_OK, intent);
finish();
這裏的intent只用來傳遞數據,setResult()方法是專門用來向上一個activity返回數據的,接收兩個參數,第一個是用來向上一個activity返回處理結果的,一般只用RESULT_OK或者RESULT_CANCELED這兩個值,第二個參數是傳入intent。最後調用finish()方法銷燬activity,由於我們是使用startActivityForResult()方法來啓動activity的,

因此在第二個activity銷燬的時候,會調用上一個activity的onActivityResult()方法,因此我們需要在第一個activity中重寫這個方法,

@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		switch (requestCode) {
		case 1:
			
			if (resultCode == RESULT_OK) {
				String returndata = data.getStringExtra("extra_data");
			}
			break;

		default:
			break;
		}
	}

startActivityForResult()有三個參數,第一個requestCode就是我們啓動第二個activity時請求碼,第二個參數resultCode就是返回數據時的處理結果,第三個參數就是攜帶返回數據的intent。當用戶是通過點擊返回鍵回到第一個activity的時候,我們需要重寫onBackPressed()這個方法,

@Override
	public void onBackPressed() {
		Intent intent = new Intent();
		intent.putExtra("extra_data", data);
		setResult(RESULT_OK, intent);
       <span style="white-space:pre">	</span> <span style="white-space:pre">	</span>finish();
       
	}
當點擊返回鍵的時候就會執行上面的代碼。

四、activity的生命週期

1、onCreate () :第一次被創建的時候調用

2、onStart() :這個方法由不可見的變爲可見的時候調用

3、onResum() :這個方法在activity準備好和用戶進行交互的時候調用, 
4、onPause() :

5、onStop()

6、onDestroy()

       7、onRstart()

這七個方法除了onDestroy(),其他的都是兩兩相對應的

五、activity的啓動模式

activity有四種啓動模式:standard , singleTop, singleTask 和singleInstance,啓動模式可以在AndroidManifest文件中的<activity>標籤中進行指定.

<activity
      android:name=".MainActivityTwo" 
      android:launchMode="singleTop">  
</activity>

1、standard模式

standard模式又稱爲標準模式,是默認的啓動模式,這個模式下,每啓動一個activity,它都會在返回棧中入棧,並且處於棧頂的位子,無論這個棧中是否已經存在這個activity.

2、singleTop模式

singleTop模式是當啓動activity的時候,如果發現返回棧的棧頂是該activity,那麼就不會創建新的activity,但是當返回棧的棧頂不是該activity時候,那麼

返回棧還是創建新的activity.

3、singleTask 模式

singleTask模式是當啓動activity的時候,如果發現返回棧中存在該activity,如果存在那麼就不會創建新的activity,直接使用,並把這個activity上的所有

activity統統擠出棧,如果沒有發現就會創建一個新的activity

4、singleInstance模式

singleInstance模式是一種比較特殊的模式,這種模式下,會創建一個新的返回棧,用來專門管理這個activity,並且保證不會有其他的activity進入.例如從

FirstActivity跳轉到SecondActivity,再從SecondActivity跳轉到ThirdActivity,其中SecondActivity的啓動模式是singleInstance,那麼此時按返回鍵的時候就會從

ThirdActivity返回到FirstActivity.





    


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章