android学习笔记——Intent
Intent寻找目标组件的两种方式: 显式Intent:通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下,一般是在相同的应用程序内部实现的。 隐式Intent:通过Intent Filter来实现的,它一般用在没有明确指出目标组件名称的前提下,一般是用于在不同应用程序之间。
1、显式Intent 一 般情况下,一个Android应用程序中需要多个屏幕,即是多个Activity类,并且在这些Activity之间进行切换通过Intent机制来实现 的。在同一个应用程序中切换Activity时,我们通常都知道要启动的Activity具体是哪一个,因此常用显式的Intent来实现的。 public void onClick(View v) { //显示方式声明Intent,直接启动SecondActivity Intent it = new Intent(MainActivity.this,SecondActivity.class); //启动Activity startActivity(it); } AndroidManifest.xml清单文件,行为SecondActivity在清单文件里的声明 <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".SecondActivity" android:label="@string/app_name"> </activity>
2、隐式Intent 下面是同一应用程序中的Activity切换的例子,需要AndroidManifest.xml中增加Activity的声明,并设置对应的Intent Filter和Action,才能被Android的应用程序框架所匹配。 public void onClick(View v) { // 实例化Intent Intent it = new Intent(); //设置Intent的Action属性 it.setAction("com.android.activity.MY_ACTION"); // 启动Activity startActivity(it); }
AndroidManifest.xml 文件的18,19行修改了Intent Filter,这样SecondActivity才能够接收到MainActivity发送的Intent。因为在MainActivity的 Intent发送的动作为"com.android.activity.MY_ACTION",而在18行里,SecondActivity设置的 Action也为"com.android.activity.MY_ACTION",这样就能进行匹配。 <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".SecondActivity" > <intent-filter> <action android:name = "com.android.activity.MY_ACTION" /> <category android:name = "android.intent.category.DEFAULT" /> </intent-filter> </activity> 对于显示Intent,Android不需要再去做解析,因为目标组件很明确。Android需要解析的是隐式Intent,通过解析,将Intent映射 给可以处理该Intent的Activity,Service等。Intent的解析机制主要是通过查找已经注册在 AndroidManifest.xml中的所有IntentFilter以及其中定义的Intent,最终找到匹配的Intent。
使用Intent传递数据
向下一个活动传递数据 String data = "Hello second activity"; Intent intent = new Intent(MainActivity.this,SecondActivity.class);//显示调用, 这里也可以使用Intent.的不同参数并配合intent.setData(Uri.parse("tel:10086")); 来进行跨应用的调用。
intent.putExtra("extra_data",data); startActivity(intent);
在SecondActivity中获取传递的数据 Intent intent = getIntent();//获取到启动SecondActivity的intent String data = intent.getStringExtra("extra_data"); Log.d("SecondActivity",data);
返回数据给上一个活动 就是在启动这个活动的时候需要做一些改变 由startActivity(intent); 改变为:startActivityForResult(intent,1); 第一个参数还是intent,这里是为了指向下一个活动。 第二个参数是请求码,用于在之后的回调中判断数据的来源
那么,当下一个活动销毁时我们就需要在上层活动中进行接收,重写一下这个方法: protected void onActivityResult(int requestCode,int resultCode,Intent data){ switch(requestCode){ case 1: if(resultCode == RESULT_OK) ....; break; default;
}
}
在下一个活动中也要做相应的修改 Intent intent = new Intent();//这里也可以使用上一活动传递下来的intent--getIntent() intent.putExtra("key",value); setResult(RESULT_OK,intent);//这里的intent就是为了传递一个数据,没有指向别的活动。 finish();