第三章:Activity(2)

3.2Activity的启动模式
3.2.1Android下的任务栈
Android系统中的任务栈,类似于一个容器,用于管理所有的Activity实例。在存放Avtiviy时,满足“先进后出(First-In/Last-Out)”的原则。
在这里插入图片描述
3.2.2Activity的四种启动模式
Activity的启动模式有四种,分别是standard、singleTop、singleTask和singlelnstance。
在AndroidManifest.xml中,可以通过标签的android:launchMode属性设置启动模式。

  1. standard标准模式
    standard是Activity默认的启动模式,在不指定Activity启动模式的情况下,所有Activity使用的都是standard模式。
    在standard模式下,每当启动一个新的Activity,它就会进入任务栈,并处于栈顶的位置,对于使用standard模式的Activity,每次启动都会创建一个新的实例。
    在这里插入图片描述
  2. singleTop模式
    singleTop启动模式与standard类似,不同的是,当启动的Activity已经位于栈顶时,则直接使用它,不再创建新的实例。
    在这里插入图片描述
  3. 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由以下各个组成部分

  1. component(组件):目的组件
    component属性明确指定Intent的目标组件的类名称。(属于直接Intent),如果component这个属性有指定的话,将直接使用它指定的组件。指定了这个属性以后,Intent的其他所有属性都是可选的。

     //创建一个意图对象
     Intent intent=new Intent();
     //创建组件,通过组件来响应
     ComponentName component=new ComponentName(MainActivity.this,SecondActivity.class);
     intent.setComponent(component);
     startActivity(intent);
    
  2. action(动作):用来表现意图的行动。
    在Intent中,Action就是描述做、写等动作的,当你指明了一个Action,执行者就会依照这个动作的指示,接受相关输入,表现对应行为,产生符合的输出。在Intent类中,定义了一批量的动作,比如ACTION_VIEW、ACTION_PICK等,基本涵盖了常用动作。加的动作越多,越精确。
    在这里插入图片描述

  3. category(类别):用来表现动作的类别
    一个包含Intent额外信息的字符串,表示哪种类型的组件来处理这个Intent。任何数量的Category描述都可以添加到intent中,但是很多intent不需要category。
    在这里插入图片描述

  4. data(数据):表示与动作要操纵的数据

  5. type(数据类型):对于data范例的描写一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。

  6. extra(扩展信息):扩展信息;Intent可以携带的额外key-value数据,你可以通过调用putExtra()方法设置数据,每一个key对应一个value数据。你也可以通过创建Bundle对象来存储所有数据,然后通过调用putExtras()方法来设置数据。在这里插入图片描述

  7. Flags(标志位):期望这个意图的运行模式
    在这里插入图片描述

  8. 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);
    
  9. 显示地图与路径规划

    //打开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);  
    
  10. 播放多媒体

    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);
    
  11. 选择图片

    Intent intent=new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("image/*");
    startActivityForResult(intent,2);
    
  12. 拍照

    //打开拍照程序
    Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(intent,1);
    //取出照片数据
    Bundle extras=intent.getExtras();
    Bitmap bitmap=(Bitmap)extras.get("data");
    
  13. 获取并剪切图片

    //获取并剪切图片
    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);
    
  14. 安装程序

    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");
    
  15. 卸载程序

    Uri uri=Uri.parse("package:"+packageName);
    Intent intent=new Intent(Intent.ACTION_DELETE,uri);
    startActivity(intent);
    
  16. 进入设置界面

//进入系统设置界面
Intent intent=new Intent(android.provider.settings.ACTION_SETTINGS);
startActivity(intent);
  1. 打开手机应用市场

    //打开手机应用市场,直接进入该程序的详细界页面
    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");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值