安卓学习第一天

时间:2022-12-28 12:30:11
2G   2.5 gprs 最大下载速度 30KB
3G hsdpa 7.2M
4G 35Mbps

ophone 基于android改版的操作系统


3G的基带带宽
联通6M 6M/100 600K
移动 3.1M

中国电信 固定网络非常多
3G -> wifi


wap 2.5G 逐步被淘汰

net 互联网

3gnet


android : 操作系统 + 部分应用层软件的集合.

免费 开源.
移动 ophone android
米miui android
cymod

iptv
机顶盒 -> android

2.1 以上的版本 87%


sip通话的支持 : session setup protocol.
会话建立的协议.
ip通话 ip视频协议栈的支持

3.0 3.1 针对平板设计


2.2 2.3 进行开发
2.2 版本
2.3 版本 2.3模拟器


一年android 8K

1.5W

物流网


乐os




android 运行时
dalvik 虚拟机 跟 普通java虚拟机不一样
sun java虚拟机

普通java 虚拟机
.java->.class->解释执行

dalvik ->.class ->.dex
public static final String s="nihao":;

两个虚拟机之间的区别,



jdk 1.5 以上版本
如果使用eclipse3.7 版本 jdk> 1.6

ADT android development tools
android 开发工具



http://dl-ssl.google.com/android/repository/repository-5.xml
android-2.3.1_r02-linux.zip

http://dl-ssl.google.com/android/repository/android-2.3.1_r02-linux.zip

http://dl-ssl.google.com/android/repository/android-2.3.1_r02-windows.zip


usb 禁用.
搭建android开发



android 2.2 是google api的子集
如果使用 google 地图 google 纵横,则需要用到google API。
google api level 8


VGA 640*480 像素
hvga half vga 480*320
qvga 1/4 vga 320*240

WVGA 800* 480
FWVGA 854 * 480



luncher 桌面 相当于windows的桌面。


ddms dalvik debug manager system
dalvik 虚拟器调试系统

sysout();


安卓是分为两个不同的信道,这两个东西是不相干的,所以你打电话
和上网是没有关系的,不过出于一些的配置原因,一些开发商可能会
在打电话的时间将另外一个关闭掉。两种信道:data voice 两种信道。
android 手机 小电脑 可以上网 data
可以打电话的小电脑 可以打电话 voice


模拟器 和 虚拟机的区别是什么 ?


java 虚拟机
dalvik 虚拟机

虚拟机:是 软件模拟硬件 内存 cpu 显示器

android 很多版本
1.5~4.0
对应数字

1.5 -api 3
1.6 4
2.1 7
2.2 8
4.0 14
4.0.3 15



adb.exe android debug bridge android的调试桥

socket tcp



adb 的文件操作
把一个文件拷贝到手机内存

adb push [源文件] [目标文件]

adb push haha1.txt /mnt/sdcard/haha1.txt


adb pull [源文件] [目标文件]




[2012-03-09 10:33:00 - ddms]transfer error: Invalid argument
[2012-03-09 10:49:49 - DeviceMonitor]Adb connection Error:远程主机强迫关闭了一个现有的连接。
[2012-03-09 10:49:50 - DeviceMonitor]Connection attempts: 1
[2012-03-09 10:49:52 - DeviceMonitor]Connection attempts: 2
[2012-03-09 10:49:54 - DeviceMonitor]Connection attempts: 3
[2012-03-09 10:49:56 - DeviceMonitor]Connection attempts: 4
[2012-03-09 10:49:58 - DeviceMonitor]Connection attempts: 5
[2012-03-09 10:49:59 - DeviceMonitor]Connection attempts: 6
[2012-03-09 10:50:01 - DeviceMonitor]Connection attempts: 7
[2012-03-09 10:50:03 - DeviceMonitor]Connection attempts: 8
[2012-03-09 10:50:05 - DeviceMonitor]Connection attempts: 9

如果出现上面错误:
adb 连接的调试桥的socket出现了错误
1. adb kill-server

2. adb start-server


把电脑上的某个应用装(. apk)到模拟器或者手机里面
adb install demo.apk
Failure [INSTALL_FAILED_ALREADY_EXISTS]

卸载一个手机上的程序
adb uninstall [包名]



豌豆夹 91手机助手 qq手机管家 system32 adb.exe
这上面的所有软件能做的功能,都是通过ADB这个命令来做的。
在你的C盘的system32目录下面会多出adb.exe这个软件。
软件不过是对这些命令进行再包装。

