Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android入門(二)Activity-Toast、Intent,intentservicetoast

Android入門(二)Activity-Toast、Intent,intentservicetoast

編輯:關於android開發

Android入門(二)Activity-Toast、Intent,intentservicetoast


原文鏈接:http://www.orlion.ga/427/

一、隱藏activity的標題

    在activity的java代碼的onCreate()方法中入requestWindowFeature(Window.FEATURE_NO_TITLE);如下:

@Override
	public void onCreate(Bundle savedInstanceState){
		
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.first_layout);
	}

二、在Activity中使用Toast

    首先給button綁定點擊事件,然後在button被點擊時候彈出toast:

@Override
	public void onCreate(Bundle savedInstanceState){
		
		super.onCreate(savedInstanceState);
		
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.first_layout);
		
		// 點擊按鈕彈出Toast
		Button button1 = (Button) findViewById(R.id.button_1);
		button1.setOnClickListener(new View.OnClickListener(){
			@Override
			public void onClick(View v){
				Toast.makeText(FirstActivity.this, "You chick button 1" , Toast.LENGTH_SHORT).show(); 
			}
		});
	}

    解釋:在活動中,可以通過 findViewById()方法獲取到在布局文件中定義的元素,這裡我們傳入 R.id.button_1,來得到按鈕的實例,這個值是剛才在 first_layout.xml中通過 android:id屬性指定的。findViewById()方法返回的是一個 View對象,我們需要向下轉型將它轉成 Button對象。得到了按鈕的實例之後,我們通過調用 setOnClickListener()方法為按鈕注冊一個監聽器,點擊按鈕時就會執行監聽器中的 onClick()方法。因此,彈出 Toast的功能當然是要在nClick()方法中編寫了。

    Toast的用法非常簡單, 通過靜態方法makeText()創建出一個Toast對象, 然後調用show()將 Toast顯示出來就可以了。這裡需要注意的是,makeText()方法需要傳入三個參數。第一個參數是 Context,也就是 Toast要求的上下文,由於活動本身就是一個 Context對象,因此這裡直接傳入FirstActivity.this即可。 第二個參數是Toast顯示的文本內容, 第三個參數是Toast顯示的時長,有兩個內置常量可以選擇 Toast.LENGTH_SHORT和 Toast.LENGTH_LONG。

 

    如果你需要在 XML中引用一個 id,就使用@id/id_name這種語法,而如果你需要在 XML中

定義一個 id,則要使用@+id/id_name這種語法。

 

三、使用Intent

    怎樣才能由主活動跳轉到其他活動呢?我們現在就來一起看一看。

    1、使用顯式Intent

    在 ActivityTest項目中再創建一個活動。新建一個 second_layout.xml布局文件,代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
	<Button
	    android:id="@+id/button_2"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:text="Button 2"/>
</LinearLayout>

    新建活動 SecondActivity繼承自Activity,代碼如下:

package ga.orlion.activitydemo1;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

public class SecondActivity extends Activity {

	@Override
	public void onCreate(Bundle savedInstanceState){
		
		super.onCreate(savedInstanceState);
		
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.second_layout);
	}
}

    最後在 AndroidManifest.xml中為 SecondActivity進行注冊。

        <activity 
            android:name=".SecondActivity">
            
        </activity>

    

    由於 SecondActivity不是主活動,因此不需要配置<intent-filter>標簽裡的內容,注冊活動的代碼也是簡單了許多。現在第二個活動已經創建完成,剩下的問題就是如何去啟動這第二個活動了,這裡我們需要引入一個新的概念,Intent。

    Intent是 Android程序中各組件之間進行交互的一種重要方式,它不僅可以指明當前組件想要執行的動作,還可以在不同組件之間傳遞數據。Intent一般可被用於啟動活動、啟動服務、以及發送廣播等場景,由於服務、廣播等概念你暫時還未涉及,麼本章我們的目光無疑就鎖定在了啟動活動上面。Intent的用法大致可以分為兩種,顯式 Intent和隱式 Intent,我們先來看一下顯式 Intent如何使用。

    Intent有多個構造函數的重載,其中一個是 Intent(Context packageContext, Class<?> cls)。這個構造函數接收兩個參數,第一個參數 Context要求提供一個啟動活動的上下文,第二個參數Class則是指定想要啟動的目標活動, 通過這個構造函數就可以構建出Intent的 “意圖” 。然後我們應該怎麼使用這個 Intent呢?Activity類中提供了一個 startActivity()方法, 這個方法是專門用於啟動活動的, 它接收一個Intent參數, 這裡我們將構建好的Intent傳入startActivity()

