Activity总结:

  1. Activity的顶层View是DecorView,而我们在onCreate函数中通过setContentView设置的View只不过是这个DecorView的一部分罢了。DecorView是一个FrameLayout类型的ViewGroup.
  2. Activity和UI有关,它包含一个PhoneWindow和LocalWindowManger对象。这两个对象控制整个Activity的显示。
  3. LocalWindowManger使用WindowMangerImpl作为最终的处理对象(Proxy模式)这个WindowMangerImpl对象有一个ViewRoot对象。
  4. ViewRoot实现了VIewParent接口,他有两个重要成员变量,一个是mView,他指向Activity顶层UI单元的DecorVIew,另一个是mSurface,这个Surface包含了一个Canvas。ViewRoot还通过Binder系统和WIndowManagerService进性跨进程的交互。
  5. ViewRoot能处理Handler的消息,Activity的现实就是由ViewRoot在他的performTravelsals函数中完成的。
  6. 整个Activity的绘画流程就是从mSurface中lock一块Canvas,然后交个mView去自由发挥画画的才能,最后unlockCanvasAndPOst释放这块Canvas。
  7. Service Activity本质上都是BInder的实现。 

概括的说就是Activity包括真实显示的窗口PhoneWIndow和在窗口中作画的人LocalWIndowManger,而作画的人手上有两个东西一个是存放画布的msurface,另一个就是作画的笔mview,客户端通过setContentView告诉画家他想要画的内容,然后画家根据客户的要求进性再创作(因为我们通过SetVontentVIew设置的view只不过是DecorView的一部分罢了)。当然画家还能和大自然保持沟通就是Binder机制。内部线程之间的沟通更是不可少所以能处理Handler的消息。一个Activey作为一个进程和所有的其他进程一样都有内部的通信机制和外部的通信机制,只是就Activity而言,内部的Handler机制因为应用更频繁所以被着重提出来了。

Activity分析:

  1. Activity的作画者ViewRoot的画布msurface是在哪里创建的哪?我们知道java世界有一个名为system_service的进程,这里管理者很多核心的管理者WindowMangerServer, PowerManagerServer,我们之前在从linux看android之二--java世界的盘古女娲里说过system_service维护着很多的java世界初始时候的核心服务。而surface其是在system_service进性的WindowMangerService里出生的。WMS(WindowMangerService)首先创建一个SurfaceComposerClent对象,然后调用SurfaceComposerCilent对象的createSurface得到一个SurfaceControl对象。最后是通过SufaceControl对象的writeToPacrel把surface相关的重要参数打包到邮包Parcel中。通过Binder机制邮寄到某个Activity进程里,之后就由Activity来初始化mSurface并lock画布作画和取消画布了。
    getSystemService("")  //Android在Activity中可以直接调用的这个方法获取管理对象就是system_service这个进程

  2. ViewRoot还有什么特征哪?ViewRoot是View试图体系的根。每个PhoneWidow都有一个ViewRoot,他的作用就是处理layout和view试图体系的绘制工作。所谓视图体系包括views和viewGroups,另外所有的View类都属于视图体系,view体系是要通过draw来画出来的。viewRoot就是用来draw他们的,但是ViewRoot本身没有Draw的能力,需要借助别人的方式,至少是必须经过viewroot的管理才能draw。viewroot的所有view都同属于一个画布就是Surface lock住的那个画布。画布里存放绘画结果的是bitmap,可以从字面理解这就是一个存放bit数据的map集合。所谓的绘画就是更改这个map集合的数据。viewRoot的作用就是根据view视图的描述,在指定的内存(就是surface lock住的那块区域)中产生一个具体的bitmap集合,然后在PhoneWIndow中根据bitmap渲染效果。
  3. 一个Activity就是一个进程。一位这个进程的作用更多的就是在于在界面上画出一个节目并完成和页面的交互。我分俩个方面来分析一下Activity这个进程和其他进程之间的通信就是IPC1.如果不考虑客户用Activity实现业务逻辑时候的IPC,只是分析不实现业务逻辑似乎的IPC,主要是首先在ViewRoot创建surface的时候,为了创建一个画布,这时候创建画布就要一下画布的主题等信息为了保持一个主题,所有的Activity必须继承自一个相同的主题风格。这个相同的主题风格就是由WMS来管理的,WMS会根据读取到的主题等信息,在自己的进程(也就是system_service)进程里把这些信息打包到Parcel中。当Activity向SystemService请求与WMS通讯建立服务连接的时候,systemService就会查询到WMS的引用返回给Activity,并且WMS还会回调Activity的onCreate方法,并且发送过来一些有用的信息在Bundle中。并且在这个过程中完成把Surface的邮包Parcel发送过来,从而直接为Activity分配了画布信息。由文章开始的总结我们知道我们通过setContentViews设置的view是DecorView的一部分,而Decorview就是RootView的一个重要的成员变量(viewRoot的成员变量mView指向的就是DecorView),如果onCreate函数执行的时候没有根据surface打包数据创建了画布这画界面等的操作就没法进性了。我们在Activity编程的大部分时候都是工作在onCreate函数下的。
  4. setContextView可以直接就用R.layout也可以用InflateLayout
package com.example.uridemo4;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle; public class ActivityTest extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {#Bundle是WMS启动Activity的时候传过来的
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent =new Intent(this.getApplicationContext(), SQLiteActivity.class);
startActivity(intent);
} }

Activity功能测试代码:

package com.example.testactivity;

import com.example.testactivity.R;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; public class FirstActivity extends Activity{ @Override
protected void onCreate(Bundle savedInstanceState) {
/**
1.所有的Activity都是有WindowManagerService 创建的。Activity需要启动的时候必须先与WMS建立连接。但是在Android中并不是 Activity直接去找WMS而是去找system_service,
由system_service找到WMS再通知WMS,由WMS 启动Activity的Oncreate方法,所以savedInstanceState引用时WMS传过来的数据。正因为如此FirstActivity启动SecondActivity 的时候
传给SecondActivity的数据不能从Bundle总获得之能从Intent中获得。
2.WMS同时传过来了ViewRoot的surface Parcel.
**/
super.onCreate(savedInstanceState); setContentView(R.layout.activity_first);//方式1:可以直接通过setContentView直接在viewRoot的mView中添加view Button button =(Button)findViewById(R.id.firstbutton);
button.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent =new Intent(FirstActivity.this, SecondActivity.class);
Bundle bundle=new Bundle();
bundle.putString("test", "FirstActivity Bundle传值");
intent.putExtras(bundle);
startActivity(intent); }
}); } }

 

package com.example.testactivity;

import com.example.testactivity.R;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.TextView; public class SecondActivity extends Activity {
private Button button;
private TextView textView; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState); // String test1=savedInstanceState.getString("test");
// if(test1==null){
// test1="null";
// }
if(savedInstanceState==null){ Log.d("sendcondActivity 1", "null");//运行结果输出为null 说明这个Bundle是WMS的Bundle 不是FirstActivity包装的Bundle。
} Bundle bundle =getIntent().getExtras();
String test2=bundle.getString("test");
Log.d("secondActivity 2", test2);//这里获得的数据就是FristActivity放入的值
/***
* 1.事实上每个activity 都有一个唯一的Intent 和Activity类对应。并且整也是因为Intent还能用来开启新的Activity所以这是 Activity之间通讯很重要的方法
* 2.好比所有的Intent都保存在内存中,他们可以通过intent来唯一识别一个INtent intent如同数据库建表时候的主键 当然还有分类信息(Action catogory等信息)
*
*
*/ // 第二种方式添加View到RootView 用LayoutInfalter也是system_service提供的服务。
LayoutInflater layoutInflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view =layoutInflater.inflate(R.layout.activity_second, null);
button =(Button)view.findViewById(R.id.secondbutton);
button.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
textView.setText("SecondeActivity点击了按钮"); }
});
textView=(TextView)view.findViewById(R.id.secondtextview);
setContentView(view);//这是通过SetCOntentView来吧view试图加载到viewroot上
} }

 

代码下载:TestActivity

拓展阅读:深入理解Android

Android之Activity的更多相关文章

  1. Android中Activity的启动模式

    简介 Android中的活动启动方式分为4种:standard, singleTop, singleTask, singleInstance.可以在AndroidManifest.xml中通过给< ...

  2. Android之Activity的生命周期

    PS:写一发关于Activity的生命周期,也算是面试的重点内容. 学习内容: 1.Activity的生命周期 2.面对多种情况的时候Activity的生命周期 3.onSaveInstanceSta ...

  3. android开发------Activity生命周期

    这几天工作比较忙,基本没有什么时间更新播客了. 趁着今晚有点时间,我们来简单说一下什么是Activity生命周期和它们各阶段的特征 什么是生命周期 在还没有接触android开发的时候,听到有人说Ac ...

  4. Android课程---Activity中保存和恢复用户状态

    onSaveInstanceState 保存 在暂停之后和保存之前调用 onRestoreInstanceState 恢复 再启动之后和显示之前调用 package com.example.chens ...

  5. Android课程---Activity 的生命周期

    activity类处于android.app包中,继承体系如下: 1.java.lang.Object 2.android.content.Context 3.android.app.Applicat ...

  6. Android课程---Activity的创建

    一.为了创建一个新的Activity,你需要继承Activity类,定义UI,实现功能.新的Activity的最基本的框架代码如下所示: package com.paad.myapplication; ...

  7. Android将Activity 打 jar包 (解决资源文件不能打包的问题)

    转载地址:http://blog.csdn.net/xiaanming/article/details/9257853 最近有一个需要,我们公司做了一个apk客户端,然后其他的公司可以根据自己的需要来 ...

  8. Android之activity中新建控件

    了解了5大布局,我们会发现这些布局都是静态的,如何让系统自动生成控件呢?这就需要activity来帮忙了 今天我们讲的就是用activity新建布局 用案例来说吧! 实现一个输入行和列自动生成表格并生 ...

  9. Android之activity初讲

    前天我们已经成功创建了第一个Android项目,如果我要把软件推荐给我的第一个用户,毫无疑问是从界面开始介绍.因为即使你的程序算法再高效,架构再出色,用户根本不会在乎这些,他们一开始只会对看到的东西感 ...

  10. Android的Activity屏幕切换动画(一)-左右滑动切换

    (国内知名Android开发论坛eoe开发者社区推荐:http://www.eoeandroid.com/) Android的Activity屏幕切换动画(一)-左右滑动切换 在Android开发过程 ...

随机推荐

  1. memcached的认识

    <?php /* memcached概念: Memcached是一个免费开源的,高性能的,具有分布式对象的缓存系统,它可以用来保存一些经常存取的对象或数据,保存的数据像一张巨大的HASH表,该表 ...

  2. Mybatis实例教程整体说明

    什么是mybatisMyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML或 ...

  3. Linux nohup 后台运行命令

    有一些爬虫的程序需要在后台运行,所以简单总结了一下nohup 的一些用法 基本命令:nohup command  $; 运行之后出现nohup: ignoring input and appendin ...

  4. lintcode-110-最小路径和

    110-最小路径和 给定一个只含非负整数的m*n网格,找到一条从左上角到右下角的可以使数字和最小的路径. 注意事项 你在同一时间只能向下或者向右移动一步 样例 标签 动态规划 思路 使用动态规划,用二 ...

  5. PHPExcel 导出包含图片excel

    <?php // 这里用的PHPExcel版本号为1.8.0 // 下载地址https://github.com/PHPOffice/PHPExcel 下载ZIP压缩包 // 下载后将Class ...

  6. 【EasyNetQ】- 发布确认

    默认的AMQP发布不是事务性的,并不保证您的消息实际到达代理.AMQP确实指定了事务发布,但是使用RabbitMQ它非常慢,我们还没有通过EasyNetQ API支持它.对于高性能保证交付,建议您使用 ...

  7. 弹框中的elment-form在弹框重新打开后,怎么初始化验证信息

    如果弹框关闭前有错误提示,弹框重新打开,由于没重新刷新页面,该错误还是存在.... 解决办法:弹框中的内容写成一个组件,prop接收父元素弹框的状态,并监听且reset表格 1. cnpm insta ...

  8. web颜色转换为delphi

    今天在写写一个日志浏览和报警功能时,要求用多种颜色去显示不同的信息,客户给出的颜色是web的 rgb颜色,就是用6位16进制数去表示的颜色,直接把他赋值给Delphi的TColor变量,发现显示的颜色 ...

  9. Android开发工具常用快捷键大全

    Android开发中常用的开发工具有android studio和eclipse两种,下面小编整理了一些这两种开发工具中常用的快捷键,使用这些快捷键,你的android编程将事半功倍. android ...

  10. Java Integer比较

    今天看微信做了一个选择题,对Integer比较结果有点意外,题目如下: public static void main(String[] args) { Integer a = 1; Integer ...