安卓学习笔记2——电话拨号器
一、知识复习:
1、安卓系统构成
2、jvm与dvm区别
[1]dvm把所有的.class文件变成一个dex文件
[2]基于的架构不同
3、ART模式(Android Runtime)
Android4.4以前——应用程序均在Dalvik Java的虚拟机上运行,每次程序运行需要将程序编译为机器码
Android4.4以前——新增ART模式,安装程序时,预编译一部分代码为机器码,这样更快更省电,代价是程序安装的内存变大
4、安卓sdk目录
- docs——文档
api guide大而全,一下子看进去细节太多,不容易学习,采用螺旋式学习比较好。
- sources——安卓各个版本源码
- platform——安卓平台
- platform tool——平台工具:
dx.bat 把所有.class文件变成了一个dex文件
aapt Android应用打包工具
adb Android调试桥
5、布局与控件
- 常用控件:有自己的属性和id
Button,
TextView,
EditText,
ImageView,
ProgressBar(进度条),
ProgressDialog,
AlertDialog(提示)
每新建一个控件,使用id属性为该控件在R文件中添加一个id
android:id="@+id/checkbox",则可在全局找到,“+”表示添加
-
高级控件(暂时不用管)
ListView(实现上下滚动)
RecyclerView -
基本布局:
LinearLayout(线性布局,可指定垂直或水平排列)
RelativeLayout(相对布局,可指定控件的相对位置)
FrameLayout(帧布局,重叠)
TableLayout(表格,指定行列)
GridLayout -
新增布局
PercentFrameLayout(百分比布局)
PercentRelativeLayout
新增布局的使用需要添加依赖:
打开app/build.gradle文件,在dependencies闭包中添加如下内容:
dependencies{
compile fileTree(dir:‘libs’,include:[’*.jar’])
compile’com.android.support:appcompat-v7:24.2.1’
compile’com.android.support:percent:24.2.1’
testCompile‘junit:junit:4.12’
- 布局与控件关系:继承关系
可以自定义布局
二、电话拨号器
1、code
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/editText0"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入手机号码"
android:textSize="20dp"
/>
<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/editText0"
android:hint="号码"
android:textSize="25dp">
>
</EditText>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/editText1"
android:text="拨打"
android:textSize="25dp">
</Button>
</RelativeLayout>
主活动:
package com.example.phonecall;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText et_number=(EditText) findViewById(R.id.editText1);
Button bt=(Button) findViewById(R.id.button1);
// 权限获取
int REQUEST_EXTERNAL_STORAGE = 1;
String[] PERMISSIONS_STORAGE = {
Manifest.permission.CALL_PHONE
};
int permission = ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE);
if(permission!= PackageManager.PERMISSION_GRANTED) {
// We don't have permission so prompt the user
ActivityCompat.requestPermissions(
MainActivity.this,
PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE
);
}
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// System.out.println("我被点击啦");
String number =et_number.getText().toString().trim();
if (number.equals("")){
Toast.makeText(MainActivity.this,"号码不为空",Toast.LENGTH_SHORT).show();
}
else{
Intent intent=new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:"+number));
startActivity(intent);
}
}
});
}
}
清单文件:拨打电话的权限添加
<uses-permission
android:name="android.permission.CALL_PHONE"/>
2、遇到的问题或知识点
(1)拨打电话的权限问题:拨打时程序直接挂掉
官方文档指出android 6以后,即使在清单文件中列出,仍然要每次检查权限,
目前的解决办法,参考网上一位博主,创建活动时检查权限;
之后可能深入了解后,会有其他解决办法
// 权限获取
int REQUEST_EXTERNAL_STORAGE = 1;
String[] PERMISSIONS_STORAGE = {
Manifest.permission.CALL_PHONE
};
int permission = ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE);
if(permission!= PackageManager.PERMISSION_GRANTED) {
// We don't have permission so prompt the user
ActivityCompat.requestPermissions(
MainActivity.this,
PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE
);
}
(2)按键监听的四种方法
-
内部类实现Onclicklinstener接口
-
匿名内部类
-
当前类实现Onclicklinstener接口(适用多个按钮),
重写onclick方法
-
按键布局中加一个onclick属性,在Activity里面定义一个方法方法名和属性名系统
该方法原理比较复杂,涉及安卓源码,暂不详解
(3)Toast
官方:类似于弹窗提示
A toast is a view containing a quick little message for the user. The toast class helps you create and show those.
使用Toast提示号码不为空
code
String number =et_number.getText().toString().trim();
if (number.equals("")){
Toast.makeText(MainActivity.this,"号码不为空",Toast.LENGTH_SHORT).show();
}
(4)Intent意图
使用Uri来传递我们的号码
code
Intent intent=new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:"+number));
startActivity(intent);