3.2Activity的启动模式
3.2.1Android下的任务栈
Android系统中的任务栈,类似于一个容器,用于管理所有的Activity实例。在存放Avtiviy时,满足“先进后出(First-In/Last-Out)”的原则。
3.2.2Activity的四种启动模式
Activity的启动模式有四种,分别是standard、singleTop、singleTask和singlelnstance。
在AndroidManifest.xml中,可以通过标签的android:launchMode属性设置启动模式。
- standard标准模式
standard是Activity默认的启动模式,在不指定Activity启动模式的情况下,所有Activity使用的都是standard模式。
在standard模式下,每当启动一个新的Activity,它就会进入任务栈,并处于栈顶的位置,对于使用standard模式的Activity,每次启动都会创建一个新的实例。
- singleTop模式
singleTop启动模式与standard类似,不同的是,当启动的Activity已经位于栈顶时,则直接使用它,不再创建新的实例。
- singlelnstance模式
singlelnstance模式加载Activity时,只会创建一个Activity实例,并且会使用一个全新的任务栈来装载该Activity实例。
3.2Intent
1.Intent的概念:
Android中提供了Intent机制来协助应用间的交互与通讯,或者采用更准确的说法是,Intent不仅可用于应用程序之间,也可用于应用程序内部的activity,service和broadcast receiver之间的交互。Intent这个英语单词的本意是“目的、意向、意图”。
Intent是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来响应。
2.对于向这三种组件发送intent有不同的机制:
- 使用Context.startActivity()或Activity.startActivityForResult(),传入一个intent来启动一个activity。使用Activity.setResult(),传入一个intent来从activity中返回结果。
- 将intent对象传给Context.startService()来启动一个service或者传消息给一个运行的service。将intent对象传给Context.bindSrevice()来绑定一个service。
- 将intent对象传给Context.sendBroadcast(),Context.sendOrderedBroadcast(),或者Context.sendStickyBroadcast()等广播方法,则它们被传给broadcast receiver.
3.Intent的相关属性
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的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。
-
extra(扩展信息):扩展信息;Intent可以携带的额外key-value数据,你可以通过调用putExtra()方法设置数据,每一个key对应一个value数据。你也可以通过创建Bundle对象来存储所有数据,然后通过调用putExtras()方法来设置数据。
-
Flags(标志位):期望这个意图的运行模式
-
Intent用法
调用拨号程序//调用拨打电话,给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.setType("image/png"); startActivity(intent);
通过浏览器打开网页
//打开百度主页 Uri uri=uri.parse("http://www.baidu.com"); Intent intent=new Intent(Intent.ACTION_VIEW,uri); startActivity(intent);
发送电子邮件
//给someone@domain.com发邮件 Uri uri=uri.parse("mailto:someone@domain.com"); Intent intent=new Intent(Intent.ACTION_SENDTO,uri); startActivity(intent); //给someone@domain.com发邮件发送内容为"Hello"的邮件 Intent intent=new Intent(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_EMAIL,"someone@domain.com"); intent.putExtra(Intent.EXTRA_SUBJECT,"Subject"); intent.putExtra(Intent.EXTRA_TEXT,"Hello"); intent.setType("text/plain"); startActivity(intent); //给多人发邮件 Intent intent=new Intent(Intent.ACTION_SEND); String[]tos={"1@abc.com","2@abc.com"};//收件人 String[]ccs={"3@abc.com","4@abc.com"};//抄送 String[]bccs={"5@abc.com","6@abc.com"};//密送 intent.putExtra(Intent.EXTRA_EMAIL,tos); intent.putExtra(Intent.EXTRA_CC,ccs); intent.putExtra(Intent.EXTRA_BCC,bccs); intent.putExtra(Intent.EXTRA_SUBJECT,"subject"); intent.putExtra(Intent.EXTRA_TEXT,"Hello"); intent.setType("message/rfc822"); startActivity(intent);
-
显示地图与路径规划
//打开Google地图中国北京位置(北纬39.9,东经116.3) Uri uri=uri.parse("geo:39.9,116.3"); Intent intent=new Intent(Intent.ACTION_VIEW,uri); startActivity(intent); //路径规划,从北京某地( 北纬39.9,东经116.3)到上海某地(北纬31.2,东经121.4) Uri uri=uri.parse("http://maps.google.com/maps?f=d&s addr=39.9 116.3&daddr=31.2 121.4"); Intent intent=new Intent(Intent.ACTION_VIEW,uri); startActivity(intent);
-
播放多媒体
Intent intent=new Intent(Intent.ACTION_VIEW); Uri uri=uri.parse("file://sdcard/foo.mp3"); intent.setDataAndType(uri,"audio/mp3"); startActivity(intent); Uri uri=uri.withAppendedPath(MadiaStore.Audio.Media.INTERNAL_CONTENT_URI,"1"); Intent intent=new Intent(Intent.ACTION_VIEW,uri); startActivity(intent);
-
选择图片
Intent intent=new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); startActivityForResult(intent,2);
-
拍照
//打开拍照程序 Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent,1); //取出照片数据 Bundle extras=intent.getExtras(); Bitmap bitmap=(Bitmap)extras.get("data");
-
获取并剪切图片
//获取并剪切图片 Intent intent=new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); intent.putExtra("crop","true");//开启剪切 intent.putExtra("aspectX",1);//剪切的宽高比为1:2 intent.putExtra("aspectY",2); intent.putExtra("outputX",20);//保存图片的宽和高 intent.putExtra("outputY",40); intent.putExtra("output",Uri.fromFile(new File("/mnt/sdcard/temp")));//保存路径 intent.putExtra("outputFormat","JPEG");//返回格式 startActivityForResult(intent,0);
-
安装程序
String fileName=Environment.getExternalStorageDirectory()+"/myApp.apk"; Intent intent=new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(fileName)),"application/vnd.android.package-archive");
-
卸载程序
Uri uri=Uri.parse("package:"+packageName); Intent intent=new Intent(Intent.ACTION_DELETE,uri); startActivity(intent);
-
进入设置界面
//进入系统设置界面
Intent intent=new Intent(android.provider.settings.ACTION_SETTINGS);
startActivity(intent);
-
打开手机应用市场
//打开手机应用市场,直接进入该程序的详细界页面 Uri uri=uri.parse("market://details?id="+packageName); Intent intent=new Intent(Intent.ACTION_VIEW,uri); startActivity(intent);
3.4Activity中的数据传递
3.4.1数据传递方式
Intent不仅可以用来开启Activity,也可以在Activity之间传递数据。在数据传递时,可以使用putExtra()方法将数据存储在Intent中。
String data="Hello Activity02";
Intent intent=new Intent(this,Activity02.class);
intent.putExtra("extra_data",data);
startActivity(intent);
将数据从Activity02中取出
Intent intent=getIntent();
String data==intent.getStringExtra("extra_data");
putExtra()不仅可以传递基本类型数据,还可以传递Bundle对象。
Bundle bundle=new Bundle();
bundle.putString("name","Linda");
Intent intent=new Intent(this,Activity02.class);
intent.putExtra(bundle);
startActivity(intent);
将数据从Activity02中取出
Intent intent=getIntent();
Bundle bundle=intent.getExtras();
String stuName=bundle.getString("name");