本篇文章是最近几天学习android的一个总结。ps:本人刚接触android,不到一个星期,暂时不再学android,所以本博客纯粹是自己的一个总结,以供以后查看,里面有可能有错误的地方。
1、目的
2、android操作系统的基础知识
/system/app 存放rom本身附带的软件即系统软件;
/system/data 存放/system/app中核心系统软件的数据文件信息;
/data 存放的是用户的软件信息(非自带rom安装的软件);
/data/app 存放用户安装的软件;编程有时可以通过package安装包的路径进行截取来判断是否是第三方应用,不过比较正确的方法是通过flag进行判断。例如:
// 通过路径来判断第三方应用
//获取软件包的信息...
PackageInfo p = pack.get(i);
String s = p.applicationInfo.sourceDir;
// 判断路径
if (s.substring(0, 10).equals("/data/app/")) {
//相关操作...
}
// 另一种方法(推荐),通过flag标志,来获取应用程序类别
// 获取应用程序信息
android.content.pm.ApplicationInfo aiTemp = reInfo.activityInfo.applicationInfo;
// 通过标志ApplicationInfo.FLAG_SYSTEM、ApplicationInfo.FLAG_EXTERNAL_STORAGE判断
if ((aiTemp.flags & android.content.pm.ApplicationInfo.FLAG_SYSTEM)<=0) { // 第三方应用(包含SD Card)
// 相关操作...
}
来源网址:/data/app路径判断,flag标志进行判断/data/data 存放所有软件(包括/system/app 和 /data/app 和 /mnt/asec中装的软件)的一些lib和xml文件等数据信息;
/data/dalvik-cache 存放程序的缓存文件,这里的文件都是可以删除的。
/mnt、/sdcard和/storage目录的关系,在linux中,/mnt一般是挂载外部的文件系统,里面的文件夹一般都是link,同样android中也是这种关系,不过是“挂载”的/sdcard和/storage文件夹。
3、android的安装流程
ii. Android SDK Platform-tools
iii. Android SDK Build-tools (highest version)
v. A system image for the emulator, such as ARM EABI v7a System Image
vii. Android Support Library
ix. Google Play services
4、adb命令
adb start-server
adb remount
5、HelloWorld级别的android应用程序源码分析
6、查询例子的分析
主要是参考:
http://blog.csdn.net/qinjuning/article/details/6867806
http://blog.csdn.net/qinjuning/article/details/6892054
http://www.baidufe.com/item/8786bc2e95a042320bef.html
遇到的问题:
i. View的理解:
View可以参考MFC的View关系,各级父、子对象都有传递消息,处理消息函数和成员变量都是有继承关系的。具体可以参考:
http://www.2cto.com/kf/201207/143408.html
ii. 布局文件
布局主要是:LinearLayout,RelativeLayout,ListView等,需要重点强调一下,在用ListView+SimpleAdapter进行列表显示时,setContentView必须是有<ListView>节点,但是,利用SimpleAdapter进行重复显示的信息时,不需要有ListView。setContentView中的ListView感觉就是对程序说,这个界面是ListView形式的,至于它的每一行怎么显示,就是SimpleAdapter中绑定的xml布局文件设置的问题。比如:
其中manage_bigfile.xml,如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView android:id="@+id/file_ordernum"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:paddingLeft="3dp"
android:paddingRight="5dp" />
<TextView android:id="@+id/file_ishide"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:paddingRight="5dp" />
<TextView android:id="@+id/file_name"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:paddingRight="5dp" />
<TextView android:id="@+id/file_size"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:paddingRight="5dp" />
</LinearLayout>
<TextView android:id="@+id/file_path"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:paddingRight="5dp" />
<Button android:id="@+id/button_removefile"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/buttonremovefile"/>
</LinearLayout>
相应的setContentView对应的test,仅有一个ListView节点,对应如下:
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@id/android:list"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
参考网址:
官网layout的介绍
http://weizhulin.blog.51cto.com/1556324/311450/
http://blog.csdn.net/zuolongsnail/article/details/6370035
Intent表示可以用于传递信息,引用百度百科解释:
Intent(意图)主要是解决Android应用的各项组件之间的通讯。
Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。
因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
例如,在一个联系人维护的应用中,当我们在一个联系人列表屏幕(假设对应的Activity为listActivity)上,点击某个联系人后,希望能够跳出此联系人的详细信息屏幕(假设对应的Activity为detailActivity)
为了实现这个目的,listActivity需要构造一个 Intent,这个Intent用于告诉系统,我们要做“查看”动作,此动作对应的查看对象是“某联系人”,然后调用startActivity (Intent intent),将构造的Intent传入,系统会根据此Intent中的描述,到ManiFest中找到满足此Intent要求的Activity,系统会调用找到的 Activity,即为detailActivity,最终传入Intent,detailActivity则会根据此Intent中的描述,执行相应的操作。
所以可以通过putExtra和getIntExtra获取传递的对象(即信息),比如:
设置信息:
Intent intent = new Intent(getBaseContext(),MainActivity.class) ;
intent.putExtra("filter", filter) ;
startActivity(intent);
获取信息:
if(getIntent()!=null){
filter = getIntent().getIntExtra("filter", 0) ;
}
参考网址:
http://blog.csdn.net/hanghangaidoudou/article/details/6419152
http://bbs.csdn.net/topics/360131518
iv. 内置存储卡和外置存储卡信息的获取
class StorageList {
private Activity mActivity;
private StorageManager mStorageManager;
private Method mMethodGetPaths;
public StorageList(Activity activity) {
mActivity = activity;
if (mActivity != null) {
mStorageManager = (StorageManager)mActivity
.getSystemService(Activity.STORAGE_SERVICE);
try {
mMethodGetPaths = mStorageManager.getClass()
.getMethod("getVolumePaths");
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
public String[] getVolumePaths() {
String[] paths = null;
try {
paths = (String[]) mMethodGetPaths.invoke(mStorageManager);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return paths;
}
}
或者:
android.os.Environment.getDataDirectory(); // 内置存储卡
android.os.Environment.getExternalStorageDirectory(); // 外置SD Card
参考网址:
http://blog.sina.com.cn/s/blog_5da93c8f0102vcam.html
http://blog.163.com/hero_213/blog/static/39891214201162123236660/
v. 获取每个应用程序使用的空间,可以通过获取
PackageStats
for(Map.Entry<String, String> entry:map.entrySet()){
System.out.println(entry.getKey()+"--->"+entry.getValue());
}
第二种:
Set set = map.entrySet();
Iterator i = set.iterator();
while(i.hasNext()){
Map.Entry<String, String> entry1=(Map.Entry<String, String>)i.next();
System.out.println(entry1.getKey()+"=="+entry1.getValue());
}
第三种:
Iterator it=map.keySet().iterator();
while(it.hasNext()){
String key;
String value;
key=it.next().toString();
value=map.get(key);
System.out.println(key+"--"+value);
}
参考网址:
Context介绍
http://blog.csdn.net/race604/article/details/9331807
java中的反射,invoke方法
http://blog.sina.com.cn/s/blog_64e467d60100yqz9.html
http://www.cnblogs.com/hfzsjz/p/4097698.html
http://bbs.csdn.net/topics/370105077
程序附带的所有源码的链接地址: