Android详细学习笔记第一季

Android详细学习笔记第一季
Android详细学习笔记第一季

一、Android学习第一天——环境搭建

Android 开发环境的搭建

环境搭建需要①Android SDK ②JDK ③eclipse

环境搭建开始:

㈠将Android SDK与JDK解压,最好路径中不要出现汉字,然后配置环境变量,方便命令行操作

㈡为eclipse(3.4.1)安装开发Android插件——Android ADT

Help-->Install New Software

输入:https://https://www.360docs.net/doc/a118247382.html,/android/eclipse

便会自动检测出所需要安装的东西,点击install即可。

㈢重启eclipse,进行Android SDK的配置。

Windows-->Preferences-->Android

找到你解压的Android SDK的路径即可。

㈣新建一个Android Project来验证平台是否搭建成功。

注:我上面步骤走下来之后发现我在运行程序时,没有Android Virtual Devices(AVD)的选项。这时可以在Windows-->Android SDK Manager中找到你所需要安装版本,进行安装。

搭建过程还是比较顺利,加油~

二、Android学习第二天——初识Activity

昨天程序搭建成功以后,就可以开发跟运行Android应用程序了,因为Activity是开发中不可或缺的组成部分,所以要对Activity有所认识。

以下两点是需要注意的:(个人总结)

1.凡是覆写得方法,在方法体中的第一行一定是super.XXX(),一定要先调用

父类里的相应方法做必要的事情,再根据自己的需求去写其他的代码。

2.如果是从头学习安卓开发,不一定要开发最新的版本,可以在较低版本(2.

3.3)

下进行开发,然后在高版本(4.0)下进行编译与运行,这样可以提高代码的

适应能力,可以兼容高级版本。

下面对我今天的学习进行个小结:

首先Android的四个重要部分①Activity——形象点就是一个应用程序的门面,我们在手机上看到的图形界面

②Intent——它就像一个搬用工,用于Activity之间传递数据,就像请求

③Service——这个是不可见的,是为整个应用程序提供服务支持的底层

④Content Provider——为应用程序提供数据的接口

上面的描述我自己感觉也比较抽象,今天专门研究了Activity,终于守得云开见月明:首先进行以下学习之前需要对Android的工程项目目录有一个总体的了解:

自己总结:

src下是我们自己写得程序;

gen下是我们创建程序时系统自动生成的,切忌勿修改

assets是一个资源库,与res的区别是不会自动在R.java中自动生成id

res是一个资源库,与assets不同的是,每增加一个资源(图片等),会自动在R.java 中生成对应的id

layout用于存放布局文件,用来控制Activity的显示格局

string.xml中存放的一个一个键值对,Activity可以对其进行提取

AndroidManifest.xml是系统比较重要的一个文件,存放Activity的注册信息,每生成一个Activity就应该在这里注册一个。

以上是大概的叙述,不知道表述的清不清楚

Activity学习笔记~~~

Activity初步介绍

(自己总结)Activity是一个可见的,用于用户跟应用程序交互,可放置多个控件的一个容器。自己感觉这个Activity的概念就像是我们开发网站的一个页面,也是一个容器,只不过载体不同,一个电脑上面看,一个手机上看而已。

?Activity注意事项,自己总结

一个Activity是一个java类,并且一定要继承Activity类。

当一个Activity第一运行时,就会运行onCreate()方法,所以要覆写这个方法。每一个Activity都需要在AndroidManifest.xml中进行配置。

为Activity添加必要控件(部分控件)的方法:在布局文件main.xml中进行添加,此时R.java会自动为该控件生成一个唯一的id,这时在Activity中就可以通过findViewById(R.id.XXX)进行调用啦~~~ 然后你就可以做任何你想做的事情~~~

对有面向对象语言基础的人来说,一看就明白,代码就不用贴啦

?Activity与Intent

形象点来说,Intent就是Activity之间的桥梁,当然也可以是其他的桥梁。今天我只学到了两个Activity之间通过Intent对象来传递数据。

Intent是一个对象,并且包含一组信息①Component name——指定要传递到哪个Activity

②Action——指定另一个Activity要做什么

③Data——传送的数据

④Categorty

⑤Extras——键值对,也是用来存储数据进行传递

⑥Flags

这里需要注意的是,这互相传递的Activity不一定非要在同一个项目工程内。

?四种基本控件的使用

①TextView②EditText③Button④Menu

具体的添加方法很简单,这里就不做演示啦,明儿上图上程序~~~

这里需要注意的是Menu的添加方法与其他三个有所不同:

其他三个控件都是在对应的布局文件中进行添加,而添加Menu需要在Activity中覆写一个方法——onCreateOptionMenu(Menu menu),这样一个菜单就被创建,但是要实现功能,则需要覆写另一个方法——onOptionItemSelected(MenuItem item)为这个菜单中每个item进行功能的编写。

?Activity的生命周期

Activity有七个有关生命周期的函数,分别是:①onCreate

②onStart

③onRestart

④onResume

⑤onPause

⑥onStop

⑦onDestory

这里我只做个总结,具体在什么时候调用什么网上的教程都比我说的清楚

这里我觉得有两点需要注意:

一、当一个程序启动了后三个进程(onPause,onStop,onDestory),就有可能在系统资源不足时被kill掉。因为手机毕竟不是电脑,内存有限,所以安卓系统会有自己内部的算法来节省自己的资源。

二、onDestory在两种情况下可能被调用,1是在代码中调用了finish()方法,2是当系统资源不足的时候。

与Activity生命周期有必要联系的还有一个——Task

Task说白了就是一个存放Activity的堆栈,所以具有堆栈的特点——后进先出。

咱们在手机中看到的永远是处于堆栈最顶层的Activity,需要注意的是,Task中的堆栈没有排序的功能。

窗口形态的Activity——这个将是我们在以后开发中使用比较广泛的一种Activity,就类似于弹出框,但是并不会完全遮挡住下层的Activity。

