Intent尋找目標組件的兩種方式:


  • 顯式Intent:通過指定Intent組件名稱來實現的,它一般用在知道目標組件名稱的前提下,一般是在相同的應用程序內部實現的。
  • 隱式Intent:通過Intent Filter來實現的,它一般用在沒有明確指出目標組件名稱的前提下,一般是用於在不同應用程序之間。

一.顯式Intent

   一般情況下,一個Android應用程序中需要多個屏幕,即是多個Activity類,並且在這些Activity之間進行切換通過Intent機制來實現的。在同一個應用程序中切換Activity時,我們通常都知道要啟動的Activity具體是哪一個,因此常用顯式的Intent來實現的。

    下 面的例子是在同一應用程序中MainActivity啟動SecondActivity,下面的代碼中,主要是為“轉到SecondActivity”按 鈕添加了OnClickListener,使得按鈕被點擊時執行onClick()方法,onClick()方法中則利用了Intent機制,來啟動 SecondActivity,關鍵的代碼是22~25行。

main.xml

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <TextView
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:text="@string/hello1"
  11. />
  12. <Button
  13. android:id="@+id/btn"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:text="轉到SecondActivity"
  17. />
  18. </LinearLayout>

second.xml

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <TextView
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:text="@string/hello2"
  11. />
  12. <Button
  13. android:id="@+id/secondBtn"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:text="返回"
  17. />
  18. </LinearLayout>

MainActivity.java

  1. package com.android.test.activity;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.widget.Button;
  8. publicclass MainActivity extends Activity {
  9. private Button btn;
  10. @Override
  11. publicvoid onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.main);
  14. btn = (Button)findViewById(R.id.btn);
  15. //響應按鈕btn事件
  16. btn.setOnClickListener(new OnClickListener() {
  17. @Override
  18. publicvoid onClick(View v) {
  19. //顯示方式聲明Intent,直接啟動SecondActivity
  20. Intent it = new Intent(MainActivity.this,SecondActivity.class);
  21. //啟動Activity
  22. startActivity(it);
  23. }
  24. });
  25. }
  26. }

SecondActivity.java

  1. package com.android.test.activity;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.widget.Button;
  8. publicclass SecondActivity extends Activity {
  9. private Button secondBtn;
  10. @Override
  11. protectedvoid onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.second);
  14. secondBtn=(Button)findViewById(R.id.secondBtn);
  15. //響應按鈕secondBtn事件
  16. secondBtn.setOnClickListener(new OnClickListener() {
  17. @Override
  18. publicvoid onClick(View v) {
  19. //顯示方式聲明Intent,直接啟動MainActivity
  20. Intent intent = new Intent(SecondActivity.this,MainActivity.class);
  21. //啟動Activity
  22. startActivity(intent);
  23. }
  24. });
  25. }
  26. }

AndroidManifest.xml清單文件,16~18行為SecondActivity在清單文件里的聲明

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <manifestxmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.android.test.activity"
  4. android:versionCode="1"
  5. android:versionName="1.0">
  6. <uses-sdkandroid:minSdkVersion="10"/>
  7. <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
  8. <activityandroid:name=".MainActivity"
  9. android:label="@string/app_name">
  10. <intent-filter>
  11. <actionandroid:name="android.intent.action.MAIN"/>
  12. <categoryandroid:name="android.intent.category.LAUNCHER"/>
  13. </intent-filter>
  14. </activity>
  15. <activityandroid:name=".SecondActivity"
  16. android:label="@string/app_name">
  17. </activity>
  18. </application>
  19. </manifest>

效果圖:

 

二.隱式Intent

   下面是同一應用程序中的Activity切換的例子,需要AndroidManifest.xml中增加Activity的聲明,並設置對應的Intent Filter和Action,才能被Android的應用程序框架所匹配。

MainActivity.java

  1. package com.android.change.activity;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.widget.Button;
  8. publicclass MainActivity extends Activity {
  9. private Button btn;
  10. @Override
  11. publicvoid onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.main);
  14. btn = (Button) findViewById(R.id.btn);
  15. // 響應按鈕btn事件
  16. btn.setOnClickListener(new OnClickListener() {
  17. @Override
  18. publicvoid onClick(View v) {
  19. // 實例化Intent
  20. Intent it = new Intent();
  21. //設置Intent的Action屬性
  22. it.setAction("com.android.activity.MY_ACTION");
  23. // 啟動Activity
  24. startActivity(it);
  25. }
  26. });
  27. }
  28. }

SecondActivity.java

  1. package com.android.change.activity;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. publicclass SecondActivity extends Activity {
  5. @Override
  6. protectedvoid onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.second);
  9. }
  10. }

main.xml

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <TextView
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. />
  11. <Button
  12. android:id="@+id/btn"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:text="轉到SecondActivity"
  16. />
  17. </LinearLayout>

seond.xml

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <TextView
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:text="@string/second"
  11. />
  12. </LinearLayout>

   AndroidManifest.xml 文件的18,19行修改了Intent Filter,這樣SecondActivity才能夠接收到MainActivity發送的Intent。因為在MainActivity的 Intent發送的動作為"com.android.activity.MY_ACTION",而在18行里,SecondActivity設置的 Action也為"com.android.activity.MY_ACTION",這樣就能進行匹配。

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <manifestxmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.android.change.activity"
  4. android:versionCode="1"
  5. android:versionName="1.0">
  6. <uses-sdkandroid:minSdkVersion="10"/>
  7. <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
  8. <activityandroid:name=".MainActivity"
  9. android:label="@string/app_name">
  10. <intent-filter>
  11. <actionandroid:name="android.intent.action.MAIN"/>
  12. <categoryandroid:name="android.intent.category.LAUNCHER"/>
  13. </intent-filter>
  14. </activity>
  15. <activityandroid:name=".SecondActivity">
  16. <intent-filter>
  17. <actionandroid:name = "com.android.activity.MY_ACTION"/>
  18. <categoryandroid:name = "android.intent.category.DEFAULT"/>
  19. </intent-filter>
  20. </activity>
  21. </application>
  22. </manifest>

效果圖:

 

    對 於顯示Intent,Android不需要再去做解析,因為目標組件很明確。Android需要解析的是隱式Intent,通過解析,將Intent映射 給可以處理該Intent的Activity,Service等。Intent的解析機制主要是通過查找已經注冊在 AndroidManifest.xml中的所有IntentFilter以及其中定義的Intent,最終找到匹配的Intent。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM