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. POJ 2135 Farm Tour(最小费用最大流)

    Description When FJ's friends visit him on the farm, he likes to show them around. His farm comprise ...

  2. PAT 甲级 1002 A+B for Polynomials

    https://pintia.cn/problem-sets/994805342720868352/problems/994805526272000000 This time, you are sup ...

  3. 【EasyNetQ】- 控制队列名称

    在为队列生成名称时,EasyNetQ的默认行为是使用消息类型名称并将其附加到订阅ID.例如PartyInvitation,命名空间中的消息类型EasyNetQ.Tests.Integration将使用 ...

  4. 高级C代码的汇编分析

    在windows上,常用的函数调用方式有: Pascal方式,WINAPI(_stdcall)方式 和C方式(_cdecl) _cdecl调用规则: 1,参数从右到左入堆栈 2,在函数返回后,调用者要 ...

  5. 左右躲避障碍-神手ts版本

    TypeScript-左右躲避障碍-神手 学习typescript,第一步应该是学习官方文档,理解最基础的语法.第二步开始用typescript实现一些js+css 或者canvas类型的游行.现在开 ...

  6. 【bzoj2326】[HNOI2011]数学作业 矩阵乘法

    题目描述 题解 矩阵乘法 考虑把相同位数的数放到一起处理: 设有$k$位的数为$[l,r]$,那么枚举从大到小的第$i$个数(即枚举$r-i+1$),考虑其对$Concatenate(l..r)$的贡 ...

  7. 感觉自己应该重新读一次Javascript

    我自己也有一本Javascript书籍,是自己上大学的时候学校给提供的,现在,我依旧带着这本书.我决定要把这本书在重新温习一下.然后,开启下面的Javascript之旅.这是我看到博客园一位园友写的, ...

  8. WIN8 打开图片内置管理员无法激活此应用

    1.运行 gpedit.msc 2.计算机配置.windows设置.安全设置.本地策略.安全选项.“用户账户控制用于内置管理员账户的管理员批准模式”  改为已启用 3.重启电脑

  9. SPOJ Repeats(后缀数组+RMQ-ST)

    REPEATS - Repeats no tags  A string s is called an (k,l)-repeat if s is obtained by concatenating k& ...

  10. 【题解】HNOI2018寻宝游戏

    太厉害啦……感觉看到了正解之后整个人都惊呆了一样.真的很强%%% 首先要注意到一个性质.位运算列与列之间是不会相互影响的,那么我们先观察使一列满足条件的操作序列需要满足什么条件.&0时,不论之 ...