使用窗口形态的Activity非常简单,只需要在AndroidManifest.xml的对应Activity 注册代码中加一个属性:......android:theme="@Android:style/Theme.Dialog" /> 即可喽~~~

明天将要开始的是Activity布局的学习。其实安卓对于有java基础的人还是比较容易上手的,加油

三、Android学习第三天——Activity的布局初步介绍

今天总结下Activity相关布局的一些知识:

Activity最简单跟常用的布局分为两种:

①LinearLayout -- 线性布局

②TableLayout -- 表格布局

③RelativeLayout -- 相对布局(今后将会频繁的使用到这个布局)

下面来简单总结下前两种(线性/表格)布局当中常用到的一些属性:

①android:id——为指定的控件制定相应的id

②android:text——指定控件中显示的文本内容,这里尽量使用@strings.**

③android:gravity——指定控件中内容的显示位置,如居中等属性

④android:textsize——指定控件中字体的大小,单位pt(磅)等

⑤android:background——指定控件的背景色,注意这里使用的是RGB命名法,如“#aa0000”

⑥android:layout_width——指定控件的宽度

⑦android:layout_height——指定控件的高度

⑧android:padding——指定控件的内边距,注意这里也可以分上下左右分别设置

⑨android:sigleLine——true/false,设置为true,则将控件中的内容在同一行当中进行显示

⑩android:weight——指定每个控件所占的屏幕比例,如果一个屏幕有两个控件,其中一个控件的该值设置为5,另一个设置为2,则第一个控件将占据整个屏幕的5/7,另一个控件则是2/7

当然,我们可以使用布局嵌套的方式来实现更加复杂,更加漂亮的布局样式,比方说LinearLayout中可以再次嵌套任意多的其他布局,TableLayout也是一样,这里就不举例子了,网上一搜一堆的

其实熟悉网页编写,jsp、css之类的对嵌套不会陌生,跟网页编程有异曲同工之妙下面来简单总结下前两种(相对)布局当中常用到的一些属性:

相对布局会依赖于其他控件的位置,相对前两种布局操作会比较复杂。

我们把相对布局中常用的控件分成了几个组,便于记忆

第一组:两个控件上下左右的对齐属性:(通过ID来指定对方控件)

①android:layout_below——将该控件置于指定控件之下

②android:layout_above——将该控件置于指定控件之上

③android:layout_toLeftOf—将该控件的右边缘和指定控件的左边缘对齐

④android:layout_toRightOf——将该控件的左边缘和指定控件的右边缘对齐

第二组:两个控件上下左右的对齐属性:(通过ID来指定对方控件)

⑤android:layout_alignBottom——将该控件的下边缘与指定id的下边缘对齐

⑥android:layout_alignLeft——将该控件的左边缘与指定id的左边缘对齐

⑦android:layout_alignRight——将该控件的右边缘与指定id的右边缘对齐

⑧android:layout_alignTop——将该控件的上边缘与指定id的上边缘对齐

第三组:与父控件对齐的属性:(true/false两个属性值)

⑨android:layout_alignParentLeft——将该控件的左边缘与其父控件的左边缘对齐

⑩android:layout_alignParentRight——将该控件的右边缘与其父控件的右边缘对齐⑾android:layout_alignParentBottom——将该控件的下边缘与其父控件的下边缘对齐⑿android:layout_alignParentTop——将该控件的上边缘与其父控件的上边缘对齐

第四组:居中属性

⒀android:layout_centerInParent——指定控件水平垂直都居中

⒁android:layout_centerHorizontal——指定控件水平居中

⒂android:layout_centerVertical——指定控件垂直居中

这里大家应该会很疑惑,第一组跟第二组对齐看似相同,下面举两个例子:android:layout_toLeftOf

控件一的左边缘与控件二的右边缘对齐android:layout_alignLeft

控件一的左边缘与控件二的左边缘对齐

看出来了吧,这两组属性有本质的区别。

在以后的使用中,大家根据需要选择即可~~~

这些都是口头上之说,如果大家要更深刻的了解这些属性的作用,就自己动手试一试,这里就不举例子了,只为大家做个总结,一遍以后查阅~~~

明儿见喽~

四、Android学习第四天——JAVA基础回顾

这才学习Android的第四天,在程序中已经遇到了JAVA中以前不常用的一些知识点,赶紧回顾复习一下,打下基础

这里就做个简单的小结:

一、匿名内部类

?匿名内部类说白了就是个没有被命名的JAVA类

在以下条件下使用匿名内部类比较适合:

①只用到该类的一个实例时

②类在定义后被马上用到

③类非常小(SUN推荐是在4行代码以下)

④给类命名并不会导致你的代码更容易被理解

在使用匿名内部类时,需要注意:

①匿名内部类不能有构造方法

②匿名内部类不能定义任何静态成员、方法和类

③匿名内部类不能是public、protected、private、static

④只能创建匿名内部类的一个实例

⑤一个匿名内部类一定是在new之后,用其隐含实现一个接口或实现一个类

⑥匿名内部类为局部内部类,所以局部内部类的限制对其都生效

具体的例子大家可以从网上看下,我这里只是大概的总结一下需要注意的东西。

二、线程

?线程说白了就是一个程序中不同的执行路径。

线程跟进程的比较:

①每个进程都有独立的代码跟数据空间(进程的上下文),进程间得切换会有较大的开销

②线程可以看做是轻量级的进程,同一个线程共享代码跟数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小

③多进程:在操作系统中能同时运行多个任务(程序)

④多线程:在同一应用程序中有多个顺序流同时执行

new一个新线程类出来一般会使用下面两种方法的其中一个:

一:继承Thread类来创建一个新的线程,并重写run方法

二:实现Runnable方法

这里需要注意的是:

线程启动:Thread.start()

方法调用:run()

