android笔记

来源:互联网 发布:简易论坛源码 编辑:程序博客网 时间:2024/04/26 05:59
上一篇     下一篇共18篇  

编辑 | 删除【android笔记】(1)主页君翻出自个安卓学习笔记与大家分享,菜鸟瞅瞅,老鸟勿喷~2013年02月09日 23:01:33

/*

*@Copyright Michael

*Mail: cn_wk@hotmail.com

*版权木有

*欢迎前辈予以斧正

*错别字很多很多.... 介个就表提了哈

*/

2013_2_1_CZBK_05

认识各个文件 以及了解程序的创建和启动过程。

r 文件 各种资源的id 可以通过id 的引用来 程序猿不能手工修改维护r文件它是由开发工具来维护的

res 来存放图片、软件的界面、文字等资源文件 
    drawable 是用来存放图片资源的 为了适配不同屏幕,它提供了高中低三个文件夹,来存放不同的资源 


values 应用中使用的数据,如文字、尺寸、颜色 


<resoures>
 <string name = "itcast">传智播客</string>
</resoures>
<string name= "zhangxx">张老师</string >
应用中用的文字比较多的时候 可以放到别的文件中。

loyout 
新建 android xml 文件 添加完后 打开r文件 界面文件会在layout中添加一条记录。
res下默认三种文件类型  那些没有创建出来呢》anim 动画效果 xml应用中的sml数据 raw存放原生文件 音效、静态文件等等
只要在res中放入的资源都会在r文件中生成id
assets 文件夹也是存放文件的 但是在这个文件夹中放入的文件 不会生成资源的id  要用文件的路径 访问

properties 告诉开发工具是面向android那个版本进行开发的,叫做项目的配置。
AndroidMainfest 叫做项目的清单文件 在这个文件中列出了项目具有的功能,还有列出了系统自带的服务,如拨号服务、短信服务等等权限。
四大组件 要在清单文件中进行配置。

package 包名 用于项目的唯一标识。
versionCode 版本号 
versionName 版本名称 
application  icon 应用的图标 android:icon ="@drawable/icon" @相当于r文件 
修改后,最好关掉,应为打开部署的时候会比较慢。
android:label 应用的名称 
activity 这个节点专门用来配置activity这个组件 activity代表窗口,一个activity代表一个窗口。

activity android :name = ".MainActivity" .代表当前应用所在包 
activity 组件一定要放在应用所在包里面。
label 指定activity所在窗口的标题。
intent-filter 意图过滤器 对数据进行过滤 如果匹配 干一些事情 否则 不干
匹配你要做的事情
   action 动作名称  指定程序的 入口activity
   category 类别

   这两项 安卓系统已经赋予它功能 就是把应用中activity显示在程序启动列表中,如果没有这两行,即使安装了,也不会出现在程序的启动列表中
对于这两项参数,它仅能出现在一个activity中,因为一个程序只能有一个主入口。

uses-sdk


清单文件是在软件安装的时候被读取的,而不是在运行时读取的。就好像是注册表那样。

应用的安装与气动过程,当我们安装到模拟器上,java的编译器会把.java文件编译成.class文件--dx->.dex--->打包(签名)--->.apk


bin文件夹会看到dex文件,它会把所有类编译到.dex文件

接下来打包操作,把.dex文件和资源进行打包,打包成一个压缩文件,进行签名


签名的密钥 build 中 
default debug keystore 密钥文件存储

adb install c:\xxx.apk

 


启动过程

当用户点击图标(入口activity),即激活activity,系统找到入口act,ivity,对activity进行实例化,如果是第一次打开,系统会创建一个进程 然后再开一个线程,这个线程会通过配置文件对它进行实例化

MainActivity


实例化后,会调用onCreat方法把它放在任务zhan中。

 

