Android之Activity
Activity总结:
- Activity的顶层View是DecorView,而我们在onCreate函数中通过setContentView设置的View只不过是这个DecorView的一部分罢了。DecorView是一个FrameLayout类型的ViewGroup.
- Activity和UI有关,它包含一个PhoneWindow和LocalWindowManger对象。这两个对象控制整个Activity的显示。
- LocalWindowManger使用WindowMangerImpl作为最终的处理对象(Proxy模式)这个WindowMangerImpl对象有一个ViewRoot对象。
- ViewRoot实现了VIewParent接口,他有两个重要成员变量,一个是mView,他指向Activity顶层UI单元的DecorVIew,另一个是mSurface,这个Surface包含了一个Canvas。ViewRoot还通过Binder系统和WIndowManagerService进性跨进程的交互。
- ViewRoot能处理Handler的消息,Activity的现实就是由ViewRoot在他的performTravelsals函数中完成的。
- 整个Activity的绘画流程就是从mSurface中lock一块Canvas,然后交个mView去自由发挥画画的才能,最后unlockCanvasAndPOst释放这块Canvas。
- Service Activity本质上都是BInder的实现。
概括的说就是Activity包括真实显示的窗口PhoneWIndow和在窗口中作画的人LocalWIndowManger,而作画的人手上有两个东西一个是存放画布的msurface,另一个就是作画的笔mview,客户端通过setContentView告诉画家他想要画的内容,然后画家根据客户的要求进性再创作(因为我们通过SetVontentVIew设置的view只不过是DecorView的一部分罢了)。当然画家还能和大自然保持沟通就是Binder机制。内部线程之间的沟通更是不可少所以能处理Handler的消息。一个Activey作为一个进程和所有的其他进程一样都有内部的通信机制和外部的通信机制,只是就Activity而言,内部的Handler机制因为应用更频繁所以被着重提出来了。
Activity分析:
- 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这个进程 - 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渲染效果。
- 一个Activity就是一个进程。一位这个进程的作用更多的就是在于在界面上画出一个节目并完成和页面的交互。我分俩个方面来分析一下Activity这个进程和其他进程之间的通信就是IPC
1.如果不考虑客户用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函数下的。 - 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的更多相关文章
- Android中Activity的启动模式
简介 Android中的活动启动方式分为4种:standard, singleTop, singleTask, singleInstance.可以在AndroidManifest.xml中通过给< ...
- Android之Activity的生命周期
PS:写一发关于Activity的生命周期,也算是面试的重点内容. 学习内容: 1.Activity的生命周期 2.面对多种情况的时候Activity的生命周期 3.onSaveInstanceSta ...
- android开发------Activity生命周期
这几天工作比较忙,基本没有什么时间更新播客了. 趁着今晚有点时间,我们来简单说一下什么是Activity生命周期和它们各阶段的特征 什么是生命周期 在还没有接触android开发的时候,听到有人说Ac ...
- Android课程---Activity中保存和恢复用户状态
onSaveInstanceState 保存 在暂停之后和保存之前调用 onRestoreInstanceState 恢复 再启动之后和显示之前调用 package com.example.chens ...
- Android课程---Activity 的生命周期
activity类处于android.app包中,继承体系如下: 1.java.lang.Object 2.android.content.Context 3.android.app.Applicat ...
- Android课程---Activity的创建
一.为了创建一个新的Activity,你需要继承Activity类,定义UI,实现功能.新的Activity的最基本的框架代码如下所示: package com.paad.myapplication; ...
- Android将Activity 打 jar包 (解决资源文件不能打包的问题)
转载地址:http://blog.csdn.net/xiaanming/article/details/9257853 最近有一个需要,我们公司做了一个apk客户端,然后其他的公司可以根据自己的需要来 ...
- Android之activity中新建控件
了解了5大布局,我们会发现这些布局都是静态的,如何让系统自动生成控件呢?这就需要activity来帮忙了 今天我们讲的就是用activity新建布局 用案例来说吧! 实现一个输入行和列自动生成表格并生 ...
- Android之activity初讲
前天我们已经成功创建了第一个Android项目,如果我要把软件推荐给我的第一个用户,毫无疑问是从界面开始介绍.因为即使你的程序算法再高效,架构再出色,用户根本不会在乎这些,他们一开始只会对看到的东西感 ...
- Android的Activity屏幕切换动画(一)-左右滑动切换
(国内知名Android开发论坛eoe开发者社区推荐:http://www.eoeandroid.com/) Android的Activity屏幕切换动画(一)-左右滑动切换 在Android开发过程 ...
随机推荐
- 编程练习:寻找发帖"水王"
题目: 寻找发帖"水王" 来源: 编程之美 分析 衍生:就是给定一个数组,其中某个元素出现次数超过了数组长度的一半,找出这个元素 方法s 方法1 对这个串进行遍历,同时对出现的元素 ...
- java正则表达式 3 -- 查找
用正则表达式执行查找命令,则需要用正则对象,其规则和执行顺序如下: 指定为字符串的正则表达式必须首先被便以为此类的实例.然后,可将得到的正则对象匹配任意的字符串用于创建Mather对象,执行匹配所涉及 ...
- VFS dup ,dup2
Linux支持各种各样的文件系统格式,如ext2.ext3.reiserfs.FAT.NTFS.iso9660等等,不同的磁盘分区.光盘或其它存储设备都有不同的文件系统格式,然而这些文件系统都可以mo ...
- lintcode-74-第一个错误的代码版本
74-第一个错误的代码版本 代码库的版本号是从 1 到 n 的整数.某一天,有人提交了错误版本的代码,因此造成自身及之后版本的代码在单元测试中均出错.请找出第一个错误的版本号. 你可以通过 isBad ...
- Mybatis学习系列(三)动态SQL
在mapper配置文件中,有时需要根据查询条件选择不同的SQL语句,或者将一些使用频率高的SQL语句单独配置,在需要使用的地方引用.Mybatis的一个特性:动态SQL,来解决这个问题. mybati ...
- [剑指Offer] 36.两个链表的第一个公共结点
题目描述 输入两个链表,找出它们的第一个公共结点. [思路]找出两个链表的长度,然后让长的走两个链表的长度差,然后再一起走(因为两个链表用公共的尾部). /* struct ListNode { in ...
- 数据结构—栈(Stack)
栈的定义--Stack 栈是只允许在末端进行插入和删除的线性表.栈具有后进先出的特性(LIFO ,Last In Fast Out). 学过数据结构的人都知道:栈可以用两种方式来实现,一种方法是用数组 ...
- JSON语法(3)
JSON语法是JavaScript语法的子集. JSON语法规则 数据在名称/值对中 数据由逗号分割 花括号保存对象 方括号保存数组 JSON名称/值对 JSON数据的书写格式是:名称/值对. 名称/ ...
- BZOJ4423 AMPPZ2013Bytehattan(并查集)
判断网格图中某两点是否被割开,可以将割边视为边区域视为点,转化为可切割这两点的区域是否连通.于是每次判断使两个区域连通后是否会形成环(边界视为连通),若是则说明被两点被割开.并查集维护. #inclu ...
- 2017 Multi-University Training Contest - Team 3 RXD and dividing(树)
题解: 其实贪心地算就可以了 一个最优的分配就是每条边权贡献的值为min(k, sz[x]),sz[x]是指子树的大小 然后最后加起来就是答案. #include <iostream> # ...