Android Activity(二)
二、Intent
题外话:为什么我会将打电话、发短信、拍照等视作系统功能操作(事实上Android官方也是这么理解的),可能很多人认为在Android操作系统中,这些只是一个个的程序,跟QQ没什么区别。但是这些功能毕竟是从功能机时代开始,作为一部手机所具有的基本功能。举个例子,你的手机里可能没有自带QQ、支付宝等程序,但是绝对自带了拨号程序、短信、相机等程序。另外,我们可以从网上形形色色的Android应用上看出,拨号、短信、相机等应用只占了极其少数。当然,也有在同一个系统中存在多个相同的系统功能程序,比如你在某条短信中要打开某个URL,假如你装了Chrome浏览器和系统自带浏览器,当你点击该URL后,系统会根据你的点击事件寻找到符合Action功能要求的程序Activity,并弹出对话框让你选择使用哪一个浏览器进行浏览。
1. Intent,意图,对一次操作的抽象描述。
我个人将其理解为:一个Activity要与其他Activity进行互动,需要使用Intent作为媒介才能相互通信(好比两个人对话之间需要空气作为媒介传递声音一样,当然你可以用棉线::>_<::),所以Intent就是将Activity要进行的具体、具象化的操作抽象成相应的数据进行传递。
2. Activity使用Intent进行系统功能操作,如打电话,发邮件、短信等,记得加上权限!
- 第一种方式:(Android官方推荐,仅去到拨号界面,类似于)
intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:" + phoneNumber)); startActivity(intent);
- 第二种方式:(直接拨打)
其实这就是一种Activity跳转方式,在当前Activity去调用系统自带的拨号程序中的拨号Activity,至于两种方式的不同,这个具体在下面会讲到。intent.setAction("android.intent.action.CALL"); intent.setData(Uri.parse("tel:" + phoneNumber)); startActivity(intent);
事实上,我所说的Activity使用Intent去调用系统功能操作,说白了就是通过Intent跳转到相应程序的Activity,中间还传递了相应的参数。
3. 使用Intent启动新的Activity
分为两种方式:显式Intent和隐式Intent
- 显式Intent:通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下,一般是在相同的应用程序内部实现的。
Intent intent = new Intent(MainActivity.this, SecondActivity.class); MainActivity.this.startActivity(intent);
- 隐式Intent:通过Intent Filter来实现的,它一般用在没有明确指出目标组件名称的前提下,一般是用于在不同应用程序之间。
AndroidMnifest.xml部分内容如下:Intent intent = new Intent(); intent.setAction("activity.second"); MainActivity.this.startActivity(intent);
<activity android:name="com.example.activity.SecondActivity" android:label="@string/app_name" > <intent-filter> <action android:name="activity.second" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
4. 使用Intent在Activity间传值
- 第一个Activity,传值端:
Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("str", "传过去的值");//(name, value) MainActivity.this.startActivity(intent);
- 第二个Activity,接收端:
Intent intent = getIntent( ); Bundle bundle = intent.getExtras(); String str = bundle.getString("str");
5. 使用Intent在Activity之间返回值
- 第一个Activity,接收端:
要接受返回的值需要复写方法:private final static int REQUEST_CODE = 1;//识别码 startActivityForResult(intent, REQUEST_CODE);//跳转Activity
方法中对code值进行判断并获取intent中bundle的键值。protected void onActivityResult(int requestCode, int resultCode, Intent data){}
- 第二个Activity,传值端:
Intent intent = new Intent(); intent.putExtra("back", "第二个Activity返回的值"); setResult(RESULT_CODE, intent); finish();//该方法结束当前Activity并返回调用它的Activity
6. Bundle 捆绑
Bundle类为Key-Value形式的键值对
Activity间的数据通讯可通过Bundle类实现(必须借助Intent类)
- 第一个Activity:传值端:
Intent intent = new Intent(); intent.setClass(MainActivity.this, SecondActivity.class); Bundle mBundle = new Bundle(); mBundle.putString("Data", "data from MainActivity");//压入数据 intent.putExtras(mBundle); startActivity(intent);
- 第二个Activity:接收端:
Bundle bundle = getIntent().getExtras();//得到传过来的bundle String data = bundle.getString("Data");//读出数据