重新认识Activity

1.activity的启动方式
分为直接起动和匿名启动。

  • 直接启动
    一般用于知道要启动activity的名字
    Intent intent = new Intent(MainActivity.this,SecondActivity.class);
    startActivity(intent);

    或者
 Intent intent = new Intent();
 ComponentName componentName = new ComponentName(MainActivity.this, SecondActivity.class);
 intent.setComponent(componentName);
 startActivity(intent);
  • 匿名方式
    一般不知道要启动的activity的具体名字,比如想要启动微信某个界面的activity,就得用action去启动具体的activity。或者启动系统的activity。
  Intent intent = new Intent();
   intent.setAction("www.baidu.com");
   startActivity(intent);

之后在mainfest.xml文件里进行注册,如下图:
这里写图片描述
在标签内的action 标签内加入想要打开的内容
标签属性用于指定当前动作(action)的指定环境

- 一些启动系统activity的方法

 Intent intent = new Intent();
 intent.setAction(Intent.ACTION_VIEW);   //启动默认浏览器
 Uri url =Uri.parse("www.bai.com") ;
 intent.setData(url);
 startActivity(intent);
intent.setAction(Intent.ACTION_GET_CONTENT);//启动系统相册
intent.setType("image/*");
intent.setAction(Intent.ACTION_SEND); //发送短信
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT," hello world");
 intent.setAction(Intent.ACTION_VIEW); //启动电话界面
  Uri url =Uri.parse("tel:1378191") ;
  intent.setData(url);

2.Activity 之间的数据交换
activity之间传递的数据类型主要有三种:基础数据、javabean类型、bitmap 类型

  • 基础数据类型
    在传递基础数据的时候最常用的是intent,intent可以传递8种基础数据,并且可以传递bundle ,bundle也是一种键值对形式的存储

  • javabean类型
    如果传递的信息量过大,上一种方法无法满足的时候,可以将传递的信息封装成类,进行传递,或者本身就要传递某个类的实例。首先需要将所传递的对象所属的类实现Serializable接口. 之后在传递的过程中调用bundle的putserializable()方法把所要传递的对象放进去,再将bundle实例对象放进intent实例对象中。例:

Intent intent = new Intent(MainActivity.this,SecondActivity.class);
Person person = new Person(24,"小芳","女"); //person类已实现Serializable接口
Bundle bundle = new Bundle();
bundle.putSerializable("person",person);
intent.putExtras(bundle);

取数据时,调用intent的getSerializableExtra()方法即可

  • bitmap类型
 Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher);
 bundle.putParcelable("bitmap",bitmap);
 intent.putExtras(bundle);

注意:在传送数据的时候,bundle只能传递大概小于0.5M容量的数据,传递图片的时候尽量不要将原图传递过去,否怎会抛出TransanctionToolargeException .

3.Activity 的 Task 和启动模式
Task是一个存在于Framework层的概念
Task,简单的说,就是一组以栈的模式聚集在一起的Activity组件集合。它们有潜在的前后驱关联,新加入的Activity组件,位于栈顶,并仅有在栈顶的Activity,才会有机会与用户进行交互。而当栈顶的 Activity完成使命退出的时候,Task会将其退栈,并让下一个将跑到栈顶的Activity来于用户面对面,直至栈中再无更多 Activity,Task结束.

LaunchMoude(启动模式):

  • standrd(默认启动方式)

    标准启动模式,也是activity的默认启动模式。在这种模式下启动的activity可以被多次实例化,即在同 一个任务中可以存在多个activity的实例,每个实例都会处理一个Intent对象。如果Activity A的启动模式为standard,并且A已经启动,在A中再次启动Activity A,即调用startActivity(new Intent(this,A.class)),会在A的上面再次启动一个A的实例,即当前的桟中的状态为A–>A。

  • singleTop

    如果一个以singleTop模式启动的activity的实例已经存在于任务桟的桟顶,那么再启动这个Activity时,不会创建新的实例,而是重用位于栈顶的那个实例,并且会调用该实例的onNewIntent()方法将Intent对象传递到这个实例中。举例来说,如果A的启动模式为singleTop,并且A的一个实例已经存在于栈顶中,那么再调用startAct ivity(new Intent(this,A.class))启动A时,不会再次创建A的实例,而是重用原来的实例,并且调用原来实例的onNewIntent()方法。这是任务桟中还是这有一个A的实例。
    如果以singleTop模式启动的activity的一个实例已经存在与任务桟中,但是不在桟顶,那么它的行为和standard模式相同,也会创建多个实例。

  • singleTask

    谷歌的官方文档上称,如果一个activity的启动模式为singleTask,那么系统总会在一个新任务的最底部(root)启动这个activity,并且被这个activity启动的其他activity会和该activity同时存在于这个新任务中。如果系统中已经存在这样的一个activity则会重用这个实例,并且调用他的onNewIntent()方法。即,这样的一个activity在系统中只会存在一个实例。

    其实官方文档中的这种说法并不准确,启动模式为singleTask的activity并不会总是开启一个新的任务。详情请参考 解开Android应用程序组件Activity的”singleTask”之谜,在本文后面也会通过示例来进行验证。

  • singleInstance
    总是在新的任务中开启,并且这个新的任务中有且只有这一个实例,也就是说被该实例启动的其他activity会自动运行于另一个任务中。当再次启动该activity的实例时,会重用已存在的任务和实例。并且会调用这个实例的onNewIntent()方法,将Intent实例传递到该实例中。和singleTask相同,同一时刻在系统中只会存在一个这样的Activity实例。

未完待续。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值