• 深入Activity


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

    核心内容

    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”

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

  • 相关阅读:
    转 Python学习(九)
    转 Python学习(八)
    转 Python学习(七)
    转 Python学习(六)
    转 Python学习(五)
    转 Python学习(四)
    转Python学习(三)
    转Python学习(一)
    面向对象第三章(向上造型、重写、重载)
    面向对象第一章(成员变量、局部变量、重载)
  • 原文地址:https://www.cnblogs.com/jhcelue/p/7289450.html
Copyright © 2020-2023  润新知