此刻,你应该静下心来,在阅读中思考。在思考中进步,读完本篇文章的你一定会有不一样的收获,请让我们共同进步!

核心内容

1、Activity数据交换

2、Activity中的任务栈

3、Activity查看任务

4、Activity启动模式

Activity数据交换

1、Activity之间的数据交换

传递基本类型数据(两种方式)

方式一:

//FirstActivity 传递数据
Intent intent = new Intent(FirstActivity.this,ScondActivity.class);
intent.putExtra("name","nate");
intent.putExtra("age",23);
startActivity(intent);
//ScondActivity 接收数据
Intent intent=getIntent();
if(intent!=null){
String name = intent.getStringExtra("name");
int age=intent.getIntExtra("age",0); // 第二个參数是默认值
}

方式二:通过bundle进行数据传递

Intent intent = new Intent(FirstActivity.this,ScondActivity.class);
Bundle bundle = new Bundle(); // 该类用作携带数据
bundle.putString("name","nate");
bundle.putInt("age",23);
intent.putExtras(bundle); // 附带上额外的数据
startActivity(intent);
// 接收数据(也可使用方式一相同能够接收数据)

Bundle bundle = this.getIntent().getExtras();
String name = bundle.getString("name");
int age = bundle.getInt("age");

传递一个对象数据(该实体对象实现了Serializable接口)

Intent intent = new Intent(ThreeActivity.this, FourActivity.class);
Person person = new Person(1, "小明", "北京");
Bundle bundle = new Bundle();
bundle.putSerializable("person", person);
intent.putExtras(bundle);
startActivity(intent);
Intent intent = getIntent();
if(intent !=null )
{
Person person = (Person)intent.getSerializableExtra("person");
textView.setText(person.toString());
}

传递Bitmap对象

Intent intent = new Intent(ThreeActivity.this, FourActivity.class);
Bundle bundle = new Bundle();
Bitmap bitmap = BitampFactory.decodeResource(getResoruces(),R.drawable.ic_launch);
bundler.putParcelable("bitmap",btimap);
intent.putExtras(bundle);
startActivity(intent);
Intent intent=getIntent();
if(intent!=null){
Bitmap bitmap=intent.getParcelableExtra("bitmap");
imageView.setImageBitmap(bitmap);
}

2、Activity传递大数据时候遇到的问题

通过bundle传递数据对数据的大小是有限制的。假设传递了过大的数据可能会抛出TransactionTooLargeException异常,解决的方法是降低bundle传输的数据量(bundle 传递数据大概要小于0.5兆)

模拟传递一个大数据:

Intent intent = new Intent(ThreeActivity.this, FourActivity.class);
Bundle bundle = new Bundle(); int[] data = new int[1024*1024*8]; //在java中一个int类型占4个字节,所以data的大小是32m
bundle.putintArray("name",data); intent.putExtras(bundle);
startActivity(intent);

传递Bitmapeasy遇到的问题(这里创建一个比較大的Bitmap)

Intent intent = new Intent(ThreeActivity.this, FourActivity.class);
Bundle bundle = new Bundle(); Bitmap bitmap = Bitmap.createBitmap(480, 120, Config.ARGB_888);
bundler.putParcelable("bitmap",btimap); intent.putExtras(bundle);
startActivity(intent);

传递以上两种较大的数据时都会出现错误。建议:在多个Activity传递Bitmap时尽量传一个小的Bitmap,千万别把一个原图的Bitmap进行传递否则可能出现故障。Bundler是负责底层跨进程的通信协议信息。

Activity中的任务栈

1、Task和BackStack概念解说

task(任务)就是activities的序列集合 (能够理解为一个应用中的所用Activity。当打开一个应用[APP]时系统就会创建一个任务。无论你在应用中打开多少个Activity这些Activity都属于同一个任务中) ,每个应用的启动都会创建一个task(任务)。任务能够跨进程间调用 (比方所一个应用中的Activity中有一个打电话的button,当点的button时调用的是系统的Activity界面,这两个界面全然属于两个进程中,通俗的讲就是一个应用中的Activity能够跳转到还有一个应用的Activity,但这两个Activity还属于同一任务(task)中。) 注:每个应用是处于不同的进程中。

