Android工程师
源码开发(手机定制软件)
系统开发(驱动 系统软件)
应用开发 (单机 联网 游戏 应用)
一.Android应用程序的组成部分
Activity
Activity 应用程序的表示层。应用程序中的每一个UI都是通过Activity类的一个或多个扩展实现的。Activity使用Fragment和试图来布局和显示信息,以及响应用户动作。
Service
应用程序中不可见的工作者。Service组件在运行时没有UI,它们可以更新数据源和Activity,触发通知和广播Intent。它们被用来执行一些运行时间长的任务,或者不需要用户交互的任务(例如,即使当应用程序的Activity不是活动的或者可见的时候也需要继续进行网络查找或其他网络任务)
Intent
一个强大的应用程序间的消息传递框架。安卓中大量使用了Intent,它可以用来启动和停止activity和service,在系统范围内或向目标Activity,service或者Broadcast Receiver广播消息,以及请求对特定的一条数据执行操作。
Broadcast Receiver
Intent侦听器。Broadcast Receiver使应用程序可以监听到那些匹配指定的过滤器标准的Intent广播。Broadcast Receiver会自动地启动应用程序来响应某个收到的Intent,这个特点使它们成为了事件驱动的应用程序的最佳选择。
Content Provider
一个可以共享的持久数据存储器。Content Provider用来管理和持久化应用程序数据,通常会与SQL数据库交互。Content Provider是在应用程序之间共享数据的首选方法。可以通过配置自己的Content Provider来允许其他应用程序访问,也可以访问其他应用程序提供的Content Provider。安卓设备包含了多个本地的Content Provider来提供有用的数据库,如媒体和联系人信息等。
二.关于安卓的目录结构
src 编写Java代码的目录 遵循Java的命名方法
gen 包含了android的资源文件的标识符 不需要程序员维护 自动生成 不要轻易删除,gen/下面有一个重要的文件R.java,这个文件由系统为一些资源自动生成唯一标识的ID,想象以前的VC中也有类似的文件。R相当于resourse。
assets 原生资源文件
bin 编译后的apk应用程序
libs 第三方类库
res 资源包我们在res/中加入某些资源,例如一个图标,会在gen/下的R.java中生成一个ID,而assets下的资源将不会,需要通过路径来进行访问。res/drawable/中用于存放image,对于图标,提供h,m,l三个分辨率,以适用不同分辨率的设备。
--drawable-XXdpi包含安卓应用中的图片资源文件 按照清晰度分为高清 低清晰度 标清 超高清 非常超高清
--layout 布局文件 完成UI控件的堆放
--menu 菜单 安卓的应用菜单
--values 字符资源文件 通常使用在手机的国际化
AndroidManifest.xml文件(包名 apk版本 apk图片 说明 相关的授权)
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.class04"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="19"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.class04.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
在这里icon为:@drawable/icon,就是在res/drawable/中名字为icon的image。而@string /app_name,表示在res/values/strings.xml中的定义名字为app_name的字符串,在这个例子中 文"Hello,Andriod"。activity这里表明的activity的执行目标的类名称。
如果我们需要给我们的应用设定用户的许可,例如允许使用GPS,可以加上<uses-permission android:name="android.permission.ACCESS_GPS /">
网络权限
<uses-permission android:name="android.permission.INTERNET"/>
每一个Activity都需要在Andriodmanifest.xml文件进行注册。一个映用有多个Activity,里面的类名".HelloAndriod",注意是有一个".",它和package结合起来就是一个完整的类命。而后面<intent-filter>...</intent-filter>中有android.intent.action.MAIN,表明这是应用启动时需要启动的Activity。
修改新建工程默认布局
D:android-sdk-windows ools emplatesactivitiesBlankActivity oot eslayout activity_simple.xml.ftl
三.Activity的生命周期
三种状态:
Resumed
Paused--可能会被系统杀掉 当内存不够时
Stoped--表示现在的activity被另外一个activity完全遮盖
当一个activity处于Paused或者Stoped状态时 可能会被finish掉
七种方法:参见详细图
onCreate 当activity第一次被创建时,你可以创建一个view ,绑定数据
onStart 变成可见的
onResume
onPause 当其他的activity正在运行
onStop
onDestroy
onRestart
onStart
startActivity() 和 startActivityForResult()
在一个主界面(主Activity)上能连接往许多不同子功能模块(子Activity上去),当子模块的事情做完之后就回到主界面,或许还同时返回一些子模块完成的数据交给主Activity处理。貌似启动 Activity 的只有 startActivity() 和 startActivityForResult(),之前只学会了前者能初始化一个Bundle,但用起来发现不对劲。用startActivity启动 主界面是一个新的Intent实例,那个我要去访问的主界面还在activity栈的下面没有调出来,而且这样做的一个最大的问题是,回不到原界面就不能多个子功能模块共同来给主界面提供数据或服务了。
解析代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//必须位于程序的第一行 主要用来加载xml的布局 系统会编译成View的对象
setContentView(R.layout.activity_main);
Log.i(TAG,"--onCreate 方法-->>");
}
任何一个View都有一个整型的ID来相关联
到时候可以通过id来初始化相关按钮 达到一一对应
常见开发步骤
1.画布局
2.通过R文件中的id来查找xml对象
Button button = (Button) findViewById(R.id.button1);
3.绑定事件
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent(MainActivity.this,NextActivity.class);
String a = editText1.getText().toString().trim();
String b = editText2.getText().toString().trim();
intent.putExtra("msg", a+"+"+b+"="+"?");
startActivityForResult(intent, 1000);
}
});
四.布局
--LinearLayout 线性布局
在LinearLayout里面的空间,按照水平或者垂直排列:
orientation=“horizontal”---水平排列; orientation=“vertical”---垂直排列
当LinearLayout 是horizontal ,并且里面的控件使用了layout_width="fill_parent" ,第二组控件会挡在屏幕的右边,那也就看不到了。
--AbsoluteLayout 绝对布局
是一个按照绝对坐标定义的布局,由于使用绝对坐标去定位控件,因此要实现自适应界面时,应尽少使用 AbsoluteLayout 。 AbsoluteLayout 里面的控件都以layout_x 、layout_y 来定义其位置
--RelativeLayout 相对布局
是一个按照相对位置排列的布局,跟AbsoluteLayout这个绝对坐标布局是个相反的理解
--FrameLayout 帧布局
顾名思义跟帧有关,布局里所有的控件都被放到布局的左上角,并且一层覆盖一层
--TableLayout 表格布局
--GridView
布局和布局之间不要嵌套太对 一般不要超过三层
--GalleyView 画廊
Android:layout_gravity:表示子元素位于父元素的垂直位置
Android:gravity 里面的内容居中(子元素,控件内部的元素)
Android:layout_weight: “1” 权重 越大占的比例越大
Android:layout_marginLeft:
Android:layout_margin: 以左上角为原点
Android:paddingTop:”1dp“ 内边距 带文字的
Android:hint
控件大小用 ---- dp 文字大小 ---- sp
AlertDialog
* setIcon :为对话框设置图标
* setMessage:为对话框设置内容
* setView : 给对话框设置自定义样式
* setItems :设置对话框要显示的一个list,一般用于显示几个命令时
* setMultiChoiceItems :用来设置对话框显示一系列的复选框
* setNeutralButton :普通按钮
* setPositiveButton :给对话框添加"Yes"按钮
* setNegativeButton :对话框添加"No"按钮
* create : 创建对话框
* show :显示对话框
PopupWindow
PopupWindow在android.widget包下,弹出窗口的形式展示。官方文档对该控件的描述是:“一个弹出窗口控件,可以用来显示任意视图 (View),而且会浮动在当前 活动(activity)的顶部”。PopupWindow可以让我们实现多种自定义控件,例如:menu、alertdialog等弹窗似的View。
TabHost,TabWidget
TabHost控件->TabWidget(必须命名为tabs)->FrameLayout(必须命名为tabcontent)。
Style 与 Theme
Button
RadioButton
Switches
ScrollView
ScrollView里面只能有线性布局 其他可以加到线性布局里面
五.Adapter适配器
适配器是adapterView和数据源之间的桥梁
它可以帮我们创造一个view 数据可以来源于网络或者数据库
为每一条数据创建一个可以展现数据的控件
ArrayAdapter 数组
CursorAdapter 使用数据库
Android请求本地服务器时不能使用localhost和127.0.0.1,因为它会把模拟器当本机,需要使用10.0.2.2
六.网络与线程
使用httpPost提交请求
HttpClient httpClient = new DefaultHttpClient();
UrlEncodedFormEntity 纯文本表单提交 不包含文件
UI控件
Android线程
UI主线程
1.不要阻塞UI线程
2.不要UI以外的线程中
两种机制
不要在UI主线程中访问网路
使用AsyncTask
允许使用异步的工作在UI上,可能是一个阻塞的操作,可以把结果发布给UI
申明一个类继承AsyncTask 并且实现一个doInbackground()方法,通过这个方法把结果传递给UI.
三个参数
Params 传递的参数
Progress 进度条
Result 返回的结果
四个步骤 不要手动调用这四个方法
1.onPreExecute 执行异步任务之前
2.doInBackground 后台执行,调用publishProgress把值传到第三个方法
3.onProgressUpdate
4.onPostExecute 更新UI
七. 其它
Dialog
AlertDialog 警告框
触发事件的几种方式
1.匿名内部类:
button.setOnclickListener(new View.OnClickListener{
});
2.实现接口
通过xml定义ui控件
View layout = LayoutInflater.from(MainActivity.this).inflate(R.layout.toast,null);
TextView textView = (TextView )layout.findViewById(R.id.x);