冒烟测试:
adb shell monkey -p <程序的包名> -v <事件的数量>
android下单元测试:
在AndroidManifest.xml文件中配置一下信息:
在manifest节点下:
<!-- 指定测试信息和要测试的包 -->
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.itheima28.junittest" />
在application节点下配置下面信息:
<!-- 指定引用的测试包 -->
<uses-library android:name="android.test.runner" />
测试时, 定义一个类继承AndroidTestCase
int result = MathUtils.incrment(9, 10)
// 断言, 断定某一个对象就是某一个值
assertEquals(19, result)
文件存储:
this.getFilesDir()
this.getCacheDir()
openFileOutput("aa.txt", 0)
在上下文中有一个方法叫openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的。
FileOutputStream outStream = this.openFileOutput("itcast.txt", Context.MODE_PRIVATE)
outStream.write("传".getBytes())
outStream.close()
openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/” ,
如果文件不存在,Android会自动创建它。创建的文件保存在/data/data/<package name>/files目录
openFileOutput()方法的第二参数用于指定操作模式,有四种模式,分别为: Context.MODE_PRIVATE = 0
Context.MODE_APPEND = 32768
Context.MODE_WORLD_READABLE = 1
Context.MODE_WORLD_WRITEABLE = 2
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/<package name>/files),其他程序无法访问。除非在创建时指
定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE
,只有这样其他程序才能正确访问。
//读取文件内容
如果要打开存放在/data/data/<package name>/files目录应用私有的文件,可
以使用Activity提供openFileInput()方法。
FileInputStream inStream = this.getContext().openFileInput("itcast.txt")
Log.i("FileTest", readInStream(inStream))
readInStream()的方法请看本页下面备注。
或者直接使用文件的绝对路径:
File file = new File("/data/data/cn.itcast/files/itcast.txt")
FileInputStream inStream = new FileInputStream(file)
Log.i("FileTest", readInStream(inStream))
对于私有文件只能被创建该文件的应用访问,如果希望文件能被其他应用读和写,可以
在创建文件时,指定Context.MODE_WORLD_READABLE和
Context.MODE_WORLD_WRITEABLE权限。
Activity还提供了getCacheDir()和getFilesDir()方法:
getCacheDir()方法用于获取/data/data/<package name>/cache目录
getFilesDir()方法用于获取/data/data/<package name>/files目录
//把文件存放在SDCard
使用Activity的openFileOutput()方法保存文件,文件是存放在手机空间上,一
般手机的存储空间不是很大,存放些小文件还行
在程序中访问SDCard,你需要申请访问SDCard的权限。
// 挂载和卸载SDCard
android.permission.MOUNT_UNMOUNT_FILESYSTEMS
// 写入外存储设备权限
android.permission.WRITE_EXTERNAL_STORAGE
要往SDCard存放文件,程序必须先判断手机是否装有SDCard,并且可以进行读写。
注意:访问SDCard必须在AndroidManifest.xml中加入访问SDCard的权限
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File sdCardDir = Environment.getExternalStorageDirectory()
File saveFile = new File(sdCardDir, “itcast.txt”)
FileOutputStream outStream = new FileOutputStream(saveFile)
outStream.write("传".getBytes())
outStream.close()
}
Environment.getExternalStorageState()方法用于获取SDCard的状态,如
果手机装有SDCard,并且可以进行读写,那么方法返回的状态等于
Environment.MEDIA_MOUNTED。
Environment.getExternalStorageDirectory()方法用于获取SDCard的目
录,当然要获取SDCard的目录,你也可以这样写:
File sdCardDir = new File("/mnt/sdcard")
File saveFile = new File(sdCardDir, "itcast.txt")
//上面两句代码可以合成一句:
File saveFile = new File("/mnt/sdcard/itcast.txt")
FileOutputStream outStream = new FileOutputStream(saveFile)
outStream.write("传test".getBytes())
outStream.close()
权限相关:
1. 私有文件
2. 可读文件
3. 可写文件
4. 可读可写文件.
Linux 文件权限
位置0 -:代表文件
d:代表目录
位置1-3:当前用户 r:可读 w:可写 x可执行
位置4-6:当前用户所在的组
位置7-9:其它的用户
SharedPreferences存储路径: /data/data/包名/shared_prefs/
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tvMemoryInfo = (TextView) findViewById(R.id.tv_memory_info);
File sdcardFileDir = Environment.getExternalStorageDirectory();
String sdcardMemory = getMemoryInfo(sdcardFileDir);
File dataFileDir = Environment.getDataDirectory();
String dataMemory = getMemoryInfo(dataFileDir);
tvMemoryInfo.setText("SD卡: " + sdcardMemory + "\n手机内部: " + dataMemory);
}
/**
* 根据路径获取内存状态
* @param path
* @return
*/
private String getMemoryInfo(File path) {
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long totalBlocks = stat.getBlockCount();
long availableBlocks = stat.getAvailableBlocks();
String totalMemory = Formatter.formatFileSize(this, totalBlocks * blockSize);
String availableMemory = Formatter.formatFileSize(this, availableBlocks * blockSize);
return "总空间: " + totalMemory + "\n可用空间: " + availableMemory;
}
}
/**
* 保存用户登陆时的信息 ,将信息写成 xml的格方 文件存入在 应用程序包下的 shared_prefs/config
* @param context
* @param name
* @param password
*/
public static void saveUserInfo(Context context,String name,String password) {
SharedPreferences sp =
context.getSharedPreferences("config", Context.MODE_PRIVATE);
Editor editor = sp.edit();
editor.putString("user", name);
editor.putString("password", password);
editor.commit();
}
如果想访问其他应用中的Preference。
有两个前提条件是:
两个应用程序需要在AndroidManifest.xml中manifest节点里添加sharedUserId属性,并且要一样,而且还要有两级,也就是需要有个“.”
该preference创建时必须指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE权限。
满足上面两个条件之后在我们应用中需要得到另一个应用的上下文对象:
Context otherAppsContext = createPackageContext("cn.itcast.action", Context.CONTEXT_IGNORE_SECURITY);
拿到上下文对象之后通过调用上下文中的方法得到SharedPreferences对象,最后进行数据的交互。
SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences("itcast", Context.MODE_WORLD_READABLE);