提问:Activity的运行机制

============问题描述============

最近在看百度地图的api demo,发现大神的写法跟屌丝的想法有所区别。他的layout里面声明了RadioGroup和CheckBox,但是根本没有在Activity类里声明这两个控件,而是直接写在方法里用id找。我不理解那几个方法是在哪里调用的,是不是通过findViewById就和主进程关联了?

public class LayersDemo extends Activity {

/**

* MapView 是地图主控件

*/

private MapView mMapView;

private BaiduMap mBaiduMap;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_layers);

mMapView = (MapView) findViewById(R.id.bmapView);

mBaiduMap = mMapView.getMap();

}

/**

* 设置底图显示模式

*

* @param view

*/

public void setMapMode(View view) {

boolean checked = ((RadioButton) view).isChecked();

switch (view.getId()) {

case R.id.normal:

if (checked)

mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);

break;

case R.id.statellite:

if (checked)

mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);

break;

}

}

/**

* 设置是否显示交通图

*

* @param view

*/

public void setTraffic(View view) {

mBaiduMap.setTrafficEnabled(((CheckBox) view).isChecked());

}

@Override

protected void onPause() {

// MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()

mMapView.onPause();

super.onPause();

}

@Override

protected void onResume() {

// MapView的生命周期与Activity同步,当activity恢复时需调用MapView.onResume()

mMapView.onResume();

super.onResume();

}

@Override

protected void onDestroy() {

// MapView的生命周期与Activity同步,当activity销毁时需调用MapView.destroy()

mMapView.onDestroy();

super.onDestroy();

}

}

问题是,setMapType()和setTraffic()这两个函数为啥要传view进去,怎么传进去的,传进去如何起作用的,因为点它们确实有效果

============解决方案1============

在setTraffic(View view)插入断电、然后你可以看到以下的栈信息,因为是先进后出,执行顺序是从下面主线程的main()开始执行

LayersDemo.setMapMode(View) line: 37

Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]

Method.invoke(Object, Object...) line: 515

View$1.onClick(View) line: 3850

RadioButton(View).performClick() line: 4470

RadioButton(CompoundButton).performClick() line: 100

View$PerformClick.run() line: 18593

Handler.handleCallback(Message) line: 733

ViewRootImpl$ViewRootHandler(Handler).dispatchMessage(Message) line: 95

Looper.loop() line: 157

ActivityThread.main(String[]) line: 5867

执行步骤大概是:

ViewRootHandler分发消息过来,触发View的点击事件,然后得知这个View是RadioButton类型(继承View而来),接着是Method.invokeNative,这个不用管,这里面执行的是c/c++的代码,估计是百度在算法方面做跨平台节省开发成本,iOS也是用这里面的代码,重点来了,setTraffic(View view)是怎么传View的?我找到了这个代码

<CheckBox

android:id="@+id/traffice"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_weight="1"

android:checked="false"

android:onClick="setTraffic"

android:text="交通图" />

也就是里面onClick="setTraffic"起的作用,Activity里面有执行setContentView(R.layout.activity_layers);这里执行的其实是一个解析xml和然后根据解析结果调用Java代码的过程,当读到<CheckBox..../>这段代码的时候就会在渲染树里面new一个CheckBox对象,当读到android:onClick="setTraffic"这句属性的时候会执行

checkBox.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View view) {

// TODO Auto-generated method stub

Activity.this.setTraffic(view);

}

})

这样就把View传进来来,其实Activity.this.setTraffic(view);也不是这么直接执行的,我这里写的就当是伪代码吧,应该是JVM虚拟机有个查找函数的机制,根据"setTraffic"这个名字去查找当前Activity的setTraffic成员函数,如果找不到这个函数执行到这里报错崩溃,希望你能理解

起初我也不懂这些机制,也是弄游戏开发后才慢慢懂得GUI框架大概的原理,以前也好奇XML是怎么表现成界面的,其实最终还是动态调用Java代码实现,搭成一棵渲染树一层层得把每个View渲染出来

时间: 2024-12-23 23:15:23

提问:Activity的运行机制的相关文章

深入理解Android Instant Run运行机制

