Intent主要的作用是减少组件间的耦合,并且Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递Intent来执行动作和产生事件。使用Intent可以激活Android应用的三个核心组件:活动、服务和广播接收器。
Intent可以划分成显式意图和隐式意图。
显式意图:调用Intent.setComponent()或Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。
隐式意图:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。
1.1下面先介绍下显示意图的四种写法(注意第3种写法有两种)
1 //第1种显示的打开OtherActivity OtherActivity.class为Activity类 2 Intent intent = new Intent(this, OtherActivity.class); 3 //第2种 OtherActivity.class为类 4 Intent intent = new Intent(); 5 intent.setClass(this, OtherActivity.class); 6 //第3种 com.xxx.activitys.OtherActivity 为Activity类加上包名 intent.setClassName("", ""); 第一参数为应用的包名 第二个为包名和类名 这个可以跨应用访问组件 7 intent.setClassName(this, "com.xxx.activitys.OtherActivity") 8 //第4种 OtherActivity.class 为Activity类名 9 intent.setComponent(new ComponentName(this, OtherActivity.class));
1.2隐式意图的写法
第一步在你想要到的目的地(所谓的要跳转的Activity,BroadcastReceiver,Service)添加<intent-filter > </intent-filter >
例如:
<activity android:name=".OtherActivity" android:label="@string/title"> <intent-filter > <action android:name="com.xx.zhangxx"/> <action android:name="com.xx.hello"/> <category android:name="com.xx.category.java"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="com.xx.category.php"/> <data android:scheme="myscheme" android:host="www.xx.com" android:path="/xx"/> <data android:mimeType="image/*"/> </intent-filter> </activity>
注意的事项:
1.<category android:name="android.intent.category.DEFAULT"/> 这个category 必须写上 因为在系统的默认的情况下会自动添加上这个category
2.在只有action 和category的匹配的时候只需要对应出一个action和category 即可 匹配成功
3.<data android:scheme="myscheme" android:host="www.xx.com" android:path="/xx"/> 匹配的路径应该是 myscheme://www.xx.com/xx
4.使用data中的 路径和mimeType都存在的时候需要使用的方法setDataAndType 不能单开写 否则会出错
隐式意图在Java中的写法
1 Intent intent = new Intent();//隐式意图激活Activity 2 intent.setAction("com.xx.zhangxx"); //只需要匹配一个即成功 3 intent.addCategory("com.xx.category.java"); //只需要匹配一个即成功 4 intent.setDataAndType(Uri.parse("myscheme://www.xx.com/xx"), "image/jpeg");
Intent携带数据到另一组件的问题
1.1启动另一个组件的方法
startActivity(intent);//启动到另一组件 但是不会接受进入到的另一组件的关闭/来电话等等打断或其它意外的情况的返回数据
startActivityForResult(intent, 100); //第二个参数为请求码 启动到另一组件 会接受进入到的另一组件的关闭/来电话等等打断或其它意外的情况的返回数据
1.2
1.2.1使用Intent从一个组件到另一个组件传递数据
//在第一个组件中放入参数 Intent intent = new Intent(this, OtherActivity.class); intent.putExtra("company", "我的Android工厂"); intent.putExtra("age", 5); startActivity(intent); //在第二个组件中接受参数的值 Intent intent = getIntent();//获取用于激活它的意图对象 String company = intent.getStringExtra("company"); int age = intent.getIntExtra("age", 0);
1.2.2使用Bundle传入多条数据
//在第一个组件中放入数据到Bundle 中 Intent intent = new Intent(this, OtherActivity.class); Bundle bundle = new Bundle(); bundle.putString("company", "我的Android公司"); bundle.putInt("age", 5); intent.putExtras(bundle);
startActivity(intent); //在第二个组件中接受数据 Intent intent = getIntent();//获取用于激活它的意图对象 Bundle bundle = intent.getExtras(); String company = bundle.getString("company"); int age = bundle.getInt("age");
1.3第二个组件关闭或者意外后返回数据的写法
第一步:需要在第一个组件到第二个组件使用startActivityForResult(intent, 100);方法
第二步:在第一个组件中重写方法onActivityResult
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { //requestCode 为设置的等待的请求码 也就是上述的100 //resultCode 为在第二个组件中设置的结果码 //data 为在第二个组件返回的数据 String result = data.getStringExtra("result"); Toast.makeText(getApplicationContext(),result, 1).show(); super.onActivityResult(requestCode, resultCode, data); }
第三步:在第二个组件中intent中放入数据调用方法setResult(20, intent);//设置返回数据
例如:
Intent intent = new Intent(); intent.putExtra("result", "我是第二个组件的返回的结果!"); setResult(20, intent);//设置返回数据 finish();//关闭Activity(关闭窗口)
希望对大家有帮助,有疑问欢迎提出问题,大家一起讨论和解决