这两种方式的区别:其实真正要启动一个新的线程,需要执行start()方法;run()方法并没有启动一个新的线程,只是在当前线程下,暂停去执行run方法中的方法体,然后再继续执行接下来的程序。

这两种方式的区别在今后也会详加介绍

五、Android学习第四天补充——Android的常用控件

熟悉常用的Android的几个常用控件的使用方法:

一、RadioGroup和RadioButton——单选按钮

二、Checkbox——复选框

三、Toast——提示框,会自动消失

四、ProgressBar——进度条工具

五、ListView——以列表形式将控件显示出来

下面就对这些内容做个详细的解释:

首先我们要注意在布局文件中对控件进行声明不是必须的,这个在以后应用中需要动态生成一些控件的时候,我们就可以在Activity中进行控件声明,这些以后项目中遇到我们再介绍。

我们先来看RadioGroup与RadioButton的使用方法

先来看看RadioGroup与RadioButton在main.xml中的声明,如下图中代码:

这里RadioGroup与Checkbox所设置监听器的方法与Button的有所不同,这里使用的是匿名内部类,调用回调函数来实现对Radio与Checkbox的监听器的设置。

如下图中代码是为RadioGroup添加监听器:

我们再来看Checkbox的使用方法

先来看看Checkbox在main.xml中的声明,如下图中代码:

如下图中代码是为Checkbox添加监听器:

ProgressBar的使用

如下代码为水平进度条的声明方法:

下图为默认进度条的声明方法:

可以一眼看出,style属性的设置决定了进度条的样式。

如下代码即为实现这两个进度条的Activity类——ProgressBarTest.java package mickey.progress;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener; import android.widget.Button;

import android.widget.ProgressBar;

public class ProgressBarTest extends Activity {

// 声明变量

private ProgressBar first = null;

private ProgressBar second = null;

private Button button = null;

private int i = 0;

@Override

public void onCreate(Bundle savedInstanceState) { // 这两句一般都要有

super.onCreate(savedInstanceState); setContentView(https://www.360docs.net/doc/a118247382.html,yout.main);

// 通过findViewById获得控件对象

first = (ProgressBar) findViewById(R.id.first); second = (ProgressBar) findViewById(R.id.second); button = (Button) findViewById(R.id.button);

// 为button设置监听器

button.setOnClickListener(new ButtonListener()); }

// 监听器内部类

class ButtonListener implements OnClickListener {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

if (i == 0) {

// 设置进度条为可见,如果写0的话,不好看,View.VISIBLE 就能让人一看就知道是设置为可见

first.setVisibility(View.VISIBLE);

second.setVisibility(View.VISIBLE);

} else if (i < first.getMax()) {

// 设置进度条的最大值

first.setMax(200);

// 设置进度条的位置

first.setProgress(i);

// 设置第二进度条的位置

first.setSecondaryProgress(i + 10);

// 因为默认的进度条是无法显示进行的状态的,所以second不用设置

} else {

first.setVisibility(View.GONE);

second.setVisibility(View.GONE);

}

i = i + 10;

}

}

}

如下图为运行后的结果:

但是在开发应用程序的时候,比如下载这些功能是不能写在Activity中的,有可能

导致整个Activity长时间无响应或者报错,用户体验较差,所以Handler就应运而生啦~ 以后将会学习到

在使用ListView的例子中,需要注意这里继承的是Activity的子类ListActivity。

六、Android学习第五天——Handler的使用

注意:有很多功能是不能写在Activity中的,例如说下载或者处理大量的数据等,

如果这类操作写在Activity中,就有可能导致整个Activity无响应甚至报错,这样用户体验就会比较差。所以此类功能应该独立于Activity,且互不干扰,所以Handler 就应运而生了。Handler提供了一个异步的消息处理的方案,将具体复杂的操作都放在一个线程中取处理。

创建一个Handler对象的基本步骤如下:

(一)点击一个按钮,调用Handler的post方法,将要执行的线程对象添加到队列

当中去。

(二)将要执行的操作写在线程对象的run()方法当中。

(三)如果想要循环执行,则可以在run方法内部执行Handler的postDelayed或者post方法,将线程反复加入到队列当中。

下面是使用Handler的一个简单的例子:

package mickey.handler;

import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

