码迷,mamicode.com
首页 > 移动开发 > 详细

Android基础-02

时间:2015-04-03 13:37:10      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:android开发

Android基础-02

1.单元测试的相关概念

测试分类:

1、根据是否知道源代码分类:

黑盒测试:
白盒测试:

2、根据测试的粒度:

方法测试:写完一个能够独立运行的方法后就去测试;
单元测试:写完一个能够运行的业务逻辑单元就去测试;JUnit单元测试;
模块测试:对模块做整体测试;
集成测试:对整个软件做集成测试;与服务器端做链条测试;
Debug调试:使用debug调试程序;

3、根据测试的次数分类:

压力测试:LoadRunner、Jmeter;
冒烟测试:在同一时间内高频次的访问应用软件;

2.单元测试

01_JUnit单元测试 does not specify a android.test.InstrumentationTestRunner instrumentation or does not declare uses-library android.test.runner in its AndroidManifest.xml

步骤:

1、写一个业务类,添加了一个业务方法;
2、写一个测试类,添加了一个测试方法(调用了业务类业务方法),使用断言判断是预期结果与实际结果是否相同;
3、在清单文件中添加android.test.InstrumentationTestRunnerhe 和 uses-library android.test.runner;

3.Logcat日志工具的使用

日志的级别:

error:级别最高,使用红色字体显示,程序抛出异常信息使用error级别来打印;
warn: 级别较高,使用橙色字体显示,提供提示需要添加权限都是warn级别打印;
debug: 级别高,使用蓝色字体显示;
info: 级别一般,使用绿色字体显示;
verbose:级别最低,使用黑色字体显示;

4.把数据存储到文件并的取数据显示在界面上

在Android应用程序中存储数据的方式:

1、文件
2、使用SharedPreferences保存数据
3、使用SQLite数据库
4、使用ContentProvider内容提供者
5、通过网络把数据保存到服务器上

1、保存数据到文件上:

代码:

布局文件:

<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=".MainActivity" >

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/et_username"
    android:hint="请输入用户名" />

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/et_pwd"
    android:inputType="textPassword"
    android:hint="请输入密码" />

<Button 
     android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="保存"
    android:onClick="save"
    />

</LinearLayout>

MainActivity.java:

