14.1Activity的启动模式
14.1.1Android下的任务桟
Android系统中的任务栈,类似于一个容器,用于管理所有的Activity实例。在存放Activity时,满足“先进后出(First-In/Last-Out)”的原则。
14.1.2Activity的四种启动模式
Activity的启动模式有四种,分别是standard、singleTop、singleTask和singleInstance。
在AndroidManifest.xml中,可以通过标签的android:launchMode属性设置启动模式。
①standard标准模式
standard是Activity默认的启动模式,在不指定Activity启动模式的情况下,所有Activity使用的都是standard模式。
在standard模式下,每当启动一个新的Activity,它就会进入任务栈,并处于栈顶的位置,对于使用standard模式的Activity,每次启动都会创建一个新的实例。
②singleTop模式
singleTop启动模式与standard类似,不同的是,当启动的Activity已经位于栈顶时,则直接使用它,不再创建新的实例。
③singleTask模式
当Activity的启动模式为singleTask时,每次启动该Activity时,系统首先会检查栈中是否存在该Activity的实例,如果发现已经存在则直接使用该实例,并将当前Activity之上的所有Activity出栈,如果没有发现则创建一个新的实例。
④singlelnstance模式
singlelnstance模式加载Activity时,只会创建一个Activity实例,并且使用一个全新的任务桟来装载该Activity实例。
14.2在Activity中如何使用Intent
14.2.1Inter介绍
1)Intent中文翻译 为“意图”,它是Android程序中各个组件进行交互的一种重要方式,它不仅可以指定当前组件要执行的动作,还可以在不同组件之间进行数据传递。
2)Intent一般用于启动Activity、启动服务、发送广播等,承担了Android应用程序三大核心组件相互间的通信功能。
Intent。
3)Intent是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组
件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容
选择适当的组件来响应。
4)Intent启动Activity的方法有:
- startActivity(Intent intent)
- startActivityForResult(Intent intent,int code)
4.2.2对于向这三种组件发送intent有不同的机制
1)使用Context.startActivity() 或 Activity.startActivityForResult(),传入一个intent来启动一
个activity。使用 Activity.setResult(),传入一个intent来从activity中返回结果。
2)将intent对象传给Context.startService()来启动一个service或者传消息给一个运行的service。将intent对象传给 Context.bindService()来绑定一个service。
3)将intent对象传给 Context.sendBroadcast(),Context.sendOrderedBroadcast(),或者
Context.sendStickyBroadcast()等广播方法,则它们被传给 broadcast receiver
4.2.3Intent的相关属性
Intent由以下各个组成部分:
- component(组件):目的组件
Component属性明确指定Intent的目标组件的类名称。(属于直接Intent)
如果 component这个属性有指定的话,将直接使用它指定的组件。指定了这个属性以后,
Intent的其它所有属性都是可选的。
//创建一个意图对象
Intent intent = new Intent();
//创建组件,通过组件来响应
ComponentName component = new ComponentName(MainActivity.this, SecondActivity.class);
intent.setComponent(component);
startActivity(intent);
- action(动作):用来表现意图的行动
在Intent中,Action就是描述做、写等动作的,当你指明了一个Action,执行者就会依照
这个动作的指示,接受相关输入,表现对应行为,产生符合的输出。在Intent类中,定义了
一批量的动作,比如ACTION_VIEW,ACTION_PICK等, 基本涵盖了常用动作。加的动作
越多,越精确。
- category(类别):用来表现动作的类别
一个包含Intent额外信息的字符串,表示哪种类型的组件来处理这个Intent。任何数量的Category 描述都可以添加到Intent中,但是很多intent不需要category。
- data(数据):表示与动作要操纵的数据
- type(数据类型):对于data范例的描写一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。
- extras(扩展信息):扩展信息
Intent可以携带的额外 key-value 数据,你可以通过调用putExtra() 方法设置数据,每一个 key对应一个 value数据。你也可以通过创建 Bundle对象来存储所有数据,然后通过调用 putExtras() 方法来设置数据。
- Flags(标志位):期望这个意图的运行模式
14.3Activity中的数据传递
Intent不仅可以用来开启Activity,也可以在Activity之 间传递数据。在数据传递时,可以使用putExtra()方法将数据存储在Intent中。
14.3.1页面数据传输
1)直接发送
//发送端
String data = "Hello Activity02"
Intent intent = new Intent(this,Activity02.class);
//存放数据:key-value
intent.putExtra("extra_data",data); startActivity(intent);
//取数据端
Intent intent = getIntent();
//key
String data = = intent.getStringExtra("extra_data");
2)Bundle
Bundle bundle = new Bundle();
bundle.putString("name", "Linda");
Intent intent = new Intent(this,Activity02.class); intent.putExtra(bundle);
startActivity(intent);
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
String stuName = bundle.getString("name");
14.4Intent用法
- 调用拨号程序
// 调用拨打电话,给10010拨打电话
Uri uri = Uri.parse("tel:10010");
Intent intent = new Intent(Intent.ACTION_DIAL, uri);
startActivity(intent);
// 直接拨打电话,需要加上权限 <uses-permission id="android.permission.CALL_PHONE" />
Uri callUri = Uri.parse("tel:10010");
Intent intent = new Intent(Intent.ACTION_CALL, callUri);
- 发送短信或彩信
// 给10010发送内容为“Hello”的短信
Uri uri = Uri.parse("smsto:10010");
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
intent.putExtra("sms_body", "Hello");
startActivity(intent);
//发送彩信(相当于发送带附件的短信)
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra("sms_body", "Hello"); Uri uri =
Uri.parse("content://media/external/images/media/23");
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent.setType("image/png");
startActivity(intent);
- 通过浏览器打开网页
- 发送电子邮件
- 显示地图与路径规划
- 播放多媒体
- 选择图片
- 拍照
- 获取并剪切图片
- 打开手机应用市场
- 安装程序
- 卸载程序
- 进入设置界面