因为你安装了第三方的软件,而它又在系统的环境变量里面,
所以安卓会优先用它,当版本不一致的时间会出现这些问题。

莫名其妙问题 adb 版本不兼容

adb version 查看adb的版本


adb devices 查看当前所有连接上来的设备信息


adb shell 来到模拟器或者是真机的控制台 ,其实就是来到了linux控制台下,
所有linux命令都可以这里面用。

ls 查看目录信息
ps 查看当前运行进程信息
kill pid 杀死进程



ctrl+F11 横竖屏切换



[2012-03-09 11:16:56 - HelloWorld] ------------------------------
[2012-03-09 11:16:56 - HelloWorld] Android Launch!
[2012-03-09 11:16:56 - HelloWorld] adb is running normally.
[2012-03-09 11:16:56 - HelloWorld] Performing cn.itcast.helloworld.DemoActivity activity launch
[2012-03-09 11:16:56 - HelloWorld] Automatic Target Mode: using existing emulator 'emulator-5554' running compatible AVD 'iphone'
[2012-03-09 11:16:56 - HelloWorld] Uploading HelloWorld.apk onto device 'emulator-5554'
[2012-03-09 11:16:56 - HelloWorld] Installing HelloWorld.apk...
[2012-03-09 11:17:00 - HelloWorld] Success!
[2012-03-09 11:17:00 - HelloWorld] Starting activity cn.itcast.helloworld.DemoActivity on device emulator-5554
[2012-03-09 11:17:02 - HelloWorld] ActivityManager: Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=cn.itcast.helloworld/.DemoActivity }



project.properties 指定开发使用的android.jar的版本 ,你更改后它会自动改变项目的jar包。

default.properties adt 和sdk 的版本过低 (用ADT15和SDK8是比较好的。)

proguard.cfg 程序发布时候的混淆 防止别人反编译

AndroidManifest.xml 非常重要 系统的清单文件
相当于 windows操作系统的注册表

R.java里面的每一个静态的东西,对就于资源文件,
第一,说明这是它的资源的引用。
第二、static 这种类型 dalvik虚拟机会对这种类型的数据类型给自动抽取出来,让大家
共同用,这是安卓虚拟机与安卓的代码方法相高互应的地方。
在配置文件里面调用资源文件时间,是调用的它的引用。为什么加个@很明显
它是在表示内部类。@string/appName,就表示在R文件下string这个内部类里面
的资源。其它的资源引用的原理含义一样。
R文件本身是一个final类,里面有非常多的内部类,表示资源的分类,而每有个内部类下面
又有非常多的具体资源的引用信息。用的时间引用即可。
@+id/et 就表示在R中id的内部类中加一个叫et的成员变量。


<uses-sdk android:minSdkVersion="9" /> android2.3 以下的版本不可以安装这个应用程序
[2012-03-09 11:25:32 - HelloWorld] ERROR: Application requires API version 9. Device API version is 8 (Android 2.2).
[2012-03-09 11:25:32 - HelloWorld] Launch canceled!

activity代表- 应用程序的界面


layout目录是程序界面的布局(activity)


DemoActivity
03-09 11:43:14.185: E/AndroidRuntime(1093): FATAL EXCEPTION: main
03-09 11:43:14.185: E/AndroidRuntime(1093): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{cn.itcast.helloworld/cn.itcast.helloworld.DemoActivlty}: java.lang.ClassNotFoundException: cn.itcast.helloworld.DemoActivlty in loader dalvik.system.PathClassLoader[/data/app/cn.itcast.helloworld-2.apk]
03-09 11:43:14.185: E/AndroidRuntime(1093): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
03-09 11:43:14.185: E/AndroidRuntime(1093): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
03-09 11:43:14.185: E/AndroidRuntime(1093): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
03-09 11:43:14.185: E/AndroidRuntime(1093): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
03-09 11:43:14.185: E/AndroidRuntime(1093): at android.os.Handler.dispatchMessage(Handler.java:99)
03-09 11:43:14.185: E/AndroidRuntime(1093): at android.os.Looper.loop(Looper.java:123)
03-09 11:43:14.185: E/AndroidRuntime(1093): at android.app.ActivityThread.main(ActivityThread.java:4627)
03-09 11:43:14.185: E/AndroidRuntime(1093): at java.lang.reflect.Method.invokeNative(Native Method)
03-09 11:43:14.185: E/AndroidRuntime(1093): at java.lang.reflect.Method.invoke(Method.java:521)
03-09 11:43:14.185: E/AndroidRuntime(1093): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-09 11:43:14.185: E/AndroidRuntime(1093): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-09 11:43:14.185: E/AndroidRuntime(1093): at dalvik.system.NativeStart.main(Native Method)
03-09 11:43:14.185: E/AndroidRuntime(1093): Caused by: java.lang.ClassNotFoundException: cn.itcast.helloworld.DemoActivlty in loader dalvik.system.PathClassLoader[/data/app/cn.itcast.helloworld-2.apk]
03-09 11:43:14.185: E/AndroidRuntime(1093): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
03-09 11:43:14.185: E/AndroidRuntime(1093): at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
03-09 11:43:14.185: E/AndroidRuntime(1093): at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
03-09 11:43:14.185: E/AndroidRuntime(1093): at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
03-09 11:43:14.185: E/AndroidRuntime(1093): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
03-09 11:43:14.185: E/AndroidRuntime(1093): ... 11 more
必须明白的:
安卓软件的启动流程首先会读取AndroidManifest.xml下面的信息,根据XML里面的
package="cn.itcast.activity"找到android:name=".HelloWorldActivity",即,找到
了某个包下面的某个类,上面的错误信息是因为配置文件错误没有找到。