Instant Run Instant Run,是android studio2.0新增的一个运行机制,在你编码开发.测试或debug的时候,它都能显著减少你对当前应用的构建和部署的时间.通俗的解释就是,当你在Android Studio中改了你的代码,Instant Run可以很快的让你看到你修改的效果.而在没有Instant Run之前,你的一个小小的修改,都肯能需要几十秒甚至更长的等待才能看到修改后的效果. 传统的代码修改及编译部署流程 传统的代码修改及编译流程如下:构建整个apk → 部

Handler运行机制

Handler的运行机制 Handler的作用: 当我们需要在子线程处理耗时的操作(例如访问网络,数据库的操作),而当耗时的操作完成后,需要更新UI,这就需要使用Handler来处理,因为子线程不能做更新UI的操作.Handler能帮我们很容易的把任务(在子线程处理)切换回它所在的线程.简单理解,Handler就是解决线程和线程之间的通信的. Handler的使用 使用的handler的两种形式: 1.在主线程使用handler: 2.在子线程使用handler. 在主线程使用handler的示

Android剖析和运行机制

翻译之<Android Anatomy and Physiology>,下载地址:http://download.csdn.net/detail/wuxiaoer717/6839427 大纲: 1. Android剖析 Linux内核 本地库(Native Libraries) Android运行时(Android Runtime) 应用框架 2. Android运行机制 启动流程 层间交互(Layer Interaction) 一. Android剖析 如下图所示为Android的架构图 1

Android Activity和Intent机制学习笔记

Activity Android中,Activity是所有程序的根本,所有程序的流程都运行在Activity之中,Activity具有自己的生命周期(见http://www.cnblogs.com/feisky/archive/2010/01/01/1637427.html,由系统控制生命周期,程序无法改变,但可以用onSaveInstanceState保存其状态). 对于Activity,关键是其生命周期的把握(如下图),其次就是状态的保存和恢复(onSaveInstanceState onR

深入理解struts的运行机制

在此申明本博文并非原创,原文:http://blog.csdn.net/lenotang/article/details/3336623,本文章是在此文章基础上进行优化.也谈不上优化,只是加上了点自己的想法 jar包准备 为什么会用到这两个jar包呢,因为我需要通过这个jar来解析xml配置文件. 新建项目 流程梳理 struts配置文件 <?xml version="1.0" encoding="UTF-8"?> <struts> <

Struts2运行机制

前言: 首先感谢中国最专业的java培训班<北京尚学堂>的无私奉献精神,免费提供这么多学习资料. 以及我的偶像马士兵老师,感觉您特帅,技术特别牛,今生若能相见,甚好.谢谢. struts2的运行机制: 探讨任何的运行机制,一定是这里开始, (http://localhost:8080/Struts2_Instroduction/hello.action)(.action可省略) 客户端在浏览器输入一个URL地址,这个请求通过http协议发送给tomcat,tomcat接收到请求后,查看请求的是

Spark架构及运行机制

Spark是基于内存计算的大数据并行计算框架.因为其基于内存计算,较Hadoop中MapReduce计算框架具有更高的实时性,同时保证了高效容错性和可伸缩性.从2009年诞生于AMPLab到现在已经成为Apache顶级开源项目,并成功应用于商业集群中.学习Spark就需要了解其架构及运行机制. Spark架构 Spark架构使用了分布式计算中master-slave模型,master是集群中含有master进程的节点,slave是集群中含有worker进程的节点. master作为整个集群的控制

SSL/TLS协议运行机制的概述

转自:SSL/TLS协议运行机制的概述 作者: 阮一峰 日期: 2014年2月 5日 互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行机制.文章的重点是设计思想和运行过程,不涉及具体的实现细节.如果想了解这方面的内容,请参阅RFC文档. 一.作用 不使用SSL/TLS的HTTP通信,就是不加密的通信.所有信息明文传播,带来了三大风险. (1) 窃听风险(eavesdropping):第三方可以获知通信内容. (2) 篡改风险(tampering):第三方可以

java运行机制详细

JVM(Java虚拟机)一种用于计算设备的规范,可用不同的方式(软件或硬件)加以实现.编译虚拟机的指令集与编译微处理器的指令集非常类似.Java虚拟机包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回收堆和一个存储方法域. Java虚拟机(JVM)是可运行Java代码的假想计算机.只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行. 1.为什么要使用Java虚拟机 Java语言的一个非常重要的特点就是与平台的无关性.而使用Java虚拟机是实