back stack(后台任务栈)对activities进行一系列的管理、打开、关闭。

栈的特点是后进先出。

想具体了解Task和BackStack可查看goole的官方文档(值得一看)


为了更加了解一个任务能够写一个简单Demo进行測试(在一个Activity中打开一个新的Activity)

重要提示:在Manifest文件里给要新打开的Activity配置一个android:process属性,指定该属性后这个Activity就属于另外一个进程的Activity,就会在另外一个进程中创建该Activity。能够在上面两个Activity的onCreate方法中用Log日志打印一下当前Activity的task id使用getTaskid()方法。

两个提示演示样例代码例如以下:

<activity android:name=".NewActivity" android:process=":NewActivity"/>
// 在MainActivity的onCreate方法中加入
Log.i("Tag", "MainActivity taskId"+getTaskId()); // 在NewActivity的onCreate方法中加入
Log.i("Tag", "NewActivity taskId"+getTaskId());

写完后执行Demo,在MainActivity中点击button打开新的NewActivity。

切换到eclipse的DBMS界面能够查看到这两个Activity的进程id是不同的

在查看后台打印的Log他们的testId都是相同的所以他们是在同一个任务栈中

假设对任务(task)和后台任务栈(back stack)还有不理解的请查看官方文档的具体介绍。去看一下

2、使用adb命令查看Activity任务栈

在使用一个应用时我们可能会打开非常多的界面(Activity)而每个Activity都会加入到后台任务栈中,这时我们不知道当前应用在后台曾打开过多少个Activity,所以我们能够使用adb命令进行查看 :adb shell dumpsys activity

通过这个命令去查看当前后台有多少个Activity是比較方便的操作,当然这个命令还提供非常多的具体信息

Activity的四种启动模式(LaunchMode)

<action android:name=".Mactivity" android:launchMode="standard">

standard

默认模式。每次激活Activity时都会创建Activity实例,并放入任务栈中

singleTop

假设在任务的栈顶正好存在该Activity,就会重用该实例(会调用实例的onNewIntent()),否则就会创建新的实例放入栈顶(注:即使栈中已经存在该Activity的实例,仅仅要不在栈顶。都会创建实例)。

singleTask

假设在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被转移出栈,假设栈中不存在该演示样例,将会创建新的实例放入栈中。

singleInstance

在一个新栈中创建该Activity实例。并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,不论什么应用在激活该Activity时都会重用该栈中的实例(会调用实例的onNewIntent())。其效果相当于多个应用共享一个应用。无论谁激活该Activity都会进入同一个应用中。

能够写应用測试这几种模式然后使用在后台打印Log日志的方式和“上一节讲的查看后台Activity任务栈命令查看后台有多少Activity”

有不论什么疑问欢迎留言…

