android學習三(Intent)

前面的博文介紹瞭Activity,可能學的還不太爽哦,所以接下來學習android的Intent,它是android的信使,可以進行各個組件之間進行通信瞭。我依然在前面的基礎上進行修改開發,免的囉嗦過多的東西。沒看過前面的博文的,可以先看android學習二(Activity),好瞭,接下來開始吧。

使用顯示的Intent

1.在前面的ActivityTest基礎上,我們在創建一個佈局文件,文件名為second_layout.xml,代碼如下:


    
    

2.新建一個活動,取名為SecondActivity,代碼為:

package com.wj.test;

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

public class SecondActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.second_layout);
	}

	
}

3.進行註冊活動,在AndroidManifest.xml中進行活動的註冊,代碼如下:


    

    
        
            
                
                
            
        
        
        
        
        
    


4.改寫FirstActivity活動中的按鈕事件,修改後的主要代碼如下:

button1.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
/*				Toast.makeText(FirstActivity.this, "you clicked button1",
					Toast.LENGTH_SHORT).show();*/
				/*
				 * Intent的使用分為顯示的Intent和隱式的Intent,下面的是顯示的Intent
				 * Intent有多個構造函數,我使用的是一個簡單的的,第一個參數Context要求提供一個啟動
				 * 活動的上下文,第二個參數Class則是指定想要啟動的目標活動,通過這個構造函數構建出Intent
				 * 的“意圖”,然後使用startActivity(intent);啟動目標活動。
				 * Intent是android程序中個組件之間進行交互的一種重要的方式,它不緊可以指明當前組想要執行
				 * 的動作,還可以在不同組件之間傳遞數據。Intent一般可被用於啟動活動,服務,以及發送廣播等。
				 * */
				Intent intent=new Intent(FirstActivity.this,
						SecondActivity.class);
				startActivity(intent);
			}
			
		});

5.重寫運行程序,點擊button1,將跳轉到SecondActivity

運行結果如上圖所示,上面的就是顯示的進行Intent顯示的使用,應為指明瞭將跳轉到哪一個類。下面我們在說說,怎麼使用隱式的使用。vcD4KPHA+PGJyPgo8L3A+CjxwPjxicj4KPC9wPgo8cD48YnI+CjwvcD4KPHA+yrnTw9L+yr21xEludGVudDwvcD4KPHA+ICAgICAgz+CxyNPrz9TKvrXESW50ZW50o6zS/sq9tcRJbnRlbnS6rNDuwcu63Lbgo6zL/LKisrvWuMP3ztLDx8/r0qrG9LavxMTSu7j2u+62r6OstvjKx9a4tqjBy9K7z7XB0LXEYWNpdG9uus1jYXRlZ29yebXI0MXPoqOsyLu6872708nPtc2zyKW31s721eK49mludGVudKOssqKw787Sw8fV0rP2us/KyrXEu+62r8ilxvS2r6GjPC9wPgo8cD4xLtTayc/D5rXEu/m0ocnPztLDx9DeuMSzydL+yr21xEludGVudKOsytfPyLjE0LRBbmRyb2lkTWFuaWZlc3QueG1swO/D5rXEPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0=”.SecondActivity”>,為該註冊的活動,進行intent-filter的配置,配置的內容如下:

            
                 
                
            
        

註意 裡面的android:name,是可以自己定義的,指不過在創建Intent的時候要保證和這裡的字符串一致就ok瞭。在aciton標簽中我們指明瞭當前活動可以響應com.wj.test.activitytest.ACTION_START這個action,而標簽則包含瞭一些附加的信息,更精確的指明瞭當前活動能夠響應的Intent中還可能帶有的category。隻有和中的內容同時能夠匹配上Intent中指定的action和category時,這個活動才能響應該Intent。

2.修改FirstActivity中按鈕的點擊事件,代碼如下:

button1.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
/*				Toast.makeText(FirstActivity.this, "you clicked button1",
					Toast.LENGTH_SHORT).show();*/
				/*
				 * Intent的使用分為顯示的Intent和隱式的Intent,下面的是顯示的Intent
				 * Intent有多個構造函數,我使用的是一個簡單的的,第一個參數Context要求提供一個啟動
				 * 活動的上下文,第二個參數Class則是指定想要啟動的目標活動,通過這個構造函數構建出Intent
				 * 的“意圖”,然後使用startActivity(intent);啟動目標活動。
				 * Intent是android程序中個組件之間進行交互的一種重要的方式,它不緊可以指明當前組想要執行
				 * 的動作,還可以在不同組件之間傳遞數據。Intent一般可被用於啟動活動,服務,以及發送廣播等。
				 * */
				/*Intent intent=new Intent(FirstActivity.this,
						SecondActivity.class);
				startActivity(intent);*/
				
				//使用隱式的Intent
				Intent intent=new Intent("com.wj.test.activitytest.ACTION_START");
				startActivity(intent);
			}
			
		});

可以看到,我們使用瞭Intent的另一個構造函數,直接將action的字符串傳瞭進去,表明我們想要啟動能夠響應com.wj.test.activitytest.ACTION_START這個action的活動。是一種默認的category,在調用startActivity方法的時候會自動將這個category添加到Intent中。

重寫運行程序,將出現和顯示的Intent一樣的效果。

註意:每個Intent中隻能指定一個action,但卻能指定多個category。下面我們在添加一個category吧。

3.修改FirstActivity中按鈕的點擊事件,代碼如下:

button1.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
/*				Toast.makeText(FirstActivity.this, "you clicked button1",
					Toast.LENGTH_SHORT).show();*/
				/*
				 * Intent的使用分為顯示的Intent和隱式的Intent,下面的是顯示的Intent
				 * Intent有多個構造函數,我使用的是一個簡單的的,第一個參數Context要求提供一個啟動
				 * 活動的上下文,第二個參數Class則是指定想要啟動的目標活動,通過這個構造函數構建出Intent
				 * 的“意圖”,然後使用startActivity(intent);啟動目標活動。
				 * Intent是android程序中個組件之間進行交互的一種重要的方式,它不緊可以指明當前組想要執行
				 * 的動作,還可以在不同組件之間傳遞數據。Intent一般可被用於啟動活動,服務,以及發送廣播等。
				 * */
				/*Intent intent=new Intent(FirstActivity.this,
						SecondActivity.class);
				startActivity(intent);*/
				
				//使用隱式的Intent
				Intent intent=new Intent("com.wj.test.activitytest.ACTION_START");
				intent.addCategory("com.wj.activitytest.MY_CATEGORY");
				startActivity(intent);
			}
			
		});

4.修改後你在運行一下程序,就會發現程序崩潰瞭,看錯誤信息,你會發現10-27 01:03:47.937: E/AndroidRuntime(2824): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.wj.test.activitytest.ACTION_START
cat=[com.wj.activitytest.MY_CATEGORY] },提示我們沒有任何活動可以響應我們的Intent,這是因為我們添加瞭intent.addCategory(“com.wj.activitytest.MY_CATEGORY”);,而SecondActivity的標簽中並沒有聲明這個category,所以就出現瞭沒有任何活動可以響應Intent的情況。我們對添加category的聲明。

            
                 
                
                
            
        

5.再次運行,就一切正常瞭

更多隱式Intent的用法

打開一個指定的頁面的瀏覽器

1.修改FirstActivity中按鈕點擊事件的代碼,主要代碼如下

button1.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
/*				Toast.makeText(FirstActivity.this, "you clicked button1",
					Toast.LENGTH_SHORT).show();*/
				/*
				 * Intent的使用分為顯示的Intent和隱式的Intent,下面的是顯示的Intent
				 * Intent有多個構造函數,我使用的是一個簡單的的,第一個參數Context要求提供一個啟動
				 * 活動的上下文,第二個參數Class則是指定想要啟動的目標活動,通過這個構造函數構建出Intent
				 * 的“意圖”,然後使用startActivity(intent);啟動目標活動。
				 * Intent是android程序中個組件之間進行交互的一種重要的方式,它不緊可以指明當前組想要執行
				 * 的動作,還可以在不同組件之間傳遞數據。Intent一般可被用於啟動活動,服務,以及發送廣播等。
				 * */
				/*Intent intent=new Intent(FirstActivity.this,
						SecondActivity.class);
				startActivity(intent);*/
				
				//使用隱式的Intent
				/*Intent intent=new Intent("com.wj.test.activitytest.ACTION_START");
				intent.addCategory("com.wj.activitytest.MY_CATEGORY");
				startActivity(intent);*/
				
				//更多隱式的Intent的用法
				//打開瀏覽器
				/*
				 * 這裡我們指定瞭Intent的action是Intent.ACTION_VIEW,這是一個android系統內置的動作,
				 * 其常量為android.intent.action.VIEW,然後通過Uri.parse方法,將一個網址字符串解析成一個
				 * Uri對象,在調用Intent的setData()方法將這個對象傳遞進去。
				 * */
				Intent intent=new Intent(Intent.ACTION_VIEW);
				intent.setData(Uri.parse("https://www.baidu.com"));
				startActivity(intent);
				
			}
			
		});

在上面我們指定瞭Intent的data數據,於此對應的,我們還可以在,標簽中在配置一個標簽,用與更精確地指定當前活動能夠響應什麼類型的數據。標簽中主要可以配置以下的內容:

android:scheme用於指定數據的協議部分,如上列中的http部分

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

android:port用於指定數據的端口不,一般緊隨在主機名之後

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

android:mineType用於指定可以處理的數據類型,允許使用通配符的方式進行指定。

隻有標簽中指定的內容和Intent中攜帶的Data完全一致時,當前活動才能夠響應該Intent。

下面建立一個活動,讓它也能響應打開網頁的Intent。

新建一個佈局文件名為third_layout.xml代碼如下:



    

然後新建一個活動ThirdActivity繼承Activity,代碼如下:

package com.wj.test;

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

public class ThirdActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.third_layout);
	}

}

註冊activity

 
            
                
                
                
            
        

在ThirdActivity的中配置瞭當前活動能夠響應的action是Intent.ACTION_VIEW的常量,而category則使用默認的值,另外data標簽中通過android:scheme=”http”指定瞭數據協議必須是http協議,這樣ThirdActivity應該就和瀏覽器一樣,能夠響應一個打開網頁的Intent瞭。

運行程序程序點擊button1結果如下:

選擇AndroidTest繼續運行結果如下:

下面使用Intent實現調用撥打電話的功能

修改button1的監聽程序,代碼如下:

button1.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
/*				Toast.makeText(FirstActivity.this, "you clicked button1",
					Toast.LENGTH_SHORT).show();*/
				/*
				 * Intent的使用分為顯示的Intent和隱式的Intent,下面的是顯示的Intent
				 * Intent有多個構造函數,我使用的是一個簡單的的,第一個參數Context要求提供一個啟動
				 * 活動的上下文,第二個參數Class則是指定想要啟動的目標活動,通過這個構造函數構建出Intent
				 * 的“意圖”,然後使用startActivity(intent);啟動目標活動。
				 * Intent是android程序中個組件之間進行交互的一種重要的方式,它不緊可以指明當前組想要執行
				 * 的動作,還可以在不同組件之間傳遞數據。Intent一般可被用於啟動活動,服務,以及發送廣播等。
				 * */
				/*Intent intent=new Intent(FirstActivity.this,
						SecondActivity.class);
				startActivity(intent);*/
				
				//使用隱式的Intent
				/*Intent intent=new Intent("com.wj.test.activitytest.ACTION_START");
				intent.addCategory("com.wj.activitytest.MY_CATEGORY");
				startActivity(intent);*/
				
				//更多隱式的Intent的用法
				//打開瀏覽器
				/*
				 * 這裡我們指定瞭Intent的action是Intent.ACTION_VIEW,這是一個android系統內置的動作,
				 * 其常量為android.intent.action.VIEW,然後通過Uri.parse方法,將一個網址字符串解析成一個
				 * Uri對象,在調用Intent的setData()方法將這個對象傳遞進去。
				 * */
				/*Intent intent=new Intent(Intent.ACTION_VIEW);
				intent.setData(Uri.parse("https://www.baidu.com"));
				startActivity(intent);*/
				
				
				//實現撥打電話
				Intent intent=new Intent(Intent.ACTION_DIAL);
				intent.setData(Uri.parse("tel:10086"));
				startActivity(intent);
				
				
				
			}
			
		});

運行程序,結果如下:

下面我將講解怎麼使用Intent在活動中傳遞數據

向下一個活動傳遞數據

1.修改button1的監聽按鈕代碼

//向下一個活動傳遞數據
				/*
				 * Intent中提供瞭一系列putExtra()方法的重載,可以把我們想要傳遞的數據暫存在Intent中
				 * ,啟動瞭另一個活動後,隻需把這些數據再從Intent中取出就可以瞭。
				 * */
				String data="Hello SecondActivity";
				Intent intent =new Intent(FirstActivity.this,SecondActivity.class);
				intent.putExtra("extra_data", data);
				startActivity(intent);

這裡使用顯示的Intent的方式來啟動SecondActivity,並通過putExtra()方法傳遞瞭一個字符串,該方法接收2個參數,第一個參數是鍵,用於後面從Intent中取值,第二個參數才是真正傳遞的數據。

2.修改SecondActivity中將傳遞的數據取出,並打印出來,代碼如下所示:

package com.wj.test;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Window;

public class SecondActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		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()方法獲取到用於啟動SecondeActivity的Intent,然後調用getStringExtra()方法,傳入相應的鍵值,就可以得到傳遞的數據瞭。
運行程序可以看到如下輸出Hello SecondActivity

返回數據給上一個活動:

1.修改button1監聽器的代碼:

