首页 > 代码库 > Android组件之间的信使——Intent

Android组件之间的信使——Intent

从一个Activity启动到另一个Activity可以使用startActivity()方法或者是startActivityForResult()方法

第一种:直接启动一个Activity
Intent intent = new Intent(Main.this, SecondActivity.class);
startActivity(intent);

 

第二种:启动另一个Activity并返回结果
作用:当从第二个Activity回跳到前一个Activity的时候,就不再需要使用startActivity,也就是说不用两次使用startActivity方法
startActivityForResult(Intent intent, Int requestCode)
intent 传给要跳转的Activity的数据和动作

requestCode >=0就好,随便用于在onActivityResult()区别哪个子模块回传的数据,如果还有C.java ,D甚至E子模块的话,每个区分开不同的requestCode就好。

Java代码  收藏代码
  1. public class MainActivity extends Activity {  
  2.     /** Called when the activity is first created. */  
  3.      @Override  
  4.         public void onCreate(Bundle savedInstanceState) {  
  5.             super.onCreate(savedInstanceState);  
  6.             setContentView(R.layout.main);  
  7.             //给按钮添加绑定的事件  
  8.             Button myButton = (Button)findViewById(R.id.myButton);  
  9.             myButton.setText("我的第一个Button");  
  10.             myButton.setOnClickListener(new OnClick());  
  11.         }  
  12.      @Override  
  13.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  14.         System.out.println(requestCode);  
  15.         System.out.println(resultCode);  
  16.     }  
  17.   
  18.      public class OnClick implements OnClickListener{  
  19.   
  20.             @Override  
  21.             public void onClick(View v) {  
  22.                 //生成一个Intent对象  
  23.                 Intent intent = new Intent();  
  24.                 intent.putExtra("testIntent", "testExtra");  
  25.                 intent.setClass(MainActivity.this,SecondActivity.class);  
  26.                 //直接启动一个Activity  
  27. //              startActivity(intent);  
  28.                 //启动一个有返回值的Activity  
  29.                 startActivityForResult(intent, 2);  
  30.             }  
  31.         }  
  32. }  

  
setResut(int resultCode, Intent intent)
resultCode如果跳转的Activity子模块可能有几种不同的结果返回,可以用这个参数予以识别区分。这里还有个特殊的RESULT_OK值,没有特殊情况用它就好了,sdk有说明的。
intent 继续不解释,传回给A的onActivityResult()


onActivityResult(int requestCode, int resultCode, Intent intent)
这里三个都不用解释了,与上文对应的东西。如果不对requestCode和resultCode 加以识别区分的话,只要有其他activity setResult到了A  onActivityResult()会无差别处理

 

 

Java代码  收藏代码
  1. public class SecondActivity extends Activity{  
  2.     @Override  
  3.     protected void onCreate(Bundle savedInstanceState) {  
  4.         // TODO Auto-generated method stub  
  5.         super.onCreate(savedInstanceState);  
  6.         this.setContentView(R.layout.other);  
  7.         Button btn = (Button)findViewById(R.id.otherButton);  
  8.         btn.setOnClickListener(new Button.OnClickListener(){  
  9.             @Override  
  10.             public void onClick(View v) {  
  11.                 Intent intent = getIntent();  
  12.                 setResult(3, intent);  
  13.                 finish();  
  14.             }  
  15.         });  
  16.     }  
  17. }  

 

如何使用自定义的Action属性?
1、定义一个自定义的Action名称——常量

Java代码  收藏代码
  1. public static final String MY_ACTION = "hb.com.MY_ACTION";  

 
2、使用一个按钮然后给其绑定事件,让它跳转到另一个Activity

Java代码  收藏代码
  1. myActionBtn.setOnClickListener(new Button.OnClickListener(){  
  2.     @Override  
  3.     public void onClick(View v) {  
  4.         System.out.println("myActionBtn");  
  5. //                  Intent intent = getIntent();  
  6. // 这里一定要new一个Intent对象,如果用上面的则打开的是当前的Activity  
  7.         Intent intent = new Intent();  
  8.         intent.setAction(MY_ACTION);  
  9.         startActivity(intent);  
  10.     }  
  11. });  

 

3、在AndroidManifest.xml配置文件中添加Activity的名称

Xml代码  收藏代码
  1. <activity android:name=".SecondActivity" android:label="@string/secondActivity">  
  2.     <intent-filter>  
  3.         <action android:name="hb.com.MY_ACTION" />  
  4.         <category android:name="android.intent.category.DEFAULT" />  
  5.     </intent-filter>  
  6. </activity>  

 

备注:hb.com.MY_ACTION这个值与intent.setAction(MY_ACTION);值是一样的
activity标签在application标签内部
category这个属性在Intent Filter中必须出现,否则不能测试通过

 

Intent的Data属性是指定动作的URI和MIME类型,不同的Action有不同的Data数据指定
Intent中的Category属性是一个执行Action的附加信息
Intent的Extras属性是添加一些组件的附加信息

 

 

Java代码  收藏代码
  1. //显示_id为1的联系人信息  
  2. data = "content://contacts/people/1";  
  3. uri = Uri.parse(data);  
  4. //ACTION_VIEW显示数据给用户  
  5. intent.setAction(Intent.ACTION_VIEW);  
  6. intent.setData(uri);  
  7. startActivity(intent);  
  8.   
  9.   
  10. //编辑_id为1的联系人信息  
  11. data = "content://contacts/people/1";  
  12. uri = Uri.parse(data);  
  13. //ACTION_EDIT显示可编辑数据  
  14. intent.setAction(Intent.ACTION_EDIT);  
  15. intent.setData(uri);  
  16. startActivity(intent);  
  17.   
  18.   
  19. //显示拨打电话的界面  
  20. data = "tel:13811111111";  
  21. uri = Uri.parse(data);  
  22. //ACTION_DIAL显示拨打电话的面板  
  23. intent.setAction(Intent.ACTION_DIAL);  
  24. intent.setData(uri);  
  25. startActivity(intent);  
  26.   
  27.   
  28. //直接拨打电话  
  29. data = "tel:13811111111";  
  30. uri = Uri.parse(data);  
  31. //ACTION_CALL直接打电话  
  32. intent.setAction(Intent.ACTION_CALL);  
  33. intent.setData(uri);  
  34. startActivity(intent);  
  35.   
  36.   
  37. //访问浏览器  
  38. data = "http://www.baidu.com";  
  39. uri = Uri.parse(data);  
  40. //ACTION_VIEW显示数据给用户  
  41. intent.setAction(Intent.ACTION_VIEW);  
  42. intent.setData(uri);  
  43. startActivity(intent);  
  44.   
  45.   
  46. //访问地图  
  47. data = "geo://39.92,116.46";  
  48. uri = Uri.parse(data);  
  49. //ACTION_VIEW显示数据给用户  
  50. intent = new Intent(Intent.ACTION_VIEW,uri);  
  51. startActivity(intent);  

 <intent-filter>列表中的action不能为空,否则程序阻塞不能通过。
如果Intent对象指定了一个Action属性,那么要想通过Action测试,Intent对象指定的属性必须和Intent Filter中的匹配,否则不能通过测试。
如果Intent对象中没有指定Action属性,则自动通过测试。