深入Activity的更多相关文章

  1. EventBus实现activity跟fragment交互数据

    最近老是听到技术群里面有人提出需求,activity跟fragment交互数据,或者从一个activity跳转到另外一个activity的fragment,所以我给大家介绍一个开源项目,EventBu ...

  2. Android—Service与Activity的交互

    service-Android的四大组件之一.人称"后台服务"指其本身的运行并不依赖于用户可视的UI界面 实际开发中我们经常需要service和activity之间可以相互传递数据 ...

  3. Android:Activity+Fragment及它们之间的数据交换.

    Android:Activity+Fragment及它们之间的数据交换 关于Fragment与Fragment.Activity通信的四种方式 比较好一点的Activity+Fragment及它们之间 ...

  4. Android中Activity处理返回结果的实现方式

    大家在网上购物时都有这样一个体验,在确认订单选择收货人以及地址时,会跳转页面到我们存入网站内的所有收货信息(包含收货地址,收货人)的界面供我们选择,一旦我们点击其中某一条信息,则会自动跳转到订单提交界 ...

  5. 报错:You need to use a Theme.AppCompat theme (or descendant) with this activity.

    学习 Activity 生命周期时希望通过 Dialog 主题测试 onPause() 和 onStop() 的区别,点击按钮跳转 Activity 时报错: E/AndroidRuntime: FA ...

  6. Android 旋转屏幕--处理Activity与AsyncTask的最佳解决方案

    一.概述 运行时变更就是设备在运行时发生变化(例如屏幕旋转.键盘可用性及语言).发生这些变化,Android会重启Activity,这时就需要保存activity的状态及与activity相关的任务, ...

  7. Activity之概览屏幕(Overview Screen)

    概览屏幕 概览屏幕(也称为最新动态屏幕.最近任务列表或最近使用的应用)是一个系统级别 UI,其中列出了最近访问过的 Activity 和任务. 用户可以浏览该列表并选择要恢复的任务,也可以通过滑动清除 ...

  8. Android开发学习—— 创建项目时,不是继承activity,而是继承ActionBarActivity

    对于我们新建android项目时, 会 继承ActionBarActivity. 我们在新建项目时, 最小需求的sdk 选择 4.0以上版本.这样 新建的android项目就是继承activity了!

  9. Android中Fragment与Activity之间的交互(两种实现方式)

    (未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如 ...

  10. Android中Activity的四大启动模式实验简述

    作为Android四大组件之一,Activity可以说是最基本也是最常见的组件,它提供了一个显示界面,从而实现与用户的交互,作为初学者,必须熟练掌握.今天我们就来通过实验演示,来帮助大家理解Activ ...

随机推荐

  1. Ubuntu 16.04安装RabbitMQ(单机版)

    说明: 1.如果是做RabbitMQ方面的开发时,建议先不要了解集群的安装和部署,先安装一个单机版之后,尽快的熟悉里面的功能和特性.毕竟单机版支持的QPS相当的高.同样,集群方式也没有想象中的多点复制 ...

  2. ylbtech-LanguageSamples-NamedAndOptional(命名和可选参数)

    ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-NamedAndOptional(命名和可选参数) 1.A,示例(Sample) 返回顶 ...

  3. iOS:LKDBHelper实体对象映射数据库-第三方框架(在FMDB的基础上进行二次封装)

    一 插件简介: 其github地址:https://github.com/li6185377/LKDBHelper-SQLite-ORM 全面支持 NSArray,NSDictionary, Mode ...

  4. Storm应用系列之——集成Kafka

    本文系原创系列,转载请注明. 原帖地址:http://blog.csdn.net/xeseo 前言 在前面Storm系列之——基本概念一文中,提到过Storm的Spout应该是源源不断的取数据,不能间 ...

  5. Vue-router路由基础总结(二)

    一.命名路由 有时我们通过一个名称来标识一个路由显得更方便一些,特别是在链接一个路由,或者是执行一些跳转的时候.你可以在创建 Router 实例的时候,在 routes 配置中给某个路由设置名称. 我 ...

  6. phpmyadmin4.1.4安装配置教程

    phpMyAdmin 就是一种 MySQL 数据库的管理工具,安装该工具后,即可以通过 web 形式直接管理 MySQL 数据,而不需要通过执行系统命令来管理,非常适合对数据库操作命令不熟悉的数据库管 ...

  7. weblogic8.1 登陆5 ip 限制

    weblogic8.1  5 ip 限制 报错信息如图所示: 解决办法:此weblogic 未破解,去网上下载破解包,然后放到 copy weblogic_sp.jar to $WL_HOME/ser ...

  8. iOS7重磅推新--不断尝试与重新设计的过程

    来源:GBin1.com iOS7重磅推新--不断尝试与重新设计的过程 或许你心里已经有了关于iPhone最新操作系统的评价,可能你喜欢它,也可能不喜欢,事实上大多数设计者不喜欢.设计界似乎一致认为I ...

  9. list/tuple/dict/set

    一.list(列表) 内置类型,长度可变的有序集合,索引从0开始,索引为负数是标识从右开始取,最右边第一个是-1,以此类推.里面的元素可以是不同类型的. 1.定义:a = [] #空列表 2.获取长度 ...

  10. java编写Loadrunner脚本

    web.set_max_html_param_len("1000000"); lr.start_transaction("red_envelop"); web. ...