即创建线程---》创建主线程---》在主线程中实例化activity--(操作系统会把应用有关的信息(Context)存放进Activity中,然后调用OnCreat())

 

 

 super.oncreate 调用父类的生命周期方法
 setContentView  显示软件界面(因为activity是一个窗口, activity在窗口上显示软件界面)

 布局 
 linerlayout 线性布局 把控件以水平或垂直方式摆放。 android:crientation  摆放方式 layout_width fill_parent 填充窗口(顶级元素)的。。 fill_wrap content 包裹内容 即内容有过高,显示控件有多高

android:text = "@steing/hello"使用hello这个常量所指向的资源显示在屏幕上。
  relativelayout 相对布局
 


px dip dp sp
文字 sp 
非文字 dp

 

 

 

 2013_2_2_CZBK_06

开发步骤  首先设置软件界面 打开main.xml 默认是垂直的线性布局 里面有<textview 文字显示控件 android:text
/>
EditText 文本输入框显示控件

Button 按钮
android:text

按钮没有显示文字 开发工具的问题 这时候可以把应用部署到模拟器上


为了找到按钮 ---》 定义id android:id="@+id/button"

然后打开activity 当setContextView 显示窗体后,this.findViewById(R.id.button);

EditView  TextView Button 最终父类都是View

把它转换成button

Button button = (Button) FindViewById

 

 

查看源代码 sdk 放在android-8中 奖励sources文件夹 放入下载好的问价源代码  下载android源代码下载工具 (看视频)


调用 button.setOnClickListener();
  private final class ButtonClickListener implements View.OnClickListenmer

把要拨打的号码传给拨号器的activity,了解电话拨号器使用哪个activity ,查看其源代码,Phone文件夹,把项目打开,查看项目清单文件,找到到底是哪个activity实现电话拨号功能,只要能激活这个activity,并且把电话号码传给它,总共定义了三个意图过滤器,只要提供意图对象跟里面的过滤器匹配
uil以tel开头,提供数据跟意图过滤器匹配。

Intent intent = new Intent();
intent.setAction(把指定的动作名称拷进去);
intent.addCategory(把类别拷进去);
intent.setData(把数据传进去Uri.parse("tel:......"));
startActivity(intent);//方法内部会自动为Intent添加类别:。。。第一个拷进去的 所以第一个那个类别可以删掉

把意图传给操作系统,只要有一个意图过滤器跟意图匹配就能激活相应的activity

activity申请了权限,所以需要把权限拷到项目的清单里 uses-...

谷歌为了保护用户的隐私,或者安全,要求软件出示权限,一旦出示权限,正常安装软件时,就会向用户提示。但是在模拟器中,是部署软件到模拟器上的,是特殊的方式,所以没有提示。

定义成内部类,加载的时候会快一些,提高效率。

 
出现 absorbing build 基本上是因为拼错了单词

如果使用EditText 会出现灯叉 这时候需要引入android.widget.EditText包

 

 2013_2_2_CZBK_07

主要学习了 怎么用log cat 、 devices、 file explorer


log cat windows---show view---log cat
 cdiwe 可以筛选 根据pid 
把应用部署到手机上 第一步 把手机的驱动安装到电脑上


打开设备管理视图  devices 把手机插进去 设备就会出现在视图里。
如果看不到手机,说明驱动安装失败。


下载个屏幕监视工具 android screen monitor   
邮件 run as 。。   双击设备才能看到设备的安装


要把已经写好的软件发布出去 然后用户怎么安装软件 邮件 export 用程序员 或者公司的密钥来签名 。。
 
把文件放进sd卡里面,windows ---view---file explorer

放进sd卡以后,就可以在手机里,对它进行安装。 在安装软件时,有提示,需要。。。服务。因为软件中申请使用了权限。

 

 2013_2_2_CZBK_08

开发一个短信发送器。

先main -- 添加string --- 先把所有的显示控件找到---把两个文本框放到activitiy中区,因为会面的内部类会访问这两个变量。
---为按钮设置点击事---从输入框中取得用户输入内容

