Android studio代码实现打电话+点击事件四种方式
- 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、代码实现业务逻辑;
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
> <Button
android:text="拨打电话"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="179dp"
android:id="@+id/bt_call" /> <EditText
android:hint="请输入电话号码"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="53dp"
android:id="@+id/et_phone"
android:layout_above="@+id/bt_call"
android:layout_centerHorizontal="true" />
</RelativeLayout>
package com.example.ahu_lichang.myapplication; import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText; public class MainActivity extends AppCompatActivity {
private EditText et_phone;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); et_phone = (EditText) findViewById(R.id.et_phone);
Button bt_call = (Button) findViewById(R.id.bt_call); bt_call.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取输入的电话号码
String phone = et_phone.getText().toString().trim();
//创建打电话的意图
Intent intent = new Intent();
//设置拨打电话的动作
intent.setAction(Intent.ACTION_CALL);
//设置拨打电话的号码
intent.setData(Uri.parse("tel:" + phone));
//开启打电话的意图
startActivity(intent);
}
});
}
}
<uses-permission android:name="android.permission.CALL_PHONE"/>


注:这里拨打电话ACTION_CALL,在API22(Android5.1)上能正常运行。但是在高版本的API,例如API25(Android7.0)中,已经添加权限了,但是还是会报权限的错误!
- 点击事件的四种创建方式
(1)采用内部类MyOnClickListener的方式去实现OnClickListener接口
package com.example.ahu_lichang.myapplication; import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText; public class MainActivity extends AppCompatActivity {
private EditText et_phone;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); et_phone = (EditText) findViewById(R.id.et_phone);
Button bt_call = (Button) findViewById(R.id.bt_call); /* bt_call.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取输入的电话号码
String phone = et_phone.getText().toString().trim();
//创建打电话的意图
Intent intent = new Intent();
//设置拨打电话的动作
intent.setAction(Intent.ACTION_CALL);
//设置拨打电话的号码
intent.setData(Uri.parse("tel:" + phone));
//开启打电话的意图
startActivity(intent);
}
});*/
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());
}
}
(2)匿名内部类
package com.example.ahu_lichang.myapplication; import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText; public class MainActivity extends AppCompatActivity {
private EditText et_phone;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); et_phone = (EditText) findViewById(R.id.et_phone);
Button bt_call = (Button) findViewById(R.id.bt_call); 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 });
}
}
(3)当前类imp OnClickListener接口
package com.example.ahu_lichang.myapplication; import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText; public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private EditText et_phone;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); et_phone = (EditText) findViewById(R.id.et_phone);
Button bt_call = (Button) findViewById(R.id.bt_call); bt_call.setOnClickListener(this); /* bt_call.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取输入的电话号码
String phone = et_phone.getText().toString().trim();
//创建打电话的意图
Intent intent = new Intent();
//设置拨打电话的动作
intent.setAction(Intent.ACTION_CALL);
//设置拨打电话的号码
intent.setData(Uri.parse("tel:" + phone));
//开启打电话的意图
startActivity(intent);
}
});*/
/* class MyOnClickListener implements View.OnClickListener{ @Override
public void onClick(View v) {
//获取输入的电话号码
String phone = et_phone.getText().toString().trim();
//创建打电话的意图
Intent intent = new Intent();
//设置拨打电话的动作
intent.setAction(Intent.ACTION_CALL);
//设置拨打电话的号码
intent.setData(Uri.parse("tel:" + phone));
//开启打电话的意图
startActivity(intent);
}
}
bt_call.setOnClickListener(new MyOnClickListener());*/
}
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 } }
(4)onclick
<Button
android:text="拨打电话"
android:onClick="onclick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="179dp"
android:id="@+id/bt_call" />
package com.example.ahu_lichang.myapplication; import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText; public class MainActivity extends AppCompatActivity {
private EditText et_phone;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_phone = (EditText) findViewById(R.id.et_phone);
}
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 }
}
- 五种布局
1. 线性布局LinearLayout(重点) 分水平和垂直2种
2. 相对布局RelativeLayout:各个组件都是按照相对位置来摆放。
3. 帧布局FrameLayout: 一层一层绘制
4. 表格布局TableLayout
5. 绝对布局AbsoluteLayout 已经被谷歌废弃
在实际的开发工作中线性布局和相对布局用的比较多,大多数的项目中都是各种不同布局的相互嵌套使用。
Android studio代码实现打电话+点击事件四种方式的更多相关文章
- Android studio 如何查看当前git 分支的4种方式
1.第一种 2.第二种 3.第三种 4.第四种 前面3种都是通过android studio 操作的. 第四种是通过命令行操作.(可以在 git bash 中输入命 ...
- Android开发入门——Button绑定监听事件三种方式
import android.app.Activity; import android.os.Bundle;import android.view.View;import android.widget ...
- Android中点击事件的实现方式
在之前博文中多次使用了点击事件的处理实现,有朋友就问了,发现了很多按钮的点击实现,但有很多博文中使用的实现方式有都不一样,到底是怎么回事.今天我们就汇总一下点击事件的实现方式. 点击事件的实现大致分为 ...
- Android Studio 代码导航快捷键总结
Android Studio 代码导航快捷键总结 这篇文章主要介绍了Android Studio 代码导航快捷键的相关资料,需要的朋友可以参考下 简评:作为一位 Android 开发者,Andro ...
- android点击事件的四种方式
android点击事件的四种方式 第一种方式:创建内部类实现点击事件 代码如下: package com.example.dail; import android.text.TextUtils; im ...
- Intellij idea 和android studio 代码给混淆
Intellij idea 和android studio 代码给混淆 一.指令说明-optimizationpasses 5 # 指定代码的压缩级别 -dontusemixedcaseclassna ...
- android学习之4种点击事件的响应方式
如题,下面就一一列出对点击事件响应的4种方式: 第一种:内部类的形式: package com.example.dail; import android.net.Uri; import android ...
- Android Studio 代码自动提示无效
Android Studio代码自动提示无效(not available in Power Save mode)的解决办法 问题描述: 今天用Android studio敲代码,突然间就没有代码提示了 ...
- 【Android Studio安装部署系列】十二、Android studio代码混淆
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 为什么需要代码混淆呢?原因很简单,你的apk很容易被反编译出来,你写的代码都会被看到,因此我们需要在编译过程中对代码进行一定程度的混 ...
随机推荐
- java 编码问题
Java默认使用Unioncode编码,即不论什么语言都是一个字符占两个字节 Java的class文件编码为UTF-8,而虚拟机JVM编码为UTF-16 UTF-8编码下,一个中文占3个字节,一个英文 ...
- WCF: Retry when service is in fault state.
Service Host: using System; using System.Configuration; using System.ServiceModel; using System.Serv ...
- openstack kilo部署-基础环境
公司也想搞个私有云玩玩,于是展开了一系列的调研,部署测试,openstack 有几个版本真是坑爹!!,如果喜欢被虐有兄弟,你就试试 openstack 的 juno , icehouse等版本,用不了 ...
- TensorFlow在win10上的安装与使用(三)
本篇博客介绍最经典的手写数字识别Mnist在tf上的应用. Mnist有两种模型,一种是将其数据集看作是没有关系的像素值点,用softmax回归来做.另一种就是利用卷积神经网络,考虑局部图片像素的相关 ...
- c++刷题(24/100)正则匹配与位运算
题目1:正则表达式匹配 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字 ...
- Shell编程之运算符和环境变量配置文件
一.shell运算符: declare命令: declare -i 变量名 #声明变量 eg. movie[o]=dzp #定义数组 ...
- 上海支付宝终面后等了两周,没能收到offer却来了杭州淘宝的电话面试
上上周一(14/12/22)上海支付宝hr终面 http://www.cnblogs.com/zhanghaoh/p/4178386.html 苦苦等了两周,没能如愿收到offer,却在今天等来了 杭 ...
- 结构体变量的sizeof计算
结构体字节对齐准则: 1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除: 2. 结构体每个成员相对于结构体首地址的偏移量都是当前成员大小的整数倍,如有需要编译器会在成员之间加上填充字节: ...
- python入门 20141102-1405
那Python有哪些缺点呢? 第一个缺点就是运行速度慢,和C程序相比非常慢, 第二个缺点就是代码不能加密. Python是解释型的 不是编译型的 Python解释器-CPython 命令行: 只需要在 ...
- mvn打war包以及解压包的方法
有时候我们需要查看打成war包之后的目录,如果是maven项目我们可以直接用maven打包. 1.maven打包: 第一种: mvn package 如果不行先 mvn clean一下 第二种:(掌握 ...