由于清单文件的注册表的信息 配置错误 系统找不到对应的activity


<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
activity的一个配置信息
作用 在luncher(桌面)程序里面生成一个应用程序的图标
如果你把上面的配置信息给删除了,能够安装成功,但是不会在桌面上生成那个快捷方式 。
就像windows安装软件的时间不创建快捷方式,其实它已经安装成功,并且存在于硬盘上
只是你在桌面上无法直接打开。


如何把别人的项目导进来?


ctrl+H 搜索整个工程目录 选择file 搜索



这个错误说明它是权限被拒绝,就是没有权限的原因。
03-09 14:32:16.114: ERROR/AndroidRuntime(798): java.lang.SecurityException: Permission Denial:
starting Intent { act=android.intent.action.CALL dat=tel:110 cmp=com.android.phone/.OutgoingCallBroadcaster }

from ProcessRecord{44fc8cf8 798:cn.itcast.phone/10037} (pid=798, uid=10037) requires android.permission.CALL_PHONE
03-09 14:32:16.114: ERROR/AndroidRuntime(798): at android.os.Parcel.readException(Parcel.java:1247)
03-09 14:32:16.114: ERROR/AndroidRuntime(798): at android.os.Parcel.readException(Parcel.java:1235)
03-09 14:32:16.114: ERROR/AndroidRuntime(798): at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1298)
03-09 14:32:16.114: ERROR/AndroidRuntime(798): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1373)
03-09 14:32:16.114: ERROR/AndroidRuntime(798): at android.app.Activity.startActivityForResult(Activity.java:2817)
03-09 14:32:16.114: ERROR/AndroidRuntime(798): at android.app.Activity.startActivity(Activity.java:2923)
03-09 14:32:16.114: ERROR/AndroidRuntime(798): at cn.itcast.phone.MainActivity$MyButtonClickListener.onClick(MainActivity.java:40)
03-09 14:32:16.114: ERROR/AndroidRuntime(798): at android.view.View.performClick(View.java:2408)
03-09 14:32:16.114: ERROR/AndroidRuntime(798): at android.view.View$PerformClick.run(View.java:8816)
03-09 14:32:16.114: ERROR/AndroidRuntime(798): at android.os.Handler.handleCallback(Handler.java:587)
03-09 14:32:16.114: ERROR/AndroidRuntime(798): at android.os.Handler.dispatchMessage(Handler.java:92)
03-09 14:32:16.114: ERROR/AndroidRuntime(798): at android.os.Looper.loop(Looper.java:123)
03-09 14:32:16.114: ERROR/AndroidRuntime(798): at android.app.ActivityThread.main(ActivityThread.java:4627)
03-09 14:32:16.114: ERROR/AndroidRuntime(798): at java.lang.reflect.Method.invokeNative(Native Method)
03-09 14:32:16.114: ERROR/AndroidRuntime(798): at java.lang.reflect.Method.invoke(Method.java:521)
03-09 14:32:16.114: ERROR/AndroidRuntime(798): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-09 14:32:16.114: ERROR/AndroidRuntime(798): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-09 14:32:16.114: ERROR/AndroidRuntime(798): at dalvik.system.NativeStart.main(Native Method)



<uses-permission android:name="android.permission.CALL_PHONE"/>


权限就是用来保护用户隐私的 ,因为如果一个项目中需要权限的话,在安装界面会有提示。


