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 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns: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 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns: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 3 import android.app.Activity; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.view.View.OnClickListener; 8 import android.widget.Button; 9 10 public class MainActivity extends Activity { 11 private Button btn; 12 @Override 13 public void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.main); 16 17 btn = (Button)findViewById(R.id.btn); 18 //响应按钮btn事件 19 btn.setOnClickListener(new OnClickListener() { 20 @Override 21 public void onClick(View v) { 22 //显示方式声明Intent,直接启动SecondActivity 23 Intent it = new Intent(MainActivity.this,SecondActivity.class); 24 //启动Activity 25 startActivity(it); 26 } 27 }); 28 } 29 }
SecondActivity.java
1 package com.android.test.activity; 2 3 import android.app.Activity; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.view.View.OnClickListener; 8 import android.widget.Button; 9 10 public class SecondActivity extends Activity { 11 private Button secondBtn; 12 @Override 13 protected void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.second); 16 17 secondBtn=(Button)findViewById(R.id.secondBtn); 18 //响应按钮secondBtn事件 19 secondBtn.setOnClickListener(new OnClickListener() { 20 @Override 21 public void onClick(View v) { 22 //显示方式声明Intent,直接启动MainActivity 23 Intent intent = new Intent(SecondActivity.this,MainActivity.class); 24 //启动Activity 25 startActivity(intent); 26 } 27 }); 28 } 29 }
AndroidManifest.xml清单文件,16~18行为SecondActivity在清单文件里的声明
1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns: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-sdk android:minSdkVersion="10" /> 7 8 <application android:icon="@drawable/icon" android:label="@string/app_name"> 9 <activity android:name=".MainActivity" 10 android:label="@string/app_name"> 11 <intent-filter> 12 <action android:name="android.intent.action.MAIN" /> 13 <category android:name="android.intent.category.LAUNCHER" /> 14 </intent-filter> 15 </activity> 16 <activity android:name=".SecondActivity" 17 android:label="@string/app_name"> 18 </activity> 19 </application> 20 </manifest>
效果图:
二.隐式Intent
下面是同一应用程序中的Activity切换的例子,需要AndroidManifest.xml中增加Activity的声明,并设置对应的Intent Filter和Action,才能被Android的应用程序框架所匹配。
MainActivity.java
1 package com.android.change.activity; 2 3 import android.app.Activity; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.view.View.OnClickListener; 8 import android.widget.Button; 9 10 public class MainActivity extends Activity { 11 private Button btn; 12 13 @Override 14 public void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.main); 17 18 btn = (Button) findViewById(R.id.btn); 19 // 响应按钮btn事件 20 btn.setOnClickListener(new OnClickListener() { 21 @Override 22 public void onClick(View v) { 23 // 实例化Intent 24 Intent it = new Intent(); 25 //设置Intent的Action属性 26 it.setAction("com.android.activity.MY_ACTION"); 27 // 启动Activity 28 startActivity(it); 29 } 30 }); 31 } 32 }
SecondActivity.java
1 package com.android.change.activity; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 6 public class SecondActivity extends Activity { 7 8 @Override 9 protected void onCreate(Bundle savedInstanceState) { 10 super.onCreate(savedInstanceState); 11 setContentView(R.layout.second); 12 } 13 }
main.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns: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 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns: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 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns: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-sdk android:minSdkVersion="10" /> 7 8 <application android:icon="@drawable/icon" android:label="@string/app_name"> 9 <activity android:name=".MainActivity" 10 android:label="@string/app_name"> 11 <intent-filter> 12 <action android:name="android.intent.action.MAIN" /> 13 <category android:name="android.intent.category.LAUNCHER" /> 14 </intent-filter> 15 </activity> 16 <activity android:name=".SecondActivity" > 17 <intent-filter> 18 <action android:name = "com.android.activity.MY_ACTION" /> 19 <category android:name = "android.intent.category.DEFAULT" /> 20 </intent-filter> 21 </activity> 22 </application> 23 </manifest>
效果图:
对 于显示Intent,Android不需要再去做解析,因为目标组件很明确。Android需要解析的是隐式Intent,通过解析,将Intent映射 给可以处理该Intent的Activity,Service等。Intent的解析机制主要是通过查找已经注册在 AndroidManifest.xml中的所有IntentFilter以及其中定义的Intent,最终找到匹配的Intent。
本文出自 “IT的点点滴滴” 博客,请务必保留此出处http://liangruijun.blog.51cto.com/3061169/655132