- Android系统架构(重点)
第一层:应用层Application
第二层:应用框架层Application Framework
第三层:Android底层类库层 Libraries、Dalvik虚拟机
第四层:linux内核层 linux kernel
Android是运行在Linux内核基础之上的。Google官方上提供了一张Android系统架构图(四层)。
- 两种虚拟机的不同 (重点)
1、架构不同:JVM使用栈架构;Dalvik使用的是寄存器,数据是加载到CUP的寄存器上的。
2、JVM加载的.class文件,Dalvik加载的是.dex文件,对内存的分配情况做了优化。
3、jvm: sun oracle dvm: Google
- Android工程的目录结构(这些目录结构是eclipse下的目录结构,Android studio中的目录结构不一样)
src/ java源代码存放目录
gen/ 自动生成目录
gen 目录中存放所有由Android开发工具自动生成的文件。目录中最重要的就是R.java文件。 这个文件由Android开发工具自动产生的。Android开发工具会自动根据你放入res目录的资源,同步更新修改R.java文件。正因为R.java文件是由开发工具自动生成的,所以我们应避免手工修改R.java。R.java在应用中起到了字典的作用,它包含了各种资源的id,通过R.java,应用可以很方便地找到对应资源。另外编绎器也会检查R.java列表中的资源是否被使用到,没有被使用到的资源不会编绎进软件中,这样可以减少应用在手机占用的空间。
res/ 资源(Resource)目录
在这个目录中我们可以存放应用使用到的各种资源,如xml界面文件,图片或数据。
libs/ 支持库目录
程序开发时需要的一些三方的jar包可以放在这个目录,系统会自动把里面的jar包,添加到环境变量。
assets资源目录
Android除了提供/res目录存放资源文件外,在/assets目录也可以存放资源文件,而且/assets目录下的资源文件不会在R.java自动生成ID,所以读取/assets目录下的文件必须指定文件的路径,如:file://android_asset/xxx.3gp
AndroidManifest.xml 项目清单文件(Android studio中的四大组件不用手动配置,会自动生成)
这个文件列出了应用程序所提供的功能,以后你开发好的各种组件需要在该文件中进行配置,如果应用使用到了系统内置的应用(如电话服务、互联网服务、短信服务、GPS服务等等),你还需在该文件中声明使用权限。
project.properties 项目环境信息,一般是不需要修改此文件
- ADB命令
— 常见命令:
adb devices 列出所有的设备
adb shell 挂载到linux的空间 可以执行linux指令
adb install xxx.apk 如果有多个设备,我们可以指定设备 adb install –s emulator-5554 D:/xxx.apk
adb push 把文件推到手机里
adb pull 把文件从手机里拉出来
ctrl + F11 横竖屏的切换
- 电话拨号器(重点)
开发项目的步骤:
1、理解需求,弄明白需求后在写代码;
2、在Android工程中设计UI界面;
3、代码实现业务逻辑;
1 23 xmlns:tools="http://schemas.android.com/tools" 4 android:id="@+id/activity_main" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 > 8 9 <Button 10 android:text="拨打电话" 11 android:layout_width="wrap_content" 12 android:layout_height="wrap_content" 13 android:layout_alignParentBottom="true" 14 android:layout_centerHorizontal="true" 15 android:layout_marginBottom="179dp" 16 android:id="@+id/bt_call" /> 17 18 <EditText 19 android:hint="请输入电话号码" 20 android:layout_width="wrap_content" 21 android:layout_height="wrap_content" 22 android:layout_marginBottom="53dp" 23 android:id="@+id/et_phone" 24 android:layout_above="@+id/bt_call" 25 android:layout_centerHorizontal="true" /> 26
1 package com.example.ahu_lichang.myapplication; 2 3 import android.content.Intent; 4 import android.net.Uri; 5 import android.os.Bundle; 6 import android.support.v7.app.AppCompatActivity; 7 import android.view.View; 8 import android.widget.Button; 9 import android.widget.EditText; 10 11 public class MainActivity extends AppCompatActivity { 12 private EditText et_phone; 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 18 et_phone = (EditText) findViewById(R.id.et_phone); 19 Button bt_call = (Button) findViewById(R.id.bt_call); 20 21 bt_call.setOnClickListener(new View.OnClickListener() { 22 @Override 23 public void onClick(View v) { 24 //获取输入的电话号码 25 String phone = et_phone.getText().toString().trim(); 26 //创建打电话的意图 27 Intent intent = new Intent(); 28 //设置拨打电话的动作 29 intent.setAction(Intent.ACTION_CALL); 30 //设置拨打电话的号码 31 intent.setData(Uri.parse("tel:" + phone)); 32 //开启打电话的意图 33 startActivity(intent); 34 } 35 }); 36 } 37 }
1
注:这里拨打电话ACTION_CALL,在API22(Android5.1)上能正常运行。但是在高版本的API,例如API25(Android7.0)中,已经添加权限了,但是还是会报权限的错误!
- 点击事件的四种创建方式
(1)采用内部类MyOnClickListener的方式去实现OnClickListener接口
1 package com.example.ahu_lichang.myapplication; 2 3 import android.content.Intent; 4 import android.net.Uri; 5 import android.os.Bundle; 6 import android.support.v7.app.AppCompatActivity; 7 import android.view.View; 8 import android.widget.Button; 9 import android.widget.EditText; 10 11 public class MainActivity extends AppCompatActivity { 12 private EditText et_phone; 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 18 et_phone = (EditText) findViewById(R.id.et_phone); 19 Button bt_call = (Button) findViewById(R.id.bt_call); 20 21 /* bt_call.setOnClickListener(new View.OnClickListener() { 22 @Override 23 public void onClick(View v) { 24 //获取输入的电话号码 25 String phone = et_phone.getText().toString().trim(); 26 //创建打电话的意图 27 Intent intent = new Intent(); 28 //设置拨打电话的动作 29 intent.setAction(Intent.ACTION_CALL); 30 //设置拨打电话的号码 31 intent.setData(Uri.parse("tel:" + phone)); 32 //开启打电话的意图 33 startActivity(intent); 34 } 35 });*/ 36 class MyOnClickListener implements View.OnClickListener{ 37 38 @Override 39 public void onClick(View v) { 40 //获取输入的电话号码 41 String phone = et_phone.getText().toString().trim(); 42 //创建打电话的意图 43 Intent intent = new Intent(); 44 //设置拨打电话的动作 45 intent.setAction(Intent.ACTION_CALL); 46 //设置拨打电话的号码 47 intent.setData(Uri.parse("tel:" + phone)); 48 //开启打电话的意图 49 startActivity(intent); 50 } 51 } 52 bt_call.setOnClickListener(new MyOnClickListener()); 53 } 54 }
(2)匿名内部类
1 package com.example.ahu_lichang.myapplication; 2 3 import android.content.Intent; 4 import android.net.Uri; 5 import android.os.Bundle; 6 import android.support.v7.app.AppCompatActivity; 7 import android.view.View; 8 import android.widget.Button; 9 import android.widget.EditText; 10 11 public class MainActivity extends AppCompatActivity { 12 private EditText et_phone; 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 18 et_phone = (EditText) findViewById(R.id.et_phone); 19 Button bt_call = (Button) findViewById(R.id.bt_call); 20 21 bt_call.setOnClickListener(new View.OnClickListener() { 22 @Override 23 public void onClick(View v) { 24 //获取输入的电话号码 25 String phone = et_phone.getText().toString().trim(); 26 //创建打电话的意图 27 Intent intent = new Intent(); 28 //设置拨打电话的动作 29 intent.setAction(Intent.ACTION_CALL); 30 //设置拨打电话的号码 31 intent.setData(Uri.parse("tel:" + phone)); 32 //开启打电话的意图 33 startActivity(intent); 34 } 35 }); 36 } 37 }
(3)当前类imp OnClickListener接口
1 package com.example.ahu_lichang.myapplication; 2 3 import android.content.Intent; 4 import android.net.Uri; 5 import android.os.Bundle; 6 import android.support.v7.app.AppCompatActivity; 7 import android.view.View; 8 import android.widget.Button; 9 import android.widget.EditText; 10 11 public class MainActivity extends AppCompatActivity implements View.OnClickListener{ 12 private EditText et_phone; 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 18 et_phone = (EditText) findViewById(R.id.et_phone); 19 Button bt_call = (Button) findViewById(R.id.bt_call); 20 21 bt_call.setOnClickListener(this); 22 23 /* bt_call.setOnClickListener(new View.OnClickListener() { 24 @Override 25 public void onClick(View v) { 26 //获取输入的电话号码 27 String phone = et_phone.getText().toString().trim(); 28 //创建打电话的意图 29 Intent intent = new Intent(); 30 //设置拨打电话的动作 31 intent.setAction(Intent.ACTION_CALL); 32 //设置拨打电话的号码 33 intent.setData(Uri.parse("tel:" + phone)); 34 //开启打电话的意图 35 startActivity(intent); 36 } 37 });*/ 38 /* class MyOnClickListener implements View.OnClickListener{ 39 40 @Override 41 public void onClick(View v) { 42 //获取输入的电话号码 43 String phone = et_phone.getText().toString().trim(); 44 //创建打电话的意图 45 Intent intent = new Intent(); 46 //设置拨打电话的动作 47 intent.setAction(Intent.ACTION_CALL); 48 //设置拨打电话的号码 49 intent.setData(Uri.parse("tel:" + phone)); 50 //开启打电话的意图 51 startActivity(intent); 52 } 53 } 54 bt_call.setOnClickListener(new MyOnClickListener());*/ 55 } 56 @Override 57 public void onClick(View v) { 58 //获取输入的电话号码 59 String phone = et_phone.getText().toString().trim(); 60 //创建打电话的意图 61 Intent intent = new Intent(); 62 //设置拨打电话的动作 63 intent.setAction(Intent.ACTION_CALL); 64 //设置拨打电话的号码 65 intent.setData(Uri.parse("tel:" + phone)); 66 //开启打电话的意图 67 startActivity(intent); 68 } 69 70 }
(4)onclick
1 <Button 2 android:text="拨打电话" 3 android:onClick="onclick" 4 android:layout_width="wrap_content" 5 android:layout_height="wrap_content" 6 android:layout_alignParentBottom="true" 7 android:layout_centerHorizontal="true" 8 android:layout_marginBottom="179dp" 9 android:id="@+id/bt_call" />
1 package com.example.ahu_lichang.myapplication; 2 3 import android.content.Intent; 4 import android.net.Uri; 5 import android.os.Bundle; 6 import android.support.v7.app.AppCompatActivity; 7 import android.view.View; 8 import android.widget.Button; 9 import android.widget.EditText; 10 11 public class MainActivity extends AppCompatActivity { 12 private EditText et_phone; 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 et_phone = (EditText) findViewById(R.id.et_phone); 18 } 19 public void onclick(View v) { 20 //获取输入的电话号码 21 String phone = et_phone.getText().toString().trim(); 22 //创建打电话的意图 23 Intent intent = new Intent(); 24 //设置拨打电话的动作 25 intent.setAction(Intent.ACTION_CALL); 26 //设置拨打电话的号码 27 intent.setData(Uri.parse("tel:" + phone)); 28 //开启打电话的意图 29 startActivity(intent); 30 } 31 }
- 五种布局
1. 线性布局LinearLayout(重点) 分水平和垂直2种
2. 相对布局RelativeLayout:各个组件都是按照相对位置来摆放。
3. 帧布局FrameLayout: 一层一层绘制
4. 表格布局TableLayout
5. 绝对布局AbsoluteLayout 已经被谷歌废弃
在实际的开发工作中线性布局和相对布局用的比较多,大多数的项目中都是各种不同布局的相互嵌套使用。