为什么我们用豌豆和手机助手以及直接用开发工具项目部署不会出现这种情
况,是因为它首先是把
手机调整为USB调试模式,并且允许了未知来源的软件。

第一,Log有五种模式。
第二,tag通常与activity同名,并且是静态常量 。

意图就是一个载体,它包含了动作和数据。
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:"+number));
安卓中所有数据格式都是通过Uri对象类型来识别的。
parse可以把一个文本的字符串转换成一个字符串对象。

优化代码 :
EditText edt = (EditText) findViewById(R.id.etnum);
这句代码其实是十分费时的,所以写这些组件的时间把它
放在成员变量上。

--View是所有组件的老大,就相当于Object这个的东西。

--点击事件有四种写法。其中回调是企业中用的最多的。

--TextView也可以响应点击事件,不过要加一个属性配置。
bt.setOnClickListener(this);
public void onClick(View v) {
switch (v.getId()) {//switch里面的函数是指传进来的变量。
case R.id.call:
edt = (EditText) findViewById(R.id.etnum);
String number = edt.getText().toString();
Log.i(tag, number);
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:"+number));
startActivity(intent);
break;
}

}
企业中用的处理点击事件的方法,这样更加方便,因为如果特别多的按钮时间,你就利用选择
可以非常方法的处理非常多的点击事件。不过它要实现那个OnClickListener接口。这就是回调,
JAVA会自己处理,自动知道什么时间该调用哪个方法 ,因为被回调的方法都已经准备好了,
只是系统决定在什么时间调用它,而不用我们决定。

--清单配置点击事件:
android:onClick="btn_click"

public void btn_click(View v){//注意千万不要忘记参数,否则它就不知道是谁被点击了。
edt = (EditText) findViewById(R.id.etnum);
String number = edt.getText().toString();
Log.i(tag, number);
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:"+number));
startActivity(intent);
}

android:onClick="textView_click"
android:clickable="true"
public void textView_click(View v){//参数很有用。
Log.i(tag, "文本被 点击 ");
}

--学会debug它。
--真机如果不能够调试,加android:debuggable="true";


---android工程的打包过程(见PPT21)
一、其实是appt这个工具在起作用。步骤如下:
1):它会所所有JAVA文件先转换成class文件,然后
编译成dex文件,在这个过程中,会把所有的共有变量
抽取出来(static String final),然后结合配置文件
生成apk文件,它与zip是的模式是一样的,可以直接变换
格式,在生成的过程中,会对AndroidManifest.xml
进行加密。

--上下文其实就是全局的一个对象 ,一个变量,所有编程中上下
文都是这个东西。

--SmsManager老的包里面已被废弃,新的可以支持GSM和WCDMA.
android.telephony.SmsManager;这个是新的。

--不记得权限怎么写了,就让它报错,然后看看是什么错误 。

--一条短信的最大限度 ,divideMessage()的原理?看源码。多看源码 。

这个写法要记着:
private static SmsManager sInstance;
//获得它的实例,如果是静态的都是这样搞的。
public static SmsManager getDefault() {
if (sInstance == null) {
sInstance = new SmsManager();
}
return sInstance;
}
---写SMS的遇到的问题
1、SmsManager新老问题
2、权限问题,通过报错可获得需要什么权限。
3、长度限制问题。



调试真实手机
1.安装驱动

htc
nexus s
LG


找适合你手机的驱动程序.

豌豆夹 91手机程序




LinearLayout 线性布局 ---所有的组件都是被一条直接给串起来,根据判断
看看它是水平串还是垂直串.
AbsoluteLayout 据对布局 被安卓的SDK给废弃掉,做屏幕适配非常麻烦,但是
在游戏开发里面大量使用它 .
qq斗地主 854*480 apk 800*480 apk
RelativeLayout 相对布局 ---适配各种屏幕比较方便.
FrameLayout 帧布局 类似div层,所有的帧布局都是从左上角开始的.每个控件相当于一个
DIV,并且都是从左上角开始的.
tablelayout 表格布局

安卓
px (pixels)像素
一般HVGA代表320x480像素,这个用的比较多。

dip或dp (device independent pixels)设备独立像素
这个和设备硬件有关,一般为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。

sp (scaled pixels — best for text size)比例像素
主要处理字体的大小,可以根据系统的字体自适应。

除了上面三个显示单位,下面还有几个不太常用:
in (inches)英寸
mm (millimeters)毫米
pt (points)点,1/72英寸

结论:为了适应不同分辨率,不同的像素密度,推荐使用dip ,文字使用sp。