方法就可以啟動目標活動了。修改 FirstActivity中按鈕的點擊事件,代碼如下所示:

button1.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        startActivity(intent);
    }
});

    我們首先構建出了一個Intent,傳入FirstActivity.this作為上下文,傳入SecondActivity.class作為目標活動,這樣我們的“意圖”就非常明顯了,即在 FirstActivity這個活動的基礎上打開 SecondActivity這個活動。然後通過 startActivity()方法來執行這個 Intent。重新運行程序,在 FirstActivity的界面點擊一下按鈕我們已經成功啟動 SecondActivity這個活動了。如果你想要回到上一個活動怎麼辦呢?很簡單,按下 Back鍵就可以銷毀當前活動,從而回到上一個活動了。使用這種方式來啟動活動,Intent的“意圖”非常明顯,因此我們稱之為顯式 Intent。

    2、使用隱式Intent

    相比於顯式 Intent,隱式 Intent則含蓄了許多,它並不明確指出我們想要啟動哪一個活

動, 而是指定了一系列更為抽象的action和category等信息, 然後交由系統去分析這個Intent,並幫我們找出合適的活動去啟動。什麼叫做合適的活動呢?簡單來說就是可以響應我們這個隱式 Intent的活動,那麼目前SecondActivity可以響應什麼樣的隱式 Intent呢?額,現在好像還什麼都響應不了,不過很快就會有了。通過在<activity>標簽下配置<intent-filter>的內容,可以指定當前活動能夠響應的 action和 category,打開 AndroidManifest.xml,添加如下代碼:

<activity android:name=".SecondActivity" >
    <intent-filter>
        <action android:name="com.example.activitytest.ACTION_START" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

    在<action>標簽中我們指明了當前活動可以響應 com.example.activitytest.ACTION_START這個 action,而<category>標簽則包含了一些附加信息,更精確地指明了當前的活動能夠響應的 Intent中還可能帶有的 category。只有<action>和<category>中的內容同時能夠匹配上 Intent中指定的 action和 category時,這個活動才能響應該 Intent。修改 FirstActivity中按鈕的點擊事件,代碼如下所示:

button1.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent("com.example.activitytest.ACTION_START");
        startActivity(intent);
    }
});

    可以看到,我們使用了 Intent的另一個構造函數,直接將 action的字符串傳了進去,表明我們想要啟動能夠響應 com.example.activitytest.ACTION_START這個 action的活動。那前面不是說要<action>和<category>同時匹配上才能響應的嗎?怎麼沒看到哪裡有指定category 呢?這是因為 android.intent.category.DEFAULT 是一種默認的 category,在調用startActivity()方法的時候會自動將這個 category添加到 Intent中。重新運行程序,在 FirstActivity的界面點擊一下按鈕,同樣成功啟動 SecondActivity了。

 

    3、使用Intent傳遞數據

    Intent還可以在啟動活動的時候傳遞數據的,我們來一起看一下。在啟動活動時傳遞數據的思路很簡單,Intent中提供了一系列 putExtra()方法的重載,可以把我們想要傳遞的數據暫存在 Intent中,啟動了另一個活動後,只需要把這些數據再從Intent中取出就可以了。比如說 FirstActivity中有一個字符串,現在想把這個字符串傳遞到SecondActivity中,你就可以這樣編寫:

button1.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        String data = "Hello SecondActivity";
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        intent.putExtra("extra_data", data);
        startActivity(intent);
    }
});

    這裡我們還是使用顯式 Intent的方式來啟動 SecondActivity,並通過 putExtra()方法傳遞了一個字符串。注意這裡putExtra()方法接收兩個參數,第一個參數是鍵,用於後面從 Intent中取值,第二個參數才是真正要傳遞的數據。然後我們在 SecondActivity中將傳遞的數據取出,並打印出來,代碼如下所示:

public class SecondActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.second_layout);
        Intent intent = getIntent();
        String data = intent.getStringExtra("extra_data");
        Log.d("SecondActivity", data);
    }
}

    首先可以通過 getIntent()方法獲取到用於啟動 SecondActivity 的 Intent,然後調用getStringExtra()方法,傳入相應的鍵值,就可以得到傳遞的數據了。這裡由於我們傳遞的是字符串,所以使用 getStringExtra()方法來獲取傳遞的數據,如果傳遞的是整型數據,則使用getIntExtra()方法,傳遞的是布爾型數據,則使用 getBooleanExtra()方法,以此類推。

    

    4、返回數據給上一個活動

    既然可以傳遞數據給下一個活動, 那麼能不能夠返回數據給上一個活動呢?答案是肯定的。不過不同的是,返回上一個活動只需要按一下 Back鍵就可以了,並沒有一個用於啟動活動 Intent來傳遞數據。通過查閱文檔你會發現,Activity中還有一個 startActivityForResult()方法也是用於啟動活動的, 但這個方法期望在活動銷毀的時候能夠返回一個結果給上一個活動。毫無疑問,這就是我們所需要的。startActivityForResult()方法接收兩個參數,第一個參數還是 Intent,第二個參數是請求碼,用於在之後的回調中判斷數據的來源。我們還是來實戰一下,修改 FirstActivity中按鈕的點擊事件,代碼如下所示:

button1.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        startActivityForResult(intent, 1);
    }
});

    這裡我們使用了 startActivityForResult()方法來啟動 SecondActivity,請求碼只要是一個唯一值就可以了,這裡傳入了 1。接下來我們在 SecondActivity中給按鈕注冊點擊事件,並在點擊事件中添加返回數據的邏輯,代碼如下所示:

public class SecondActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.second_layout);
        Button button2 = (Button) findViewById(R.id.button_2);
        button2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("data_return", "Hello FirstActivity");
                setResult(RESULT_OK, intent);
                finish();
            }
        });
    }
}

    可以看到,我們還是構建了一個 Intent,只不過這個 Intent僅僅是用於傳遞數據而已,它沒有指定任何的“意圖” 。緊接著把要傳遞的數據存放在 Intent中,然後調用了 setResult()方法。這個方法非常重要,是專門用於向上一個活動返回數據的。setResult()方法接收兩個參數,第一個參數用於向上一個活動返回處理結果,一般只使用 RESULT_OK 或RESULT_CANCELED這兩個值,第二個參數則是把帶有數據的 Intent傳遞回去,然後調用了 finish()方法來銷毀當前活動。由於我們是使用startActivityForResult()方法來啟動 SecondActivity的, 在 SecondActivity被銷毀之後會回調上一個活動的onActivityResult()方法,因此我們需要在 FirstActivity中重寫這個方法來得到返回的數據,如下所示:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
    case 1:
        if (resultCode == RESULT_OK) {
            String returnedData = data.getStringExtra("data_return");
            Log.d("FirstActivity", returnedData);
        }
        break;
    default:
    }
}

    onActivityResult()方法帶有三個參數,第一個參數 requestCode,即我們在啟動活動時傳入的請求碼。 第二個參數 resultCode, 即我們在返回數據時傳入的處理結果。 第三個參數 data,即攜帶著返回數據的 Intent。由於在一個活動中有可能調用 startActivityForResult()方法去啟動很多不同的活動,每一個活動返回的數據都會回調到 onActivityResult()這個方法中,因此我們首先要做的就是通過檢查 requestCode 的值來判斷數據來源。確定數據是從SecondActivity返回的之後,我們再通過 resultCode的值來判斷處理結果是否成功。最後從data中取值並打印出來,這樣就完成了向上一個活動返回數據的工作。

    如果用戶在 SecondActivity中並不是通過點擊按鈕,而是通過按下Back鍵回到 FirstActivity,這樣數據不就沒法返回了嗎?沒錯,不過這種情況還是很好處理的,我們可以通過重寫 onBackPressed()方法來解決這個問題,代碼如下所示:

@Override
public void onBackPressed() {
    Intent intent = new Intent();
    intent.putExtra("data_return", "Hello FirstActivity");
    setResult(RESULT_OK, intent);
    finish();
}

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved