使用顯示Intent
首先構建出了一個Intent ,傳人FirstActivity.this 作為上下文,傳入SecondActivity.class 作為目標活動,這樣我們的“意圖”就非常明顯了,即在FirstActivity 這個活動的基礎上打開SecondActivity 這個活動。然后通過startActivity()方法來執(zhí)行這個Intent。
@Override public void onClick(View v) { Intent intent = new Intent(FirstActivity.this, SecondActivity.class); startActivity(intent); }使用隱式Intent
通過在標簽下配置的內容,可以指定當前活動能夠響應的action 和category ,打開AndroidManifest.xml ,添加如下代碼:
在標簽中我們指明了當前活動可以響應com.sxf.activitytest.ACTION_START 這個action ,而標簽則包含了一些附加信息,更精確地指明了當前的活動能夠響應的Intent 中還可能帶有的category 。只有和中的內容同時能夠匹配上Intent 中指定的action 和category 時,這個活動才能響應該Intent 。
修改 FirstActivity 中按鈕的點擊事件,代碼如下所示:
@Override public void onClick(View v) { Intent intent = new Intent("com.sxf.activitytest.ACTION_START"); startActivity(intent); }android.intent.category.DEFAULT 是-種默認的 category ,在調用 startActivity ()方法的時候會自動將這個 category 添加到 Intent 中。
每個 Intent 中只能指定一個 action ,但卻能指定多個category:
intent.addCategory("com.sxf.activitytest.MY_CATEGORY1");intent.addCategory("com.sxf.activitytest.MY_CATEGORY2");更多隱式Intent
使用隱式Intent ,不僅可以啟動自己程序內的活動,還可以啟動其他程序的活動,這使得Android 多個應用程序之間的功能共享成為了可能。
調用瀏覽器打開網頁
@Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.baidu.com"));startActivity(intent); }Intent.ACTION VIEW ,這是一個Android 系統(tǒng)內置的動作,其常量值為android.intent.action.VIEW。然后通過Uri.parse ()方法,將一個網址字符串解析成一個Uri 對象,再調用Intent 的setData()方法將這個Uri 對象傳遞進去。
setData()接收一個Uri 對象,主要用于指定當前Intent 正在操作的數據,而這些數據通常都是以字符串的形式傳入到Uri.parse ()方法中解析產生的。
還可以在標簽中再配置一個標簽,用于更精確地指定當前活動能夠響應什么類型的數據。標簽中主要可以配置以下內容:
android:scheme。用于指定數據的協(xié)議部分,如http、geo、telandroid:host。用于指定數據的主機名部分,如www.baidu.com 部分android:port。用于指定數據的端口部分,一般緊隨在主機名之后android: path。用于指定主機名和端口之后的部分,如一段網址中跟在域名之后的內容android:mimeType。用于指定可以處理的數據類型,允許使用通配符的方式進行指定只有標簽中指定的內容和Intent 中攜帶的Data 完全一致時,當前活動才能夠響應該Intent。
撥打電話
@Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:10086"));startActivity(intent); }向下一個活動傳遞數據
Intent 中提供了一系列putExtra()方法的重載,可以把我們想要傳遞的數據暫存在Intent 中,啟動了另一個活動后,只需要把這些數據再從Intent中取出即可。
MainActivity.java:
@Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, Main2Activity.class); intent.putExtra("extradata", "this is extra data");startActivity(intent); }Main2Activity.java:
@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2);Intent intent = getIntent(); String data = intent.getStringExtra("extradata");System.out.println(data); }
通過getIntent()方法獲取到用于啟動SecondActivity 的Intent ,然后調用getStringExtra()方法,傳入相應的鍵值,就可以得到傳遞的數據。如果傳遞的是整型數據,則使用getintExtra方法;如果傳遞的是布爾型數據,則使用getBooleanExtra()方法,以此類推。
向上一個活動傳遞數據
Activity 中還有一個startActivityForResult()方法也是用于啟動活動的,但這個方法期望在活動銷毀的時候能夠返回一個結果給上一個活動。方法接收兩個參數,第一個參數還是Intent ,第二個參數是請求碼(只要是一個唯一值就可以),用于在之后的回調中判斷數據的來源。
MainActivity.java:
@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.mainlayout); Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, Main2Activity.class); startActivityForResult(intent, 1); } }); }@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data);switch (requestCode) { case 1: if (resultCode == RESULT_OK) { String resdata = data.getStringExtra("data_return"); System.out.println(resdata); } break; default:break; } }Main2Activity.java:
@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2);Button button = (Button) findViewById(R.id.button2); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.putExtra("data_return", "this is return data test");setResult(RESULT_OK, intent); finish(); } }); }