APP的工作流程
概述:本章主要针对对APP无基础的同学,对java不了解的同学,主要帮助大家理解APP的工作方式,给大家阅读APP源码提供一定的思路。大神可以直接跳过。APP的工作流程我们以较简单的EMOD来引导大家入门,理解起来相对直观,且EMOD包含Android常用的编写方法。通过本文的学习,以便于工作在Android底层而没有从事app开发工作的同学能够具备一定的思路和能力去阅读app代码。
首先我们来介绍一下我们这次介绍的APP的基本功能和使用方法。
基本功能:EMOD为工厂模式engineering mode的缩写,主要作用是工厂生产的过程中,使用EMOD对手机的基本功能进行验证。
使用方法:我们在拨号盘输入规定的号码即可打开APP,点击里面的对应选项做相应测试。
首先和大家陈述一点,拨号键盘打开EMOD使用的方法为广播,至于为什么能打开,以及他的实现,本章节不做描述。本章只描述打开EMOD第一个界面之后到获取sensor服务的地方。
首先我们输入自己设定的指令这里保密,例如“123456”进入工厂模式的如下界面,如图:图一。
图一:
点击图一中的“手动”按钮,来到图二所示
图二:
本文主要描述sensor的流程,我们选择一个较简单的sensor 光感距感二合一传感器,我们来看看他在工厂模式里的测试项“接近和光感测试”项,如图三所示
图三:
如图三所示:在图三的界面中,我们可以看到sensor数据的变化,以及数据变化后,界面的变化。
至此,我们借助如下的三个问题来学习EMOD APP是如何工作的
问题一:图一到图三,者三个界面上的控件是如何实现的
问题二:这三个界面是如何实现界面跳转的
问题三:第三个界面中,APP是如何获取到sensor的数据并在界面上实现更新的
注意:希望大家在理解完所有的知识点后再看代码,写得不够详细的知识点大家自己找度娘了!
首先补充两个基本知识点:
知识点一:
android 的四大组件
activity界面(我们每看到的一个界面,在AndroidAPP中即为一个activity)这里我们只关心activity
BroadcastReceiver广播接收器
Service 后台服务
ContentProvider 内容提供者
android apk 源码的目录功能
这里我们以eclipse软件打开的Android apk源码来介绍一下源码的目录结构,在Android源码中此目录也是大同小异的。
这里只介绍我们看代码经常要看的地方
知识点二:
activity的生命周期
void onCreate();第一次创建Activity时被调用
void onStart(); 启动Activity时被调用
void onRestart(); 重新启动Activity时被调用
void onResume(); 可以进行用户交互时调用
void onPause(); 暂停Activity被调用,可以看到页面,获取不到焦点
void onStop(); 停止Activity时被调用,看不到页面,获取不到焦点
void onDestroy(); 销毁Activity时被调用
知识点三:
在activity中我们所看到的按钮,文字,图片,视频等均为控件,在Android app中这些控件所对应的类名为:
按钮 button
文字 textview
图片 imageview
等等...
每个类中都封装好了他们私有的一些方法,如:
textview.setText 设置文字的显示内容
button.setOnClickListener(listener); 设置按钮按下后的处理方法为listener(这里为了便于底层的同学理解,换个说法,这里就像设置中断处理函数一样,把按键按下理解为中断就可以了),listener为OnClickListener类型,我们只要重写里面的onClick方法即可,onClick方法里面就是我们的处理函数的实体了。
知识点四:
我们在如何activity中确定这个activity所使用的xml布局文件是哪一个
设置布局的统一方法为:this.setContentView(R.layout.start);
知识点五:
定义控件在activity对应xml文件中定义,在xml文件中我们可以设置当前activity的布局格式,控件所处的位置,大小,颜色及控件中的各种内容。
这里注意一点,我们要在xml文件中设置各个控件对应的id,设置好id后,会自动在R.id下生成控件对应的id号(不需要我们手动设置)。
例:我们看图一对应的xml文件start.xml
<Button android:id="@+id/manual" android:layout_width="120dip" android:layout_height="wrap_content" />
<Button android:id="@+id/auto" android:layout_width="120dip" android:layout_height="wrap_content" />
start.xml设置了button的id,长和宽。
知识点六:
我们在xml文件中定义控件,在java文件中使用控件,获取控件普遍使用的方法为findViewById(R.id.控件id名);
例:findViewById(R.id.auto);
知识点七:
字符串通常定义在string.xml文件中,可以使用R.string.字符串名来使用字符串
例:string.xml的一段定义
<string name="select_mode">"选择测试模式"</string>
<string name="btn_manual">"手动"</string>
<string name="btn_auto">"自动"</string>
<string name="btn_factory_reset">"恢复出厂设置"</string>
使用时:manual.setText(R.string.btn_manual);
R.string.btn_manual得到的字符串就是“手动”,这里有点类似c语言的宏定义,希望能帮助大家理解。
来看问题一(问题二的答案贯穿其中):我们先从图一的界面的代码开始分析
代码块一:
package com.wind.emode;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class startActivity extends Activity {//一个实现界面的类必须是Activity的子类
Button manual = null;
Button auto = null;
Button result = null;
Button factory_reset = null;
TextView title = null;
int menuIndex = -1;
int autodetect = 0;
Intent intent = null;
protected void onCreate(Bundle savedInstanceState) {//startActivity的入口方法onCreate
super.onCreate(savedInstanceState);
this.setContentView(R.layout.start);//设置布局文件为start.xml
manual = (Button) findViewById(R.id.manual);
auto = (Button) findViewById(R.id.auto);
result = (Button) findViewById(R.id.result);
factory_reset = (Button) findViewById(R.id.factory_reset);
//if(!getResources().getBoolean(R.bool.config_project_t621w)){
factory_reset.setVisibility(View.GONE);
//}
title = (TextView) findViewById(R.id.start_title);//获取标题控件
title.setText(R.string.select_mode);//修改标题控件内容<string name="select_mode">"选择测试模式"</string>
intent = new Intent();
manual.setText(R.string.btn_manual);//设置按键manual内容为 <string name="btn_manual">"手动"</string>
result.setText(R.string.btn