重新认识Activity

转载 2016年08月29日 16:13:55

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实例。

未完待续。。。。。

重新认识Activity生命周期方法

取决于你应用的复杂度,可能不必实现每个周期方法,但是,理解每一个方法能保证你的应用能按照使用者的期望来运行。       正确并合适的实现周期方法有以下好处:           1、当有...
  • jiankun1987
  • jiankun1987
  • 2015年04月22日 15:02
  • 229

带你重新认识Activity的方方面面

一、Activity的生命周期    Activity中定义了七个回调方法,覆盖了活动生命周期的每一个环节。    onCreate():它在活动第一次创建时被调用,在此方法中完成活动的初始化操作,如...
  • xiaoyantan
  • xiaoyantan
  • 2016年11月07日 18:32
  • 299

重新认识Android Activity的生命周期

http://peiquan.blog.51cto.com/7518552/1277373 一、基础  看了官方文档之后,自己领悟过来接着翻译的,由于第一次的原因,技术水品...
  • sirnuo
  • sirnuo
  • 2014年03月13日 12:32
  • 5176

重新认识synchronized(上)

synchronized在JDK5之前一直被称为重量级锁,是一个较为鸡肋的设计,而在JDK6对synchronized内在机制进行了大量显著的优化,加入了CAS,轻量级锁和偏向锁的功能,性能上已经跟R...
  • hehe198504
  • hehe198504
  • 2016年11月06日 15:35
  • 194

重新认识java(七) ---- final 关键字

你总以为你会了,其实你只是一知半解。 final 关键字概览final关键字可用于声明属性、方法、参数和类,分别表示属性不可变、方法不可覆盖、参数不可变和类不可以继承。我们来分别看看它的用法。 f...
  • qq_31655965
  • qq_31655965
  • 2017年01月31日 22:20
  • 2824

深入分析java线程池的实现原理

转自占小狼 线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池对线程进行统一分配、调优和监控,有以下好处: 1、降低资源消耗; 2、提高响应速度; ...
  • yajlv
  • yajlv
  • 2017年06月27日 09:55
  • 279

重新认识java(二) ---- 面向对象之封装!

如果你认为封装仅仅是private + getter and setter,那你就大错特错了!
  • qq_31655965
  • qq_31655965
  • 2016年11月28日 19:16
  • 2552

从Framework源码中看activity ,重新认识activity

一个apk 启动activity 流程从源码看 从Framwork 层知道一个apk 均属于客户端 启动,必须经过AcivityThread 类为入口执行他所在的main 方法 public ...
  • qq_30519365
  • qq_30519365
  • 2017年02月12日 15:43
  • 226

重新认识java(九) ---- 内部类

注意注意!!!前排提示!!!本篇文章过长,最好收藏下来慢慢看,如果你之前对内部类不是很熟悉,一次性看完,大概你会懵逼。。。...
  • qq_31655965
  • qq_31655965
  • 2017年02月11日 22:34
  • 2560

重新认识自己

重新认识自己 作为一个华科的学生,抱着锻炼自己的想法去参加启明学院Dian团队招新,没想到第一轮的面试就被刷下,今天,2015年10月22日,在昨天突然收到Dian团队招新人员的短信,说今晚10点启...
  • xiaokedou_hust
  • xiaokedou_hust
  • 2015年10月22日 23:09
  • 195
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:重新认识Activity
举报原因:
原因补充:

(最多只允许输入30个字)