欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

day_03

程序员文章站 2024-02-10 11:15:11
...

0回顾

4.0以上

四层结构

①linux内核

② c/c++函数库

③ application framework 应用框架层

④ 应用层

jvm dvm区别

①编译之后 .class-> .jar .class->dex

② 基于栈 基于寄存器

art dalvik

字节码翻译成机器码时间不同

doc 文档

platformtools adb

source

platform android.jar

src java gen 自动生成 R 生成res目录下资源的相关索引

res 资源

drawable

layout 布局

values->string.xml

           dimens.xml

          style.xml

Androidmanifest.xml 清单文件

声明了包名 package

打包的过程

① 编译

java->.class->dex

xml相关的生成 resources.resc

不能编译的文件

androidManifest.xml

② 把上述内容变成.zip ->apk

③ 对apk进行签名

④ adb

adb install

adb uninstall

adb push

adb pull

电话拨号器

①写UI ②根据UI写java代码 ③部署测试

TextView Edittext Button

Activity 界面 是一个上下文

oncreate

setcontentView

findviewbyid

setonclicklistener(onclicklistener)

点击事件4中写法

①有名的内部类

②匿名内部类

③ 让activity实现接口

④ οnclick=“call”

获取用户输入 非空判断

调用另外界面打电话 Intent intent = new Intent();

intent.setAction

intent.setData

startActivity(intent);

提示用户 Toast.makeText(上下文,文字,时长).show();

五大布局

LinearLayout orientation vertical Horizontal

RelativeLayout 相对布局

FrameLayout margin 外边距 padding 内边距

TableLayout

AbsoluteLayout 绝对布局 Layout_x Layout_y

1 测试的相关概念

一款好的软件是测出来的不是开发出来的

bug 虫子

①崩溃 崩溃率高于4%

②逻辑上的bug

从代码可见的角度

黑盒测试 自动化测试

白盒测试

从测试的粒度

单元测试

集成测试

系统测试

从暴力程度

压力测试

adb shell 下运行monkey

monkey +次数 monkey -p 包名 次数 点具体某一个应用

冒烟测试

2 单元测试

①写一个类继承 androidtestcase

② 写测试的代码

③运行测试代码之前 需要在清单文件中声明

声明在application节点外

1.

声明在application节点里面

④ 在测试的方法上单击右键 选择 run as->android junit test

3 日志猫的使用 logcat

  1. //区别 输出颜色不同 级别不同
  2.    Log.v("MainActivity", "verbose");//黑色的日志
    
  3.    Log.d("MainActivity", "debug"); //蓝色的日志
    
  4.    Log.i("MainActivity", "info"); // 绿色的日志
    
  5.    Log.w("MainActivity", "warning"); //黄色的日志
    
  6.    Log.e("MainActivity", "error"); //红色的日志
    

具体开发的时候 一般会对logcat进行封装

1.public class LogUtils {
2. private static boolean openLog = true;
3.
4. public static void LOGD(String tag,String msg){
5. if(openLog){
6. Log.d(tag, msg);
7. }
8. }
9. public static void LOGI(String tag,String msg){
10. if(openLog){
11. Log.i(tag, msg);
12. }
13. }
14.}

可以通过修改 openLog true或者false控制log的显示还是关闭

4 登录案例 File

新知识点

应用私有路径 data/data/包名/

控件:CheckBox isChecked();

MainActivity.java

1.public class MainActivity extends Activity {
2.
3. private EditText et_username;
4. private EditText et_pwd;
5. private CheckBox cb_isSave;
6. private Button btn_login;
7.
8. @Override
9. protected void onCreate(Bundle savedInstanceState) {
10. super.onCreate(savedInstanceState);
11. //加载界面
12. setContentView(R.layout.activity_main);
13. //找到关心的控件
14. et_username = (EditText) findViewById(R.id.et_username);
15. et_pwd = (EditText) findViewById(R.id.et_password);
16. cb_isSave = (CheckBox) findViewById(R.id.cb_isSave);
17. btn_login = (Button) findViewById(R.id.btn_login);
18.
19. //设置点击事件
20. btn_login.setOnClickListener(new MyListener());
21. //获取用户保存的信息
22. // String[] info = Utils.readInfo();
23. // String[] info = Utils.readInfobyContext(this);
24. String[] info = Utils.readInfoFromSdCard();
25. //如果返回不为空 说明有信息 显示到edittext上
26. if(info!=null){
27. //显示用户的信息
28. et_username.setText(info[0]);
29. et_pwd.setText(info[1]);
30. }
31. }
32.
33.
34. private class MyListener implements OnClickListener{
35.
36. @Override
37. public void onClick(View v) {
38. //当按钮被点击就会走这个方法
39. //①获取用户输入
40. String pwd = et_pwd.getText().toString().trim();
41. String username = et_username.getText().toString().trim();
42. //②判断输入是否为空
43. if(TextUtils.isEmpty(username)||TextUtils.isEmpty(pwd)){
44. //2.1如果为空 Toast提示用户 不能为空
45. Toast.makeText(MainActivity.this, “用户名密码不能为空”, Toast.LENGTH_SHORT).show();
46. }else{
47. //2.2如果不为空 判断是否保存密码
48. //③ 通过checkbox的状态 判断是否保存
49. boolean checked = cb_isSave.isChecked();
50. if(checked){
51. //boolean saveInfo = Utils.saveInfo(username,pwd);
52. //boolean saveInfo = Utils.saveInfobycontext(MainActivity.this,username,pwd);
53. boolean saveInfo = Utils.saveInfo2sdcard(username,pwd);
54. if(saveInfo){
55. Toast.makeText(MainActivity.this, “保存成功”, Toast.LENGTH_SHORT).show();
56. }else{
57. Toast.makeText(MainActivity.this, “保存失败”, Toast.LENGTH_SHORT).show();
58. }
59. //勾选上了 保存用户名密码
60. //Log.d(“MainActivity”, “保存用户名:”+username+“密码:”+pwd);
61. }
62. //④执行登陆的业务逻辑
63. Log.d(“MainActivity”, “开始登陆…”);
64. }
65. }
66. }
67.}

Utils.java

1./**
2. * 保存用户名密码
3. * @param username 用户名
4. * @param pwd 密码
5. * @return 是否保存成功
6. /
7. public static boolean saveInfo(String username, String pwd) {
8. String info = username+"##"+pwd;
9. File file = new File(“data/data/com.itheima.logindemo/info.txt”);
10. try {
11. FileOutputStream fos = new FileOutputStream(file);
12. fos.write(info.getBytes());
13. fos.close();
14. return true;
15. } catch (Exception e) {
16. e.printStackTrace();
17. return false;
18. }
19. }
20.
21. /
*
22. * 获取用户保存的用户名和密码
23. * @return 数组的第一个元素是用户名 第二个元素是密码 如果为null说明获取失败
24. */
25. public static String[] readInfo(){
26. File file = new File(“data/data/com.itheima.logindemo/info.txt”);
27. try {
28. FileInputStream fis = new FileInputStream(file);
29. BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
30. String temp = reader.readLine();
31. String[] result = temp.split("##");
32. return result;
33. } catch (Exception e) {
34. e.printStackTrace();
35. return null;
36. }
37. }

布局文件

1.<RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”
2. xmlns:tools=“http://schemas.android.com/tools”
3. android:layout_width=“match_parent”
4. android:layout_height=“match_parent”
5. android:paddingBottom="@dimen/activity_vertical_margin"
6. android:paddingLeft="@dimen/activity_horizontal_margin"
7. android:paddingRight="@dimen/activity_horizontal_margin"
8. android:paddingTop="@dimen/activity_vertical_margin"
9. tools:context=".MainActivity" >
10.
11. <EditText
12. android:id="@+id/et_username"
13. android:layout_width=“match_parent”
14. android:layout_height=“wrap_content”
15. android:hint=“请输入用户名” />
16. <EditText
17. android:id="@+id/et_password"
18. android:layout_below="@id/et_username"
19. android:layout_width=“match_parent”
20. android:layout_height=“wrap_content”
21. android:inputType=“textPassword”
22. android:hint=“请输入密码”/>
23. <CheckBox
24. android:id="@+id/cb_isSave"
25. android:layout_below="@id/et_password"
26. android:layout_width=“wrap_content”
27. android:layout_height=“wrap_content”
28. android:text=“勾选保存信息”/>
29. <Button
30. android:id="@+id/btn_login"
31. android:layout_below="@id/et_password"
32. android:layout_alignParentRight=“true”
33. android:layout_width=“wrap_content”
34. android:layout_height=“wrap_content”
35. android:text=“登陆”
36. />
37.
38.

5 使用上下文(Context)获取常见目录

Context 可以理解成大工具类

通过上下文 可以访问跟当前应用相关的 全局信息(系统资源) 也可以访问当前应用的私有资源 和类

也可以做系统级的调用 比如 开启另外一个activity 发广播 开启服务

getFilesDir(); 操作的是 data/data/包名/files

openFileInput->FileInputStream 这两个方法获取的流实际上操作的就是getFilesDir()对应目录下的文件

openFileOutput->FileOutputStream

访问/data/data/包名 这个私有目录 一定要使用上下文获取路径

1.public static boolean saveInfobycontext(Context context,String username, String pwd) {
2. String info = username+"##"+pwd;
3.// File file = new File(“data/data/com.itheima.logindemo/info.txt”);
4. //使用上下文获取应用相关私有路径
5. // File file = new File(context.getFilesDir().getAbsolutePath()+"/info.txt");
6. try {
7. // FileOutputStream fos = new FileOutputStream(file);
8. FileOutputStream fos = context.openFileOutput(“info2.txt”, Context.MODE_PRIVATE);
9. fos.write(info.getBytes());
10. fos.close();
11. return true;
12. } catch (Exception e) {
13. e.printStackTrace();
14. return false;
15. }
16. }
17.
18.
19. public static String[] readInfobyContext(Context context){
20. File file = new File(“data/data/com.itheima.logindemo/info.txt”);
21. try {
22. //FileInputStream fis = new FileInputStream(file);
23. FileInputStream fis = context.openFileInput(“info2.txt”);
24. BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
25. String temp = reader.readLine();
26. String[] result = temp.split("##");
27. return result;
28. } catch (Exception e) {
29. e.printStackTrace();
30. return null;
31. }
32. }

6 登录数据保存到sd卡上

7 获取sd卡可用空间

1.public class MainActivity extends Activity {
2.
3. @Override
4. protected void onCreate(Bundle savedInstanceState) {
5. super.onCreate(savedInstanceState);
6. setContentView(R.layout.activity_main);
7. TextView tv_free = (TextView) findViewById(R.id.tv_freespace);
8. TextView tv_total = (TextView) findViewById(R.id.tv_totalspace);
9.
10. File storageDirectory = Environment.getExternalStorageDirectory();
11. long totalSpace = storageDirectory.getTotalSpace();
12. long freeSpace = storageDirectory.getFreeSpace();
13.
14. //通过formatter把用byte字节表示的大小 转换成用 kb mb gb 这种单位表示的字符串
15. String total = Formatter.formatFileSize(this, totalSpace);
16. String free = Formatter.formatFileSize(this, freeSpace);
17.
18. tv_free.setText(“剩余空间:”+free);
19. tv_total.setText(“总空间:”+total);
20. }
21.}

8 文件权限介绍

9 SharedPreferences介绍

SharedPreferences 轻量级的存储信息的api 可以保存的数据类型有限 六种

boolean int long float String Set

相关api

获取SharedPreferences 实例

getSharedPreferences(“文件名字”,模式); 上下文的api

sp.getXXXX(key,defValue); 第一个参数 取值用到的key 第二个参数 默认值 当用key找具体的值的时候 如果找不到 就会返回默认值;

sp.edit();->Editor

通过Editor对象 可以调用putXXXX(key,value); 修改sp文件

只有调用了editor的commit方法 所有的putXXX才会生效

sp是通过xml文件来保存信息的

  1. //获取sp对象 第一个参数 sp保存的文件的名字 第二个参数 存储的模式
  2.    //如果访问的文件不存在 当编辑保存生效之后会创建改文件
    
  3.    sp = getSharedPreferences("info", MODE_PRIVATE);
    
  4.    boolean isSave = sp.getBoolean("isChecked", false);
    
  5.    if(isSave){
    
  6.    	String username = sp.getString("username", "");
    
  7.    	String pwd = sp.getString("pwd", "");
    
  8.    	et_username.setText(username);
    
  9.    	et_pwd.setText(pwd);
    
  10.    	cb_isSave.setChecked(true);
    
  11.    }
    
  12. }

sp会在data/data/包名/shared_prefs/ 保存.xml文件

10 xml序列化

备份短信

SMS

①通过StringBuilder实现 ②通过xml序列化器实现

11 android下xml解析

android表示大小的单位

不要使用px

用dp dp跟像素密度无关的

表示文字大小的要用sp

今日回顾

直接用写死路径的方式保存用户名密码

应用私有路径 data/data/包名/

CheckBox

isChecked();

Context☆☆☆☆☆

getFilesDir();->File 获取到data/data/包名/files

openFileOutput(“要操作的文件名字”,模式); Mode_priate(访问同名文件 覆盖操作) MODE_APPEND(访问同名文件追加内容); FileOutPutStream

openFileInput(); FileInputeStream

Environment.getExternalStorageDirectory();->File 获取到sd卡的路径 ☆☆☆☆

Environment.getExternalStorageState(); ->String 获取sd卡状态 MEDIA_MOUNTED 说明sd卡可用

操作sd卡进行读写的时候 需要一个权限 android.permission.WRITE_EXTORNAL_DIRECTORY;

SharedPreferences ☆☆☆☆☆☆

保存成xml文件 可以保存数据类型 int long boolean float String set

①获取SharedPreferences 对象

getSharedPreferences(名字,模式);

sp.getXXXX(key,defValue);

sp.edit();->editor.putXXX(key,value);

editor.commit();

XMLSeralizer(); ☆☆☆

setOutput(outputStream,encoding);

startDocument();

startTag();

text()

endTag();

endDocument();