public class HandlerTest extends Activity {

// 声明两个按钮控件

private Button begin = null;

private Button end = null;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(https://www.360docs.net/doc/a118247382.html,yout.main);

// 根据控件的ID得到代表控件的对象,并为这两个按钮设置相应的监听器

begin = (Button) findViewById(R.id.begin);

begin.setOnClickListener(new StartButtonListener());

end = (Button) findViewById(R.id.end);

end.setOnClickListener(new EndButtonListener());

// 为start按钮设置的监听器

class StartButtonListener implements OnClickListener {

@Override

public void onClick(View v) {

// 无延迟,直接加入消息队列中,此时消息队列中只有此一个线程

// 调用handler的post方法,将要执行的线程对象添加到队列当中去handler.post(updateThread);

}

}

// 为end按钮设置的监听器

class EndButtonListener implements OnClickListener {

@Override

public void onClick(View v) {

handler.removeCallbacks(updateThread);

}

}

// 创建一个Handler对象

Handler handler = new Handler();

// 一个线程类,将要执行的操作写在线程对象的run方法当中

Runnable updateThread = new Runnable() {

@Override

public void run() {

System.out.println("run......");

// 在run方法内发执行postDelayed或者post方法,延迟三秒,将线程加入队列handler.postDelayed(updateThread, 3000);

};

}

但是我们看到了,上面的例子中我们只是调用了线程的run()方法,并没用调用Thread的start()方法来重启一个线程,因此,上面这个例子中,实际上我们并没有重启一个新的线程,从始至终Handler都是和Activity在同一线程中的。

所以如果我们在使用Handler时,要重启一个线程,使用Handler.post(Thread thread)只是调用了该线程的run方法,我们只有使用java中重启线程的方法来重启一个新的线程,即调用Thread.start()方法,这儿不再多说

七、Android学习第六天——SQLite与文件下载

SQLite

SQLite是Android内嵌的一个非常小的关系型数据库。

总结:当我们操作

在学习SQLite当中,遇到两个问题:

(一)如果我们在搭建Android环境成功后,在命令行中输入adb后没有反应,可以按一下操作来做:

第一步:将platform-tools的目录加入path环境变量的配置中;

第二步:将platform-tools下的adb.exe以及两个dll文件拷贝到tools目录下

第三步:重启命令行,输入adb,搞定

(二)结果按照如上配置path变量后,输入adb shell命令后,提示Device not found.

Android学习笔记---SQLite介绍,以及使用Sqlite,进行数据库的创建,完成数据添删改查的理解

Android学习笔记---SQLite介绍,以及使用Sqlite,进行数据库的创建,完成数据添删改查的理解 17_创建数据库与完成数据添删改查--------------------------------------1.SQLite介绍:最大特点是,无数据类型; 除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据。在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL、INTEGER n n 、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型 n n 只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不 n n 过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是你可以把各种类型的数n n 据保存到任何字段中,而不用关心字段声明的数据类型是什么。例如:可以在Integer类型的 n n 字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。n n n 但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段 n n 保存除整数以外的数据时,将会产生错误。 另外, SQLite 在解析CREATE TABLE 语句时, n n 会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息,如下面语句会忽略 name字段 n n 的类型信息: CREATE TABLE person (personid integer primary key autoincrement, name varchar n n (20)) SQLite可以解析大部分标准SQL语句,如:查询语句:select * from 表名 where 条件子句 group by 分组字句 having ... order byn n n 排序子句如:select * from person n n n n select * from person order by id desc n n n n select name from person group by name having count(*)>1 ---------------------------------------------------------------------------2.a.分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录n n select * from Account limit 5 offset 3 或者 select * from Account limit 3,5 n b.select * from Account limit 3,5,指的是跳过前面的3条记录,然后获取5条记录n c.select * from Account limit 3,5是select * from Account limit 5 offset 3语句 n n 的简写版 -------------------------------------------------------------------------------n 3.常用操作: a.插入语句:insert into 表名(字段列表) values(值列表)。如: insert into person nn n n (name, age) values(‘传智’,3) b.更新语句:update 表名 set 字段名=值where 条件子句。如:update person set name=n n n n'credream ‘where id=10 c.删除语句:delete from 表名 where 条件子句。如:delete from person nwhere id=10 -------------------------------------------------------------------------------2.虽然无数据类型,但是建议加上,这样可以增加可读性,支持标准sql,oracle中的不行 ---------------------------------------------------3.获取添加记录后的自增长的ID值:select last_insert_rowid(); -----------------------------------------------------------4.在android中开发数据库应用: n a.创建数据库:以前在javaee时候,需要手工数据,但是android应用,需要运行在用户的 n n 手机上,所以,android应用,要有自动创建数据库功能,当第一次使用软件的时候 n n 就创建数据库----------------------------------------5.关于数据库自动创建的详细介绍: 我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很 n n 多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用软件时创建出 n n 应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数据 n n 表结构进行更新。那么,我们如何才能实现在用户初次使用或升级软件时自动在用户的手机 n n 上创建出应用需要的数据库表呢?总不能让我们在每个需要安装此软件的手机上通过手工方 n n 式创建数据库表吧?因为这种需求是每个数据库应用都要面临的,所以在Android系统,为我 n n 们提供了一个名为SQLiteOpenHelper的抽象类,必须继承它才能使用,它是通过对数据库版 n n 本进行管理来实现前面提出的需求。n -----------------------------------------6.SQLite数据库添加,删除,改查操作 n A.创建数据库:SQLiteOpenHelper .getWritableDatabase ()或getReadableDatabase() n n 可以创建数据库7.创建完成以后可以使用SQLITE Expert软件打开生成的数据库n 可以看到除了生成的自己的需要的表之外,还生成了一张:android_metadata表: n 如果在sqlite中使用数据库一定会有一张android_metadata表,用来登记用户的 n 使用语言:zh_cn -----------------------------------------------------n b.数据库自动创建的过程及方法详细介绍: n n我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在 n n 很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用软件时创建 n n 出应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数n n 据表结构进行更新。那么,我们如何才能实现在用户初次使用或升级软件时自动在用户的手 n n 机上创建出应用需要的数据库表呢?总不能让我们在每个需要安装此软件的手机上通过手工 n n 方式创建数据库表吧?因为这种需求是每个数据库应用都要面临的,所以在Android系统,为n n 我们提供了一个名为SQLiteOpenHelper的抽象类,必须继承它才能使用,它是通过对数据库n n 版本进行管理来实现前面提出的需求。n -------------------------------------------8.详细介绍: 为了实现对数据库版本进行管理,SQLiteOpenHelper类提供了两个重要的方法,分别是 n n onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, intn n n newVersion),前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结n n 构。当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获n n 取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生 n n 成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用 n n ,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。 n n onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号, n n 而数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的变更,修改了数n n 据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为n n 了实现这一目的,可以把原来的数据库版本设置为2(有同学问设置为3行不行?当然可以,如 n n 果你愿意,设置为100也行),并且在onUpgrade()方法里面实现表结构的更新。当软件的版本 n n 升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后 n n 作出相应的表结构及数据更新。 getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的 n n SQLiteDatabase实例。但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库n n 的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就 n n 会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了 n n ,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。 ------------------------------------------------------------------------9.创建数据库的代码: n a.创建项目:DBSQLIte n b./DBSQLIte/src/com/credream/service/DBOpenHelter.java n n package com.credream.service; n n import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteDatabase.CursorFactory; n n public class DBOpenHelter extends SQLiteOpenHelper { //父类没有默认构造器,需要显示调用 public DBOpenHelter(Context context) { super (context, "credream.db", null, 1); //数据库创建完成后,默认会保存在<包>/database/文件夹下 //当修改版本号时候,会触发:onUpgrade方法 //第二个:指定数据库名称, //第三个:游标工厂,用来迭代,查询后的结果集,null代表使用系统默认的 n n 游标工厂//版本号,大于0 n } /** n* 这个方法是在数据库第一次被创建的时候调用的 n*/ @Override public void onCreate(SQLiteDatabase db) { //SQLiteDatabase这个类,封装了增删改查操作,也叫做数据库操作实例 db.execSQL("CREATE TABLE person (personid integer primary keyn n n autoincrement, name varchar(20))"); //这里也可以不写name的数据类型,因为sqlite是数据类型无关的,就是写n n 了varchar(20),也可以写入超过20的内容 n n } /** n* 当数据库的版本号变更的时候被调用 n*/ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("alter table person add phone varchar(12) null"); n n } n n } --------------------------------------------------------2.在清单文件中写入测试环境 n n n n n n n n n n ---------------------------------------------------- 3./DBSQLIte/src/com/credream/test/PersonServiceTest.java package com.credream.test; n n import com.credream.service.DBOpenHelter; n n import android.test.AndroidTestCase; n n public class PersonServiceTest extends AndroidTestCase { //创建数据库,在<包>/database/ public void testCreateDB(){ DBOpenHelter dbOpenHelter=new DBOpenHelter(getContext()); dbOpenHelter.getWritableDatabase(); n } n n } -------------------------------------------------------4.选择方法开始测试,然后,在data/data/<包>/database/下 n 查看并用sqlite打开生成的数据库检查是否正确---------------------------------------------然后将版本号,改成2,然后再次执行,看到,表已经被更新,增加了一列phone -----------------------------------------------5.了解sqlite工作的原理: n DBOpenHelter dbOpenHelter=new DBOpenHelter(getContext()); dbOpenHelter.getWritableDatabase(); n 打开getWritableDatabase();代码:

Android期末测试题(附带答案)

一、选择题 1、下列哪项不是Android四大组件( C ) A.Seivice B. Activity C. Handler D. Content Provider 2、Android是如何组织Activity的( B ) A.以堆的方式组织Activity B. 以栈的方式组织Activity C. 以树形方式组织Activity D. 以链式方式组织Activity 3、关于线程说法不正确的是( B ) A. 在 android 中,我们可以在主线程中,创建一个新的线程 B. 在创建的新线程中,它可以操作 UI 组件 C. 新线程可以和 Handler 共同使用 D. 创建的 Handler 对象,它隶属于创建它的线程 4、下列关于内存回收的说明,哪个是正确的(B ) A.程序员必须创建一个线程来释放内存 B.内存回收程序负责释放无用内存 C.内存回收程序允许程序员直接释放内存 D.内存回收程序可以在指定的时间释放内存对象 5、设置xml布局文件中的字体大小一般用什么单位( c ) A.dp B. px C. sp D. pt 6、关于service生命周期的onCreate()和onStart()说法正确的是( D ) A.当第一次启动的时候先后调用onCreate()和onStart()方法 B.当第一次启动的时候只会调用onCreate()方法 C.如果service已经启动,将先后调用onCreate()和onStart()方法 D.如果service已经启动,只会执行onStart()方法,不再执行onCreate()方法 7、Android项目工程下面的assets目录,以下说法正确的是( A ) A.这里的文件是原封不动的存储到设备上不会转换为二进制的格式 B.主要放置多媒体等数据文件 C.主要放置图片文件 D.放置字符串,颜色,数组等常量数据 8、在android中使用SQLiteOpenHelper这个辅助类,生成一个可操作的数据库,调用的方法是( A )A.getReadableDatabase() B.getDatabase() C.getEnbleDatabase() D.createDateBase() 9、Activity从可见状态变为半透明遮盖状态时,生命周期中哪个方法被调用( B )

张学浩 Android读书笔记之《Android Studio从入门到精通》

《Android Studio从入门到精通》读后感严格来说,这本书应该都不算是一本书,因为没有出版信息。但是又有封面,内容也有这么多,又像是一本书。那么暂且就当它是一本书吧。 这本书的内容呢,作者是泛泛而谈, 你也只需要泛泛而看就行了。我花了一个下午 看完,因为书中的内容,介绍的很简单,基本 上所有的内容我在之前的两本书中都看到过, 所以看起来很快。作者也没有进行深入的讲解, 也只是介绍一下,也并未说明哪些知识点需要 注意或者深入。 作者把书名叫做从“入门到精通”,真的 是有点太吹牛了。就看这么点东西,就能精通? 那精通就真的是太简单了。 书中的代码例子,也不适合演练。因为作 者讲解的代码结构思绪太乱,讲创建这个类那 个类,定义变量等等步骤,也不讲解在哪里创建,放在哪个地方,结果有时候都要摸索半天。我是被折腾的到最后面两章内容都不演练了。 如果你说,代码变量你不知道放在哪个地方,那是因为你不熟悉啊。那反过来讲,如果我熟悉,那我还看这本书吗?不管怎样,仁者见仁智者见智,但我还是细细推敲了。 个人心得

这个周的时间,我用了三天的时间跟着书籍上面的内容实现了,家庭理财通这个小的app,算是用来练手的开始。首先开始实现的时候,我是先从项目的架构开始,首先你的先理解者这个APP具体是干 什么的,有几个模块, 每个模块有几个功能。 大致了解了之后就可 以跟着编写代码。an dorid的编写也是遵 从三层架构的原则, 这里分了三个包。 其中model包下面主要是项目用到的对象的实体类,Dao包下面主要是数据库操作的,myActivi ty是业务逻辑的实现。在编写代码的时候我的顺序是从modle开始,这个也比较简单,很多类只需要写好属性之后就可以直接使用快捷键生成代码。写这个包里面的类的时候,也便于理解项目的内容。写完这个包的内容后,我紧接着实现的是Dao包里面的内容,其中有一个数据库操作的基类,其他的类的方法的这些其实都是差不多的。紧接着实现的布局文件的编写,这个是一个很费时的工作,但是多些代码总是好的,一定不要去粘贴复制代码,这样便于熟悉很多控件的属性,布局什么的。相信你只要老老实实把这个项目里面的布局文件写完,对控件的了解和布局会更熟悉很多。遇到不了解的属性,就百度把他搞懂就OK。不过说句实话,这个app布局确实是丑,我本来打算做完在仔细优化一下界面,但我的指导老师说这个只是个demo,不要花过多时间。于是就没有做这项工作。 数据库的操作 我没有使用模拟器,而是直接使用真机做测试的。关于数据库的操作前需要使用数据线连接到手机,并且首先必须要刷机之后才有root权限,才可以将手机里面app的数据库导出来查看,在android s tudio ->tools->android->android Device Moniter ,点击之后会看到手机的模拟器,点击文件一般的数据库目录都是data目录下面的data目录中对应appd的包中,然后就可以导出来查看数据库。

(完整版)Android应用开发期末考试题

试题 一、选择题 1 android虚拟设备的缩写是(AVD) 2 Android SDK目前支持的操作系统(DOS) 3 Android开发工具插件(ADT)没有提供的开发功能(自动更新) 4Android SDK提供一些开发工具可以把应用软件打包成Android格式文件(APK) 5 Android当中基本的所有的UI都是由(view)或者其子类实现的 6以下不是Android中调试项目的正确步骤(测试用例) 7下列不是Activity的生命周期方法之一的是(OnResume) 8以下可以做EditText编辑框的提示信息是(adroid:hint) 9以下不是Activity启动的方法是(gotoActivity) 10以下不是手机操作系统的是(windows vista) 二、填空题 1 Android平台由操作系统,中间件,用户界面和应用软件组成的。 2 Android平台提供了2D,3D的图形支持,数据库支持SQLite,并且集成了浏览器 3目前已知的可以用来搭建Android开发环境的系统有windows,Linux,Mac 等4开发中推荐使用的IDE开发组合为IDE,eclipse,ADI来开发 5 Android SDK主要以java语言为基础 6创建工程时需要填写的信息名称有工程名,包的名字,Activity的名字还有应用的名字

7 Android.jar是一个标准的压缩包,其内容包含的是编译后的class,包含了全部的API 三、简答题 1 Android SDK中API的包结构的划分?至少五个 android.util,android.os,android.content,android.view,android.graphics,android.text 2 Android软件框架结构自上而下可分为哪些层? 应用程序(Application)、应用程序框架(Application Framework)、各种库(Libraries)和Android运行环境(RunTime)、操作系统层(OS) 3 Android应用程序的4大组件是什么? Activity、Broadcast Intent Receiver、Service、Content Provider 4 Android应用工程文件结构有哪些? 源文件(包含Activity),R.java文件,Android Library,assets目录res目录,drawble目录,layout目录,values目录,AndroidManifest.xml 5 Android开发应用程序最有可能使用到的应用框架部分是哪些? 一组View(UI)组件,Content Providers,Resource Manger,Notification Manger,Activiy Manger 6 Android底层库包含哪些? 系统C库,媒体库,Surface Manager,LibWebCore,SGL 四、编程 1实现点击一个按钮,结束当前Activity并将需要返回的数据放置并关闭当前窗体请编写核心代码 Bundle bundle = new Bundle ( ); Bundle.putString(“store”,”数据来自Activity1”) ;

Android学习笔记46:使用Post方式提交数据

Android学习笔记46:使用Post方式提交数据 在Android中,提供了标准Java接口HttpURLConnection和Apache接口HttpClient,为客户端HTTP编程提供了丰富的支持。 在HTTP通信中使用最多的就是GET和POST了,GET 请求可以获取静态页面,也可以把参数放在URL字符串的后面,传递给服务器。POST与GET的不同之处在于POST 的参数不是放在URL字符串里面,而是放在HTTP请求数据中。 本文将使用标准Java接口HttpURLConnection,以一个实例演示如何使用POST方式向服务器提交数据,并将服务器的响应结果显示在Android客户端。 1.服务器端的准备 为了完成该实例,我们需要在服务器端做以下准备工作: (1)我们需要在MyEclipse中创建一个Web工程,用来模拟服务器端的Web服务,这里,我将该工程命名为了“myhttp”。 (2)修改该工程的“index.jsp”文件,添加两个输入框和一个提交按钮,作为该Web工程的显示页面。运行Tomcat,

在浏览器中访问该Web工程,可以看到如图1所示的界面。 图1 Web工程的显示页面 (3)在该Web工程中,创建一个继承自HttpServlet的LoginAction类,并实现其中的doPost()方法,用来响应图1所示页面的用户操作。具体实现如下: 1 public void doPost(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 4 response.setContentType("text/html;charset=utf-8"); 5 request.setCharacterEncoding("utf-8"); 6 response.setCharacterEncoding("utf-8"); 7 PrintWriter out = response.getWriter(); 8 9 String username = request.getParameter("username"); 10 String password = request.getParameter("password"); 11

《Android程序设计》期末试题B

一、判断题(每小题2分,共10分) 1、Android是J2ME的一个实现。() 2、View是ViewGroup的子类。() 3、一个Intent可以包含多个category。() 4、Android系统下的文件,可以被本系统里的所有应用程序访问。() 5、无论Service是以启动方式还是绑定方式运行,该Service类都要重写onBind 方法。() 二、单项选择题(在每小题的四个备选答案中,有且只有一个正确答案,请将正确答案的序号填在题干的括号内。每小题2分,共20分) 1、下列关于继承的哪项叙述是正确的?() A、在Java中类允许多重继承 B、在Java中一个类只能实现一个接口 C、在Java中一个类不能同时继承一个类和实现一个接口 D、在Java中接口允许继承自另一个接口 2、以下哪种方式不能退出当前活动状态的Activity?() A、调用finish()方法 B、单击(返回)按钮 C、单击(回到桌面)按钮 D、Activity运行时出现异常 3、对于TextView,使用哪个属性来设置显示的文本?() A、android:textSize B、android:text C、android:textColor D、android:string 4、要处理Button的点击事件,需要注册哪个监听器?() A、OnClickListener() B、OnButtonClickListener() C、OnButtonListener() D、OnItemClickListener() 5、浏览网页使用的Intent的Action是什么?() A、ACTION_CALL B、ACTION_EDIT C、ACTION_SEND D、ACTION_VIEW 6、Android 关于启动方式的service生命周期的onCreate()和onStartCommand()方法,说法正确的是()

安卓开发学习笔记

1.avd:android virtual device 2.5554:模拟器端口号 3.ddms 观察线程thread 堆栈heap 、file explorer、emulator control(模拟打电话发短信) 4.Extras文件夹拓展工具 5.Adb.exe: android debug bridge 安卓调试桥 6.Adb常用指令:(配置环境变量) 1)adb devices:列出所有连接设备 2)Reset adb:重启adb调试桥 3)Adb kill-server:杀死adb调试桥 4)Adb start-server:启动adb调试桥 5)Netstat -ano:查看端口号 ----------------------------------------------------------------------------------------- 7.Platforms是系统文件 8.Assets是资产目录存放在该文件夹下面这些文件会被打包到应用程序的apk 9.Bin 编译后的文件目录 10.Gen自动生成的其下的R.java的内容也是通过修改其他文件内容而自动生成 11.Android.jar基于此jar包的开发 12.Project.properties 代表编译的版本可以修改 13.Libs 支持jar 包会被添加到Android dependence(依赖)目