要文本输入框 至少显示三行文字 android:minlines

final 不需要被继承


发送短信 用到sms类  先得到短信管理器对象 Sms

smsManager manager = SmsManager.getDefault

divide。。。对短信的拆分
sentIntent deliveryIntent

ArrayList<String>texts = manager.divideMessage(content);//自动拆分
 for(String text: texts)
{
}

 

 

manager.sendTextMessage(number,null.text,sentIntent,delibewryIntent)

第四个参数 用于得到发送的状态 是否成功发送

第五个     用于得到是否收到短信的状态

需要移动网络返回电信号得知的

所以方法内部采用异步处理这个行为 一旦返回 api会根据电信号对外发送一个广播,然后把结果存到广播里,可以接受广播,然后得到这三个状态

 

 


开发者指南 dec guide 用户通知  土司通知 状态栏通知 对话通知

 

突袭)*(toast)通知

 

Toast.makeText(外部类.this,R.string.....,Toast.LENGTH_SHORT).show();

 


content 上下文信息 就是与应用有关的信息

上下文对象可以通过调用 getApplicationContext()这个api得到,也可以把当前mainactivity这个对象传过来,因为activity最终父类是content

 

 


在内部类里访问外部类的对象 外部类.this

 


Mainfest


Refernece  android  permisssion   然后Ctrl+F send sms...

点一下这个常量 SEND_SMS看看它所指向的权限 然后回到清单文件出示这个权限
<uses-permission ....>

 

 2013_2_4_CZBK_09

 

深入了解布局技术

 

线性布局

 

相对布局
 看文档 先看例子和代码
 android: background 设置背景

 

 android:padding 控件里面的内容离控件四条边的间距  (内间距)
 
   android.R 操作系统的R文件
 android:layout_below="@id.label"在。。。下面
 android:layout_alignParentRight 在父元素的右边
 android:layout_alignTop="@id/label1"与label1的顶部  对齐
        android:layout_marginLeft="5dp"定义此控件与左边的  像素为5dp
 _toLeftof=

 


 <RelativeLayout>
 定义id---android:layout_toRightOf="@id.nubmr..."
 如果两个在一排的显示控件的宽度相同,则有一个显示控  件看不见,所以我们定义一个显示控件宽度为100dp
 对齐 _layout_alignTop 与。。。的顶部对齐
 控件之间的间距  _layout_margininLeft ="5dp"
  />
 把界面部署到模拟器上

 

表格布局

 

 TableLayout
  根元素要有命名空间
 android:stretchColums="1"表示单元格可以被拉伸
 
   <TableRow></TableRow>没出现一次 代表有一行,其中每 行中有多少个显示控件就代表有多少列

 

帧布局 FrameLayout
 多个画面叠加在一起

 

 

 

 


 2013_2_5_CZBK_10

 

对应用进行单元 测试Junit框架

 

JuintTest  单元测试的目的是检查程序执行过程、处理结果是否正确

 

service 类里面
  public void save(String username)
 String sub= username.
新建等待测试的业务类 PersonService

 

为应用引入单元测试  先引入单元测试的环境 
打开清单文件 把<uses-library android:name="android.test.runner"/>拷到application里面
把单元测试框架里面的依赖库 引入到项目中。
<instrumentation android:name="android.test.instrumentationTestRunner"
android:targetPackage ="cn.itcast.action"android:label="Test for my app"/>
配置单元测试框架下的一个启动装置 它的启动装置有好几个类

 


android:targetPackage 应用的包名

 

 

 

写单元测试用例  需要继承单元测试下提供的父类  继承AndroidTestCase ,在类里面编测试方法 方法名称一定要以test开头,一定要抛异常  这个例外因为这个类只在测试框架下执行的,所以抛给测试框架 由测试框架捕获到意外
以图形(颜色)的方式显示执行的结果。

 

 

 