button1.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
/*				Toast.makeText(FirstActivity.this, "you clicked button1",
					Toast.LENGTH_SHORT).show();*/
				/*
				 * Intent的使用分為顯示的Intent和隱式的Intent,下面的是顯示的Intent
				 * Intent有多個構造函數,我使用的是一個簡單的的,第一個參數Context要求提供一個啟動
				 * 活動的上下文,第二個參數Class則是指定想要啟動的目標活動,通過這個構造函數構建出Intent
				 * 的“意圖”,然後使用startActivity(intent);啟動目標活動。
				 * Intent是android程序中個組件之間進行交互的一種重要的方式,它不緊可以指明當前組想要執行
				 * 的動作,還可以在不同組件之間傳遞數據。Intent一般可被用於啟動活動,服務,以及發送廣播等。
				 * */
				/*Intent intent=new Intent(FirstActivity.this,
						SecondActivity.class);
				startActivity(intent);*/
				
				//使用隱式的Intent
				/*Intent intent=new Intent("com.wj.test.activitytest.ACTION_START");
				intent.addCategory("com.wj.activitytest.MY_CATEGORY");
				startActivity(intent);*/
				
				//更多隱式的Intent的用法
				//打開瀏覽器
				/*
				 * 這裡我們指定瞭Intent的action是Intent.ACTION_VIEW,這是一個android系統內置的動作,
				 * 其常量為android.intent.action.VIEW,然後通過Uri.parse方法,將一個網址字符串解析成一個
				 * Uri對象,在調用Intent的setData()方法將這個對象傳遞進去。
				 * */
				/*Intent intent=new Intent(Intent.ACTION_VIEW);
				intent.setData(Uri.parse("https://www.baidu.com"));
				startActivity(intent);*/
				
				
				//實現撥打電話
				/*Intent intent=new Intent(Intent.ACTION_DIAL);
				intent.setData(Uri.parse("tel:10086"));
				startActivity(intent);*/
				
				
				//向下一個活動傳遞數據
				/*
				 * Intent中提供瞭一系列putExtra()方法的重載,可以把我們想要傳遞的數據暫存在Intent中
				 * ,啟動瞭另一個活動後,隻需把這些數據再從Intent中取出就可以瞭。
				 * */
				/*String data="Hello SecondActivity";
				Intent intent =new Intent(FirstActivity.this,SecondActivity.class);
				intent.putExtra("extra_data", data);
				startActivity(intent);*/
				
				
				//返回數據給上一個活動
				Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
				/*
				 * startActivityForResult方法接收2個參數,一個參數是Intent,第二個參數是請求碼
				 * ,用於在之後的的回調中判斷數據的來源
				 * */
				startActivityForResult(intent, 1);
				
				
				
			}
			
		});

2.給button2進行監聽

package com.wj.test;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;

public class SecondActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		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);*/
		
		//獲得按鈕組件
		Button button2=(Button) findViewById(R.id.button_2);
		button2.setOnClickListener(new OnClickListener(){//進行監聽

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent intent=new Intent();
				intent.putExtra("data_return", "Hello FirstActivity");
				//setResult()方法接收兩個參數,第一個參數用於向上一個活動返回處理結果,一般使用
				//RESULT_OK or RESULT_CANCELED,第二個參數則是把帶有數據的Intent傳遞回去,然後調用
				//finish方法來銷毀當前活動
				setResult(RESULT_OK,intent);
				finish();//銷毀當前活動
			}
			
		});
		
	}

	
}

3.重寫FirstActivity的回調方法

//重寫onActivityResult方法獲取返回的結果數據
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		switch(requestCode){
		case 1:
			if(resultCode==RESULT_OK){
				String returnedData=data.getStringExtra("data_return");
				Log.d("FirstActivity", returnedData);
			}
			break;
		default:break;
		}
		
	}

運行程序點擊button1,然後點擊button2,觀看log的輸出你就會發現輸出瞭

10-28 12:09:09.396: D/FirstActivity(3755): Hello FirstActivity

註意在一個活動中調用startActivityForResult方法去啟動不同的活動,沒一個活動返回的數據都會調用onActivityResult這個方法。

如果你不想點擊button2的按鈕進行返回,你可以點擊back鍵進行返回隻要重寫SecondActivity的onBackPressed()方法就行瞭,代碼如下:

@Override
	public void onBackPressed() {
		// TODO Auto-generated method stub
		Intent intent=new Intent();
		intent.putExtra("data_return", "Hello FirstActivity");
		//setResult()方法接收兩個參數,第一個參數用於向上一個活動返回處理結果,一般使用
		//RESULT_OK or RESULT_CANCELED,第二個參數則是把帶有數據的Intent傳遞回去,然後調用
		//finish方法來銷毀當前活動
		setResult(RESULT_OK,intent);
		finish();//銷毀當前活動
	}

總結:通過上面的講解,Intent的基本的使用就講解完瞭,在數據傳遞的時候,Intent是意圖,相當與信使,你可以把數據放到Bundle中,在把Bundle放到Intent中,也可以進行數據的傳遞,在使用的時候,希望能夠舉一反三,不會的方法可以多查看api和源碼,Intent就講解到這吧,下一篇將講解活動的生命周期。

轉載請註明:https://blog.csdn.net/j903829182/article/details/40502495

發佈留言