Android 三大重要的组件Activity、Service、Service、BroadcastReceiver通过Intent来启动,还用于被启动组件交换信息。
Intent分为显式的Intent和隐式的Intent
(1).显式的Intent明确目标接受者
ntent it = new Intent(Activity.Main.this, Activity2.class);
startActivity(it);
(2).隐式的Intent,即Intent的发送者在构造Intent对象时,并不知道也不关心接收者是谁,有利于降低发送者和接收者之间的耦合,它一般用在没有明确指出目标组件名称的前提下,一般是用于在不同应用程序之间,如下:
Intent it = new Intent();
it.setAction("com.google.test");
startActivity(it);
上面那个intent没有指明接收者,只是给了一个action作为接收者的过滤条件。
对于显式Intent,Android不需要去做解析,因为目标组件已经很明确,Android需要解析的是那些隐式Intent,通过解析,将Intent映射给可以处理此Intent的Activity、IntentReceiver或Service。
Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找到匹配的Intent。在这个解析过程中,Android是通过Intent的action、type、category这三个属性来进行判断的,判断方法如下:
· 如果Intent指明定了action,则目标组件的IntentFilter的action列表中就必须包含有这个action,否则不能匹配;
· 如果Intent没有提供type,系统将从data中得到数据类型。和action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。
· 如果Intent中的数据不是content: 类型的URI,而且Intent也没有明确指定它的type,将根据Intent中数据的scheme 进行匹配。
· 如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类别列表中。
Intent启动方法:startActivity(Intent intent)//开启一个新的Activity
startActivityForResult(Intent intent,int requestCode) //开启一个新的Activity,返回结果给原Activity
如下图:
Ps:
requestCode:请求码,非负数。只有是非负数时,Activity退出时,这个码会返回到onActivityResult()。
resultCode:结果码,用于标识返回数据来自于哪个新Activity,直为:RESULT_CANCELED, RESULT_OK, RESULT_FIRST_USER。
bundle:一种存放字符串和Parcelable类型数据的map类型的容器类。主要用于Activity之间数据传递。
用法:
1.打包数据
Bundle bundle = new Bundle();//创建一个句柄
bundle.putString("name", nameinfo);//将nameinfo填充入句柄
Intent mIntent = new Intent(TestBundle.this,TestBundle_getvalue.class);
mIntent.putExtras(bundle);
startActivity(mIntent);
2:获取数据
Bundle bundle = getIntent().getExtras();//获取一个句柄
String nameString=bundle.get("name");//通过key为“name”来获取value即 nameString
以下事例利用startActivityForResult进行数据交换:
原Activity
--------------------------------------------------------------------------
//new 一个 Intent对象,并制定class
Intent intent = new Intent();
intent.setClass(MainActivity.this,JiSuanActivity.class);
//new 一个Bundle对象,并要传递的数据传入
Bundle bundle = new Bundle();
bundle.putDouble("height",height);
bundle.putString("sex",sex);
//将bunle 对象assign给Intent
intent.putExtras(bundle);
//调用Activity JiSuanActivity
startActivityForResult(intent,0);--------------------------------------------------------------------------
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode){
case RESULT_OK:
/*取得来自JiSuanActivity的数据,并显示在画面上*/
Bundle bundle = data.getExtras();
String sex = bundle.getString("sex");
double height = bundle.getDouble("height");
break;
default:
break;
}
}新Activity
---------------------------------------------------------
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_jisuan_main);
final Intent intent = getIntent();
Bundle bundle =intent.getExtras();
Button bt = (Button) findViewById(R.id.Return);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
JiSuanActivity.this.setResult(RESULT_OK,intent);
JiSuanActivity.this.finish();
}
});
}
本文介绍了Android中Intent的重要性和使用,特别是隐式Intent的工作原理。解析过程主要基于action、type和category进行匹配,寻找AndroidManifest.xml中合适的IntentFilter。此外,还详细讲解了如何在Activity间使用bundle传递数据,包括打包数据和获取数据的方法,以及通过startActivityForResult进行数据交换的过程。

403

被折叠的 条评论
为什么被折叠?