录下 14.Res 资源目录 15.Drawable存放应用程序图标会自动生成一个id 在R文件里 1)H high 高分辨率 2)M middle 中分辨率 3)L low 低分辨率 4)X extra large 特大分辨率 5)Xx 超大分辨率 16. R文件的作用:自动编译生成res文件中的ID 17.Android manifest:应用程序的清单文件 程序的配置信息启动的图标应用程序名称包名版本号 -------------------------------------------------------------------------------------- 18.Android下软件安装的过程: 1)拷贝xxx.apk到/data/app/xxx-1.apk 2)在data/data目录下创建一个文件夹文件夹名称是当前应 用程序的包名。 3)软件卸载的过程是相反的 19.system/app下安装的是系统自带的应用 20.Windows下注册表是通过数据库实现;Android下的注册表是用xml文件实现

Android学习笔记十九之Menu菜单

Android学习笔记十九之Menu菜单之前我们已经学习过Android的基本UI控件和Android的五大布局LinearLayout线性布局、RelativeLayout相对布局、FrameLayout帧布局、GridLayout网格布局和TableLayout表格布局,下面我们来学习Android的其他控件,这些控件能让我们的APP更加友好和人性化。 Menu菜单 今天我们来学习第一个友好交互控件,Menu菜单。在AndroidOS中,Menu菜单有三种,分别是:OptionMenu(选项菜单)、ContextMenu(上下文菜单)和SubMenu(子菜单)。下面我们分别来介绍一下它们。 OptionMenu选项菜单 OptionMenu是Android中最常见的菜单,通过手机上的Menu键可以唤出。使用方法非常简单,只需要重写onCreateOptionsMenu(Menu menu)和onOptionsItemSelected(MenuItem item)这两个方法即可,前者是OptionMenu创建的时候调用,完成初始化,只调用一次;后者是菜单项被选中是触发的事件,在这里完成Menu选项事件处理。除了这两个方法之外,我们还可以重写OptionMenu的以下三个方法:onOptionsMenuClosed(Menu menu)菜单关闭时候回调方法、onPrepareOptionsMenu(Menu menu)菜单显示前回调方法、onMenuOpened(int featureId, Menu menu)菜单打开之后回调方法。 下面我们通过一个例子说明: Activity代码: package com.example.menudemo; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; /** * Created by Devin on 2016/7/4. */ public class OptionMenuActivity extends AppCompatActivity { private final static int BASKETBALL = 10001; private final static int FOOTBALL = 10002; private final static int VOLLEYBALL = 10003; private final static int BALLOON = 10004;

Android学习笔记_SIM卡介绍

Android学习笔记_SIM卡介绍 一、判断SIM卡属于哪个移动运营商 1、第一种方法:获取手机的IMSI码,并判断是中国移动\中国联通\中国电信 TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); /**获取SIM卡的IMSI码 * SIM卡唯一标识:IMSI 国际移动用户识别码(IMSI:International Mobile Subscriber Identification Number)是区别移动用户的标志, * 储存在SIM卡中,可用于区别移动用户的有效信息。IMSI由MCC、MNC、MSIN 组成,其中MCC为移动国家号码,由3位数字组成, * 唯一地识别移动客户所属的国家,我国为460;MNC为网络id,由2位数字组成, * 用于识别移动客户所归属的移动网络,中国移动为00,中国联通为01,中国电信为03;MSIN为移动客户识别码,采用等长11位数字构成。 * 唯一地识别国内GSM移动通信网中移动客户。所以要区分是移动还是联通,只需取得SIM卡中的MNC字段即可 */String imsi = telManager.getSubscriberId(); if(imsi!=null){ if(imsi.startsWith("46000") || imsi.startsWith("46002")){//因为移动网络编号46000下的IMSI已经用完,所以虚拟了一个46002编号,134/159号 段使用了此编号 //中国移动 }else if(imsi.startsWith("46001")){ //中国联通 }else if(imsi.startsWith("46003")){ //中国电信

第一行代码Android学习笔记完全版

第一行代码Android学习笔记 感谢《第一行代码》,感谢郭霖博主,拯救我于水火。之前看视频学习Android,自以为已经小成了。在网易工作的朋友问了我几个问题,我就懵逼了。然后,遇到了《第一行代码》,终于把我带进了Android的世界。好书,真的会醉人啊。 这是学习第二遍时的部分笔记,以备后用。 这是第二版,比第一版增加了一些常用的方法。 hujunjob 于北航 2015.04.02

目录 第一章Android系统 (6) 1.1 安卓系统架构 (6) 1.2 Android 项目中的资源 (6) 第二章Activity (6) 一、创建Activity步骤: (6) 二、采用Intent切换activity (7) 1、显式Intent (7) 2、隐式Intent (7) 3、隐式Intent的其他用法 (8) 三、Intent传递数据 (8) 1、向下一个activity传递数据 (8) 2、返回数据给上一个activity (8) 四、activity的生命周期 (9) 1、活动状态 (9) 2、activity生存期 (9) 3、activity被回收数据保存 (11) 五、activity的启动模式 (11) 六、activity最佳实践 (11) 1、知道当前页面是哪一个activity (11) 2、随时随地退出程序 (11) 3、给每个activity都添加一个合适的启动方法 (13) 第三章UI (13) 一、常用控件 (13) 1、TextView (13) 2、Button (13) 3、EditText (13) 4、ImageView (14) 5、ProgressBar (14) 6、AlertDialog (14) 7、ProgressDialog (15) 二、基本布局 (15) 1、LinearLayout (15) 2、RelativeLayout (15) 3、FrameLayout (15) 4、TableLayout (15) 5、GridLayout (16) 三、自定义控件 (16) 1、添加自定义标题布局(无操作的) (16) 2、创建自定义控件 (16) 四、ListView (17) 1、最简单的Adapter (17) 2、定制ListView界面 (18)

android期末考大题(沈阳师范大学)

1.SQLite数据库 public class MySqliteDB extends SQLiteOpenHelper { public MySqliteDB(Context context, String name, CursorFactory factory,int version) { super(context, name, factory, version);} public void onCreate(SQLiteDatabase db) { db.execSQL("create table if not exists people ("+"pid integer primary key,"+ "pname text,"+"page integer)");} public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}} public class MainActivity extends Activity { Button btn;MySqliteDB mydb; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.360docs.net/doc/a118247382.html,yout.activity_main); mydb=new MySqliteDB(this, "MyDB", null, 1); btn=(Button)findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { public void onClick(View v) { SQLiteDatabase db=mydb.getReadableDatabase();}});} public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true;}} 2.添加ToggleButton public class Example_55 extends Activity{ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(https://www.360docs.net/doc/a118247382.html,yout.main); ToggleButton toggleButton = (ToggleButton) findViewById(R.id.toggleButton); toggleButton.setChecked(true); 3.Spinner下拉列表框

Android Alarm学习笔记

设置一个Alarm需要更新一下数据。 1. update alarms.db 2. update com.android.alarmclock_preferences.xml 3. update Settings.System.NEXT_ALARM_FORMATTED for status bar 4. set Kernel RTC alarm or send a message if no driver 具体的函数调用如下所示: com.android.alarmclock.AlarmClock.onCreate() -> SetAlarm.onPreferenceTreeClick() -> SetAlarm.saveAlarm() -> Alarm.setAlarm() -> Alarm.setNextAlert() -> Alarm.enableAlert(ALARM_ALERT_ACTION)/saveNextAlarm(Settings.System.NEXT _ALARM_FORMATTED) -> android.app.AlarmManager.set() -> AlarmManagerService.set() -> AlarmManagerService.setRepeating -> AlarmManagerService.setLocked() -> android.app.IAlarmManager.set() -> RTC.save()// /dev/alarms Alarm闹铃的函数调用如下所示: RTC (WAKEUP) -> AlarmReceiver.onReceive(ALARM_ALERT_ACTION) -> AlarmAlert.onCreate() -> AlarmAlertWakeLock.acquire()/KeyguardManager.newKeyguardLock().disableKeyg uard() -> AlarmKlaxon.postPlay() -> AlarmKlaxon.KillerCallback().onKilled() -> AlarmAlert.dismiss() -> AlarmAlertWakeLock.release()/KeyguardManager.newKeyguardLock().reenableKey guard() DeskClock App中的code block说明如下: Alarm是描述闹钟的抽象类。 AlarmAlert处理闹铃过程中系统相关的事件,继承AlarmAlertFullScreen。AlarmAlertFullScreen显示闹铃界面,并处理闹钟界面上到控件消息。AlarmAlertWakeLock提供控制wakelock接口。 AlarmClock闹钟界面,包括闹钟列表、数字时钟、option菜单。 AlarmKlaxon是一个服务,提供闹铃和震动功能,如果一个闹铃fire,前面一个闹铃已经在闹来,则取消前面那个,闹后来者。 AlarmPreference闹铃文件。 ContentProvider维护闹钟表,字段包括_id、hour、minutes、daysofweek、alarmtime、enabled、vibrate、message、alert。 Alarms提供了操作闹钟的接口,相当于AlarmManager。enableAlert()设置一个闹钟,用的是PendingIntent到方式计算时间。RTC的设置在enableAlert()的am.set(AlarmManager.RTC_WAKEUP, atTimeInMillis, sender); RTC_WAKEUP表示该Alarm如果在关机的情况下来到,则会自动开机闹铃。 DeskClock桌面时钟到activity。其中包括了系统时间、日期、电池及天气等信息,其中天气信息是判断是否存在提供天气信息的app后,从数据库中读取当前的天气信息来更新。也就

相关文档
最新文档