Assert.assertEquals(3,actual);

 

打开大纲视图 outline 在测试方法上点击 Run as -- android JUint Test

 

 

 

 

 

other JUintTest  创建针对于某个项目的测试项目 测试环境会自动给配置好

 

 

 

2013_2_6_CZBK_11

查看日志 输出日志信息

Console 打印错误信息 但是对于android 这个视图,只可以显示软件安装信息,
可以通过logcat来查看错误信息 pid是信息所在进程的id


ERROR > WARN > INFO >  DEBUG > VER


creat filter 添加筛选器

输出日志信息
第一种方法
private static final String TAG ="LogTest";
public void testOutLog() throws throwss Thrwable{
    Log.i(tag,"Michael");

第二种方法
System.out.println("com.Michael");默认的日志tag为System.out 级别为info
System.err.println("sdfdsfsdf");默认输出警告级别的信息

尽量使用第一种方法,因为后两种方法级别都是固定的

如果是中文 则出现乱码 ,因为视图不支持中文。

 

 

 

2013_2_8_CZBK_12

数据的存储与访问


文件 io技术
参数
sqlite数据库
内容提供者
网络

创建一个android项目

文件操作

Ui---找到按钮 添加点击事件处理


把业务层写在业务类中。

 

FileService service = new FileService();
service.save(filename,content);

Toast.makeText(getApplicationContext(),T.string.success.1).show();


在业务类里面添加注释

酱紫 MainActivity这层的代码就完成了。


接下来 打开save方法,采用io技术实现文件的保存

首先得到文件的输出流对象 FileOutputStream outStream = content.openFileOutput(name,Context.。。。);

第一个参数文件名称,不要带路径
第二个参数用于指定文件的操作模式 文件有几种行为 以追加的方式、覆盖的方式写文件 另外文件还有访问权限的控制 
如果希望创建出来的文件只能被本文件访问,并且覆盖 采用私有操作模式


outStream.write(getByte());
outStream.close();


数据时以2禁制写到文件中,所以要把字符串转换。。。。getByte()

 

 


android 上下文对象中提供了一个方法可以迅速的得到输出流对象


private Context context;

 

 

私有操作模式 创建出来的文件只能被本应用访问,其他应用无法访问该文件,另外采用私有模式创建的文件,写入文件中的内容会覆盖原文件内容

对外声明抛出意外,所以要捕获,但是不在方法中捕获,如果代码出现问题,希望王外抛出 最用例外会被抛给最外层,也就是使用(调用)了业务类的这一层 。例外抛给 activity ,由activity给用户提示保存失败的显示。


(打开了activity)
捕获这个例外 如果失败给用户添加一个保存失败的显示

 

 

 

 


应用产生的数据

data/data

默会保存在包底下

保存 出错 擦一下 logcat指一下 显示 16行 空指针 因为没有 最好通过构造器来给他复制 因为如果set给他赋值,有时候会忘记调用方法赋值 所以下面 我们生成一个构造器 使用


source --- Generate Costructor using fileds

 

回到activity 使用getApplicationContext()把上下文对象传进去


当我们采用


接下来我们 用到输入流


写一个方法


public String read(String filename) throws Exception{
 ByteArrayOutputStream outStream = new ByteArrayOutputStram();
 FileInputStream inStream = context.openFileInput(filename);
 byte{}buffer = new byte[1024];
  int len =0;
 inStream.raed();//假设读不完 把缓存区填满了,数据类型会返回。只要没读完 这个方法是不断调用的 如果读完 返回值是-1 否则是读进去的数据葛苏 所以做个判断 只要len不是-1就没有读完
 
 return null;

 

}


网内存输出的输出流对象  ByteArrayOutputStream


把每次写的都读到内存中,然后再从内存中得到数据


outStream.write();


然后 byte data = outStream.toByteArray(); 从内存中获取数据

return new String (data);