package com.itheima.savetofile;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

    private EditText et_username;
    private EditText et_pwd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        et_username = (EditText) findViewById(R.id.et_username);
        et_pwd = (EditText) findViewById(R.id.et_pwd);

        try {
            //从文件中读取数据
            File file = new File("/data/data/com.itheima.savetofile/files/info.txt");
            FileReader fr = new FileReader(file);
            BufferedReader br = new BufferedReader(fr);

            String info = br.readLine();

            //把数据显示在输入框中
            if(!TextUtils.isEmpty(info)){
                String[] array = info.split("##");
                String username = array[0];

                String pwd = array[1];
                et_username.setText(username);
                et_pwd.setText(pwd);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public void save(View view){

        String username = et_username.getText().toString().trim();
        String pwd = et_pwd.getText().toString().trim();

        if(TextUtils.isEmpty(username) || TextUtils.isEmpty(pwd)){
            Toast.makeText(this, "用户名或密码不能为空", Toast.LENGTH_SHORT).show();
            return;
        }else{
            try {
                //把用户名和密码保存到文件上

//              File file = new File("/data/data/com.itheima.savetofile/info.txt");
//              FileOutputStream fos = new FileOutputStream(file);

                //使用另外一个API创建一个文件
                //获得/data/data/com.itheima.savetofile/files目录对象,并且打开指定的文件,如果该文件不存在,就会创建这个文件
                FileOutputStream fos = this.openFileOutput("info.txt", Context.MODE_PRIVATE);

                fos.write((username+"##"+pwd).getBytes());

                fos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

6.存储到SD卡(重点)

代码:

布局文件:

<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=".MainActivity" >

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/et_username"
    android:hint="请输入用户名" />

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/et_pwd"
    android:inputType="textPassword"
    android:hint="请输入密码" />

<Button 
     android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="保存"
    android:onClick="save"
    />

</LinearLayout>

MainActivity.java:

package com.itheima.savetosdcard;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;


import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Environment;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

private EditText et_username;
private EditText et_pwd;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    et_username = (EditText) findViewById(R.id.et_username);
    et_pwd = (EditText) findViewById(R.id.et_pwd);

    try {
        //从文件中读取数据
        File file = new File(Environment.getExternalStorageDirectory()+"/info.txt");
        FileReader fr = new FileReader(file);
        BufferedReader br = new BufferedReader(fr);

        String info = br.readLine();

        //把数据显示在输入框中
        if(!TextUtils.isEmpty(info)){
            String[] array = info.split("##");
            String username = array[0];

            String pwd = array[1];
            et_username.setText(username);
            et_pwd.setText(pwd);
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

}

public void save(View view){

    String username = et_username.getText().toString().trim();
    String pwd = et_pwd.getText().toString().trim();

    if(TextUtils.isEmpty(username) || TextUtils.isEmpty(pwd)){
        Toast.makeText(this, "用户名或密码不能为空", Toast.LENGTH_SHORT).show();
        return;
    }else{
        try {
            //把用户名和密码保存到文件上
            //获得SD卡的根目录,并且创建一个文件
            File file = new File(Environment.getExternalStorageDirectory()+"/info.txt");
            FileOutputStream fos = new FileOutputStream(file);

            //使用另外一个API创建一个文件
            //获得/data/data/com.itheima.savetofile/files目录对象,并且打开指定的文件,如果该文件不存在,就会创建这个文件
            //              FileOutputStream fos = this.openFileOutput("info.txt", Context.MODE_PRIVATE);

            fos.write((username+"##"+pwd).getBytes());

            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

}

7.获取SD的大小及可用空间

代码:

布局文件:

<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=".MainActivity" >

<Button 
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="获得SD的空间"
    android:onClick="click"
    />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/tv_space" />

</LinearLayout>

MainActivity.java:

package com.itheima.sdcardspace;

import java.io.File;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.text.format.Formatter;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {

    private TextView tv_space;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv_space = (TextView) findViewById(R.id.tv_space);
    }

    public void click(View view){
        //获得SD卡的根目录对象
        File file = Environment.getExternalStorageDirectory();

        long  totalSpace = file.getTotalSpace();

        long usableSpace = file.getUsableSpace();

        String total = Formatter.formatFileSize(this, totalSpace);

        String usable = Formatter.formatFileSize(this, usableSpace);

        tv_space.setText(usable+"/"+total);
    }
}

8.文件的权限概念

第一位:文件类型:

第一组权限:当前用户拥有的权限;

第二组权限:所属组拥有的权限;

第三组权限:其他用户拥有的权限;

文件的4种操作模式:

Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND

Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。

Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。

MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
如果希望文件被其他应用读和写,可以传入: 

  openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);

android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位于/data/data//files),其他程序无法访问。除非在创建时指定了Context.MODEWORLDREADABLE或者Context.MODEWORLDWRITEABLE ,只有这样其他程序才能正确访问。

9.权限的使用

代码:

布局文件:

<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=".MainActivity" >

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="使用私有模式保存数据"
    android:onClick="save01" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="使用追加模式保存数据"
    android:onClick="save02" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="使用可读模式保存数据"
    android:onClick="save03" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="使用可写模式保存数据"
    android:onClick="save04" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="使用可读可写模式保存数据"
    android:onClick="save05" />

</LinearLayout>

MainActivity.java:

package com.itheima.filepermission;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void save01(View view) {

        try {
            FileOutputStream fos = this.openFileOutput("info.txt",
                    Context.MODE_PRIVATE);
            fos.write("private".getBytes());
            fos.close();
            Toast.makeText(this, "保存成功", 0).show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void save02(View view) {

        try {
            FileOutputStream fos = this.openFileOutput("info.txt",
                    Context.MODE_APPEND);
            fos.write("append".getBytes());
            fos.close();
            Toast.makeText(this, "保存成功", 0).show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void save03(View view) {

        try {
            FileOutputStream fos = this.openFileOutput("info.txt",
                    Context.MODE_WORLD_READABLE);
            fos.write("readable".getBytes());
            fos.close();
            Toast.makeText(this, "保存成功", 0).show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void save04(View view) {

        try {
            FileOutputStream fos = this.openFileOutput("info.txt",
                    Context.MODE_WORLD_WRITEABLE);
            fos.write("writeable".getBytes());
            fos.close();
            Toast.makeText(this, "保存成功", 0).show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void save05(View view) {

        try {
            FileOutputStream fos = this.openFileOutput("info.txt",
                    Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);
            fos.write("append".getBytes());
            fos.close();
            Toast.makeText(this, "保存成功", 0).show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

10.SharedPreferences存储数据(重点)

应用场景:保存给软件设置的参数;

代码:

布局文件:

<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=".MainActivity" >

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/et_username"
    android:hint="请输入用户名" />

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/et_pwd"
    android:hint="请输入密码" />

<Button
     android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="保存"
    android:onClick="save"
    />
</LinearLayout>

MainActivity.java:

package com.itheima.sp;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

    private EditText et_username;

    private EditText et_pwd;

    private SharedPreferences sp;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        et_username = (EditText) findViewById(R.id.et_username);
        et_pwd = (EditText) findViewById(R.id.et_pwd);

        //获得sp对象
        sp = this.getSharedPreferences("info", Context.MODE_PRIVATE);
        //根据参数名查找参数
        String name = sp.getString("name", "");
        String pwd = sp.getString("pwd", "");
        et_username.setText(name);
        et_pwd.setText(pwd);

    }


    public void save(View view){
        String username = et_username.getText().toString().trim();
        String pwd = et_pwd.getText().toString().trim();

        if(TextUtils.isEmpty(username) || TextUtils.isEmpty(pwd)){
            Toast.makeText(this, "用户名或密码不能为空", 0).show();
            return;
        }else{
            //使用SharedPreferences保存数据
            //得到系统提供的SharedPreferences对象
            //info 保存数据的文件名
            //mode 保存文件使用操作模式
            sp = this.getSharedPreferences("info", Context.MODE_PRIVATE);
            //获得sp的编辑器
            Editor editor = sp.edit();
            //使用editor数据
            editor.putString("name", username);

            editor.putString("pwd", pwd);
            //只有调用了commit或者apply方法才能把数据保存sp对象中
            editor.commit();

            Toast.makeText(this, "保存成功", 0).show();
        }
    }
}

11.序列化xml格式的数据到文件上

应用场景:备份短信、联系人;

代码:

package com.itheima.serializerablexml;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.xmlpull.v1.XmlSerializer;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Xml;
import android.view.View;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void save(View view) {
        try {
            // 得到序列化器
            XmlSerializer s = Xml.newSerializer();

            // 初始化序列化器
            File file = new File(Environment.getExternalStorageDirectory()
                    + "/news.xml");
            FileOutputStream fos = new FileOutputStream(file);
            s.setOutput(fos, "UTF-8");

            // 序列化数据
            s.startDocument("UTF-8", true);

            // channel
            s.startTag(null, "channel");
            // item
            s.startTag(null, "item");

            // title
            s.startTag(null, "title");
            s.text("港媒曝剧组疑潜规则 女星陪制片1周3次");
            s.endTag(null, "title");

            // description
            s.startTag(null, "description");
            s.text("据香港媒体报道,演艺圈潜规则时有所闻,日前男星刘至翰更在网上曝光一张疑似剧组人员与女星的对话截图“先签合同,拍了再陪,无需顾虑”,让刘至翰气骂此歪风践踏梦想又物化女性。");
            s.endTag(null, "description");

            // image
            s.startTag(null, "image");
            s.text("http://192.168.20.91:8080/image/1.jpg");
            s.endTag(null, "image");

            // type
            s.startTag(null, "type");
            s.text("1");
            s.endTag(null, "type");

            s.endTag(null, "item");

            s.endTag(null, "channel");

            s.endDocument();

            fos.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

12.使用pull解析xml格式的数据 (重要)

SAX、DOM4j,DOM

pull:事件类型的解析器;

事件类型:

START_DOCUMENT 解析到文档的开头部分;
END_DOCUMENT解析到文档的结尾部分;
START_TAG 标签的开头部分;
END_TAG 标签的结束部分;

代码:

package com.itheima.pullxml;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Xml;
import android.view.View;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void parse(View view) {

        try {
            // 得到pull解析器
            XmlPullParser parser = Xml.newPullParser();

            // 初始化解析器
            File file = new File(Environment.getExternalStorageDirectory()
                    + "/news.xml");
            FileInputStream fis = new FileInputStream(file);
            parser.setInput(fis, "UTF-8");

            // 得到解析的事件类型
            int type = parser.getEventType();

            while (type != XmlPullParser.END_DOCUMENT) {

                switch (type) {
                case XmlPullParser.START_TAG://解析到开始标签位置
                    if ("item".equals(parser.getName())) {//获得标签的名称
                        System.out.println("....item........");
                    } else if ("title".equals(parser.getName())) {

                        //获得标签体的内容
                        String title = parser.nextText();
                        System.out.println("title:" + title);
                    } else if ("description".equals(parser.getName())) {
                        String description = parser.nextText();
                        System.out.println("description:" + description);
                    }else if ("image".equals(parser.getName())) {
                        String image = parser.nextText();
                        System.out.println("image:" + image);
                    }else if ("type".equals(parser.getName())) {
                        String newstype = parser.nextText();
                        System.out.println("type:" + newstype);
                    }else if ("comment".equals(parser.getName())) {
                        String comment = parser.nextText();
                        System.out.println("comment:" + comment);
                    }

                    break;

                case XmlPullParser.END_TAG://解析到标签的结束位置
                    if ("item".equals(parser.getName())) {
                        System.out.println("..../ item........");
                    } 


                    break;
                }
//              解析下一个标签
                type =  parser.next();
            }

            fis.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

Android基础-02

标签:android开发

原文地址:http://blog.csdn.net/faith_yee/article/details/44852693

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!