Dalvik :基于寄存器,编译和运行快
Jvm:基于栈,编译运行慢
字节码区别:
Dalvik:执行.dex格式的字节码,是对.class文件进行压缩后产生的,文件变小
Jvm:执行.class格式的字节码
运行环境:
Dalvik:一个应用启动都运行一个单独的虚拟机,运行在一个单独的进程
Mv:只能运行一个实例,所有应用都在同一个jvm中
资料下载地址:http://pan.baidu.com/s/1ntLpkm9
解决办法:
删除.android文件夹
配置环境变量:ANDROID_SDK_HOME=D:\android…../,,
解决模拟器运行慢的问题
模拟器如果是用的intel的cpu,可以安装加速器来提高运行速度:
IntelHaxm.exe
但有些电脑安装报错,需要进入BIOS设置开启CPU虚拟化后即可安装
--src(源码文件夹)
界面类
重写的方法:
onCreate:在当前类(activity)对象创建时自动调用;
这是个回调方法,不是我们调用的,是系统在一定条件下自动调用的,基本都是以on开头onXXX;这些方法我们只需重写。
调用父类处理一些默认的初始化工作:
super.onCreate(savedInstanceState);
设置窗口要显示的内容视图(界面/布局):
setContentView(R.layout.activity_main);
--gen(自动生成的源码文件夹)
R.java:对应res文件夹
Drawble:图片资源
Layout:布局
String:字符串常量
--res
Drawable-xxx:图片文件夹(为了适配不同分辨率的手机)
Layout:界面的布局文件(功能类似于html)
Values:常量文件夹
String.xml:包含固定的字符串,在布局中引用:@string/name
<?xml version="1.0" encoding="utf-8"?> <!-- Package属性:指定当前应用的唯一包名 versionName属性:指定应用的版本号 --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.yabushan.aidsservice" > <!--对手机版本进行要求 minSdkVersion:最小的版本,如果手机的版本小于此值,不能安装此应用 targetSdkVersion:最佳的版本,手机的版本可以大于此值 --> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="23" /> <!-- icon:应用的图标 label:应用的名称 theme:应用的主题 --> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme" > <!-- activity标签:配置我们的Activity类 name属性:全类名,可以省略包名部分,以点号开头 label属性:界面的标题 theme属性:指定activity以什么形式弹出 --> <activity android:name=".MainActivity" android:label="@string/app_name"> <!-- 意图过滤器:intent-filter 目的:让当前Activity成为主界面Activity LAUNCHER:发射器,category中设置它,应用图标才会显示在桌面上,才可以点击启用 --> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".SecondActivity" android:label="@string/app_name" android:theme="@android:style/Animation.InputMethod"> </activity> <!--服务,待补充--> <service android:name=".AppService" android:enabled="true" android:exported="true" > </service> </application> </manifest>
Android调试桥,是多种用途的调试工具,帮助管理设备或模拟器的状态
常用命令
Adb
adb shell
adb install –r apkPath 安装apk文件
DDMS :
ANDROID 开发环境中的dalvik虚拟机调试监控服务
Eclipse中提供的android应用开发的调试工具
DDMS的四个重要的视窗
Logcat:查看日志输出
File explorer :查看系统内部文件
Devices:显示关联的android设备
Emulator Control:操作控制关联的android设备
Log:
日志打印信息,四个级别:V W I E
手机的尺寸:屏幕对角线的长度,单位为英寸(63.5px)
手机的像素密度:每英寸屏幕能显示的像素数,像素密度越大,显示画面细节越丰富。
计算:像素密度=(1+(长度像素数-1)的平方+(宽度像素数-1)的平方)/屏幕尺寸;
DPI:每英寸所打印的点数或线数的缩写,用来表示打印机打印分辨率,但有时会用dpi来代替ppi
手机的密度:Denisty
尺寸单位:
1px:就是一个像素点的大小
Dp/dip:density-independent pixels(密度无关像素)
1dp=(dpi/160)px
1dp=density px
1px=1/density dp
Sp:scaled pixels(可缩放像素)与dp类似,但是可以根据用户的字体大小首选项进行缩放
Android在运行时会自动将dp/dip/sp为单位的尺寸转换为像素单位的值
Dp与px的比较:
以px为单位的长度,在差手机上会变大,在好手机上变小
以dp为单位则不会变化
Dp与sp的比较:
用户可以在系统设置中设置文本的大小;
如果字体大小使用sp为单位,设置有效果
如果字体大小使用dp为单位,设置没效果
注:
在布局文件视图的宽高尽量使用match_parent/wrap_content
如果必须指定特定值,使用dp/dip做单位
文本大小使用sp做单位
a、组件的类必须实现特定接口或继承特定类;
b、需要在配置文件中配置其全类名
c、组件的对象不是通过new来创建,而是系统自动创建
d、组件的对象具有一定的生命周期,他的类中有对应的生命周期回调方法
a、配置文件中配置全类名;
b、 布局文件定义标签;
c、显式意图:Intent(Context context,Class c)
用来提供一个能让用户操作并与之交互的界面
意图:信使(Ac)
显示意图:
明确指定的目标组件的意图;
创建对象:Intent(Context context,Class clazz)
何时使用:当操作当前自己应用的组件时使用
隐示意图:
没有明确指定目标组件的意图
创建对象:intent(string action)
何时使用:当操作其他应用的组件时使用
Intent
Intent(Context packageContext,Class<?> cls):用于创建显示意图对象
Intent(String action):用于创建隐示意图对象;
putExtra(String name,XXX value):保存额外数据
XXX getXXXExtra(String name):获取额外数据
setData(Uri data):设置有特定格式的uri数据;
Activity
startActivity(Intent intent):一般启动Activity
startActivityForResult(int reqCode,intent intent):带回调启动Activity
onActivityResult(int reqCode,int resultCode,intent data):回调方法
setResult(int resultCode,intent data):设置要返回的结果
finish():结束当前Activity
getIntent():得到启动Activity的意图
代码如下:
第一个页面以及布局文件
public class MainActivity extends Activity implements OnClickListener { private Button button1; private Button button2; private EditText editText; @Override protected void onCreate(Bundle savedInstanceState) { //调用父类的初始化方式 super.onCreate(savedInstanceState); //设置布局 setContentView(R.layout.activity_main); //获取要操作的对象 button1=(Button) findViewById(R.id.button1); button2=(Button) findViewById(R.id.button2); editText=(EditText) findViewById(R.id.EditText); //设置监听 button1.setOnClickListener(this); button2.setOnClickListener(this); } /** * 实现OnClickListener接口需要覆盖的方法 * param:v 发生事件的视图对象 * 由于下面两种返回方法中的1、2、3步骤相同,所以提取出来 */ @Override public void onClick(View v) { //1、显示创建intent Intent intent=new Intent(this, IntentActivity.class); //2、获取edittext输入框中的数据 String message=editText.getText().toString(); //3、将数据保存到intent中 intent.putExtra("message", message); if(v==button1){//不带结果返回 //4、启动Activity startActivity(intent); }else{ //带结果返回启动intent //4、带回调启动activity int reqestCode=2; startActivityForResult(intent, reqestCode); } } /** * 当执行要返回值启动时,要覆盖此方法获取返回值内容 * requestCode :请求时携带过去的code * resultCode:返回结果时指定的code * data:返回的intent对象 */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { //1、判断此处的requestCode是否是发送请求时携带过去的code if(requestCode==2 && resultCode==3){ //2、从data中获取数据 String messageString=data.getStringExtra("RESULT"); //3、显示 editText.setText(messageString); } } }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="${relativePackage}.${activityClass}" > <EditText android:id="@+id/EditText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="请输入数据。。。" /> <Button android:id="@+id/button1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="不带返回结果" android:onClick="NoResult"/> <Button android:id="@+id/button2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="BackResult" android:text="带返回结果" /> </LinearLayout>
第二个acitivity以及布局文件
public class IntentActivity extends Activity { private EditText edittext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_intent); //获取要操作的对象 edittext=(EditText) findViewById(R.id.BackMessage); //1.得到intent对象 Intent intent=getIntent(); //2.通过intent读取额外的数据 String message=intent.getStringExtra("message"); //3.显示到EditText edittext.setText(message); } /** * 点击一般返回按钮时,执行该方法 */ public void back1(View v){ //关闭当前页面 finish(); } public void back2(View v){ //1、保存一个结果 int resultCode=3; //2、创建一个带额外数据的intent,由于此处是返回结果,目标activity已经明确,故不需要传参 Intent data=new Intent(); //3、获取输入框中的内容 String message=edittext.getText().toString(); data.putExtra("RESULT", message); //4、设置结果 setResult(resultCode, data); //5、关闭当前activity finish(); } }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:orientation="vertical" android:layout_height="match_parent" tools:context="${relativePackage}.${activityClass}" > <EditText android:id="@+id/BackMessage" android:layout_width="fill_parent" android:layout_height="wrap_content"/> <Button android:id="@+id/back1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="一般返回" android:onClick="back1" /> <Button android:id="@+id/back2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="带结果返回" android:onClick="back2" /> </LinearLayout>
——运行:
可见可操作
——暂停:
可见但不可操作
——停止:
不可见但存在
——死亡:
对象不存在
3-1、界面从“死亡”-->"运行"的过程:
创建对象——OnCreate()——》onStart()——onresume()——可见可操作(运行状态)
3-2、界面从“运行”——“死亡”的过程:
onpause()——onstop()——ondestroy()——activity对象成为垃圾对象——不可见也不存在
3-3、界面从“运行”——“停止”的过程:
onpause()——onstop()——不可见但存在
3-4、界面从“停止”——“运行”的过程:
onrestart()——onstart()——onresume()
3-5、界面从“运行”——“暂停”的过程:
onpause()
3-6、界面从“暂停”——运行的过程:
onresume()
4-1、在android中,系统用Task Stack(Back Stack)结构来存储管理启动的activity对象
4-2、一个应用启动,系统就会为其创建一个对应的Task Stack来存储并管理该应用的activity对象
默认standar模式
在android中,启动一个activity有时需要总是创建一个新对象,有时需要复用已有的对象,可以通过在配置activity是通过launchMode属性指定launchMode属性值(4个):
standard:
标准模式,每次调用startActivity()方法就会产生一个新的实例
singleTop:
如果已经有一个实例位于activity栈的顶部时,就不产生新的实例;如果不位于栈顶,就会产生一个新的实例;
singleTask:
只有一个实例,默认在当前Task中
singleInstance:
只有一个实例,创建时会新建一个栈,且此栈中不能有其他对象
方式一:Activity中添加监听:
View.setOnClickListener(OnlickListener listener);//点击监听
View.setOnLongClickListener(OnLongClickListener listener);//长按监听
方式二:布局添加监听:
Layout中:android:onclick=”方法名”
Activity中:public void 方法名(View v){}
给视图添加监听的三种方式
方式一:视图对象. setOnClickListener(OnClickListener listener);
方式二:实现onclickListener接口
监听方式三:创建一个监听对象
并非activity之间直接启动,需要通过系统的activityManager来启动