您的位置:首页 > 移动开发 > Android开发

android一些入门基础信息了解(2015年5月18日)

2015-05-18 19:56 525 查看
本篇文章是最近几天学习android的一个总结。ps:本人刚接触android,不到一个星期,暂时不再学android,所以本博客纯粹是自己的一个总结,以供以后查看,里面有可能有错误的地方。

1、目的

突然想学习android,主要是因为:
1. 自己的手机总是动不动就提示存储空间不足,可是用华为的“文件管理”查看的信息,首先不清晰,不知道每项什么意思,再者就是显示提供的大小加在一起不等于总的大小(我手机显示5.52G的内置存储空间,可是根据显示的总是加不够)。
2. 想了解android编程到底是什么 ,之前都是听别人说android主要是操作xml之类,没有后台代码,和服务器交互都是通过类似调用webservice网址获取服务器信息的,结果压根就不是这么一回事。android类似传统的客户端,android的系统类比成windows,apk类比成exe,同时android又类似web网站,xml布局文件类比成web中的html,apk的后台代码类比成网站的后台代码。这样理解的话,就感觉清晰了,至少比之前那种理解好多了。

2、android操作系统的基础知识

首先必须知道,android操作系统,不是区别于windows、linux的第三种操作系统,而是linux操作系统的一种。所以linux命令基本上都可以在android系统中使用(通过adb提供的shell命令进入android系统,执行linux命令)。
android系统,主要是分为内存(RAM)、内置存储卡(ROM)和外置存储卡(即SD Card)。重点关注内置存储卡。
通过adb进入shell环境,然后输入“ls /”会出现类似linux的目录结构列表,如下图,注意有权限限制。adb进入只是普通用户,如何获取system和root权限,本文不讲。



主要是关注,system、data、mnt、sdcard、storage、cache等目录,不过data和cache目录由于权限问题,不能直接进去,需要获取相应权限。获取相应文件夹的大小,可以通过du命令。
文件夹简要介绍:参考来源(http://www.2cto.com/kf/201304/204729.html
/system 存放的是rom的信息;

/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文件夹。

整个手机的使用空间(不含外置SD Card):操作系统+运行时内存+系统应用(含apk的code本身大小和相应的data、cache大小)+第三方应用(含apk的code本身大小和相应的data、cache大小)+个人用户存储的文档

3、android的安装流程

如果未安装eclipse,可以直接安装android集成开发环境(the Android SDK bundle for Android Studio),如果已安装eclipse或者想通过eclipse开发android程序,可以只下载Android SDK包(the stand-alone SDK Tools)。android集成开发环境和Android SDK包的下载网址是:http://developer.android.com/sdk/installing/index.html,如果国内屏蔽,可以自己翻墙,或者通过XSkyWalker这款浏览器进行访问。安装流程具体参考(http://www.cnblogs.com/zoupeiyang/p/4034517.html),以使用eclipse开发的简要安装流程如下:
1. 配置jdk
2. 安装eclipse
3. 下载the stand-alone SDK Tools,并进行安装,记住安装的路径,里面有相应的工具。同时将“platform-tools”和“build-tools”的路径添加到Path环境变量,比如D:\program files (x86)\Android\android-sdk\platform-tools\;D:\program files (x86)\Android\android-sdk\build-tools\;



4. 运行SDK Manager.exe,这个软件会在线下载一些工具包,鉴于国内屏蔽的网络,所以运行前,建议先ping两个网址能够ping通,即dl-ssl.google.com和dl.google.com。如果ping不通,则可能需要修改C:\Windows\System32\drivers\etc\hosts文件,在hosts后面追加两个,改变网络默认的寻址ip,比如:



对于“74.125.237.1 dl-ssl.google.com”的配置,可以通过如下技巧选择(参考网址:http://jingyan.baidu.com/article/1974b289ad9ad3f4b1f7749a.html):
    i. 打开http://ping.chinaz.com/,其他类似网站也可以,然后在输入要改变寻址ip的域名信息,如下:



    ii. 然后选择一个“响应时间”较短的响应IP,作为这个域名的ip。hosts是网络获取DNS信息最先访问的文件。不过这个技巧为啥成立,暂时不清楚。
5. 成功运行SDK Manager.exe,显示相应的文件信息列表,然后可以参考(http://developer.android.com/sdk/installing/adding-packages.html)选择相应的文件包。一般是:
i. Android SDK Tools

ii. Android SDK Platform-tools

iii. Android SDK Build-tools (highest version)

iv. SDK Platform

v. A system image for the emulator, such as ARM EABI v7a System Image
vi. Android Support Repository

vii. Android Support Library
viii. Google Repository

ix. Google Play services
然后Install即可。
6. 安装ADT插件,ADT是eclipse创建android虚拟模拟器的插件。
启动Eclipse,点击 Help菜单 ->
Install New Software… ?,点击弹出对话框中的Add… 按钮。然后在对话框中,Name输入ADT,Location中输入:http://dl-ssl.google.com/android/eclipse/,点击“OK”按钮,其他默认,然后进行安装。

7. 安装好后需要重启Eclipse,Eclipse会根据目录的位置智能地对Android
sdk进行关联,如果你还没有通过sdk manager工具安装Android任何版本的的sdk,它会提醒立刻安装它们。如果Eclipse没有自动关联Android sdk的安装目录,那么你可以在打开的Eclipse选择 Window -> Preferences ,在弹出面板中就会看到Android设置项,选择安装的SDK路径,则会出现刚才在SDK中安装的各平台包,按OK完成配置。
8. 安装完成,可以新建android工程了。

4、adb命令

adb命令工具,在android sdk的platform-tools文件夹下。
adb devices 表示检索所有android设备
adb shell 表示进入android操作系统的shell环境,即linux环境
如何通过adb命令,往模拟器或其他android设备中安装软件?
在cmd中依次运行如下命令:
adb kill-server

adb start-server

adb remount

显示remount succeeded之后,即可安装apk文件了。具体通过如下命令:
adb install apk文件路径名。
如果想把apk文件安装在SD卡中,而非虚拟的机身中。则需输入:
adb install -s apk文件路径名。

参考网址:
http://blog.sina.com.cn/s/blog_5403162601019ayz.html

http://www.cnblogs.com/lanxuezaipiao/archive/2013/03/11/2953564.html

5、HelloWorld级别的android应用程序源码分析

eclipse新建android程序:
i. 点击“File->New->Project...->Android Application Project”
ii. 输入相应的名字。
Application Name:show in play store, 这个是安装后用用户能看到的名字
Project Name:在eclipse中工程的名字
Package Name:这个类似程序的唯一编号,主要是更新版本时,用来识别同版本的软件,一般是以域名形式的作为名字。
iii. 一直next,知道Create Activity页面,选择不同的初始工程,类似MFC中的多文档,单文档,对话框形式,默认即可。
iv. 输入默认主activity类的名字和相应xml资源的名字。
Activity Name:表示默认执行的Activity类的名字
Layout Name:默认Activity加载的layout布局文件的名字。
v. 点击“finish”,即完成工程创建。

简单介绍主要文件的左右:



i. src文件夹的包,主要是后台执行的源代码,包含启动类。
ii. gen文件夹,主要是R.java文件,这个对应所有控件的ID和其他资源的ID



iii. res/layout文件,存储的是前台布局文件,例子如下图:



这里面的“@+id/listviewApp”,@表示引用自资源文件,即R中有定义的,“+”表示自动生成的,“@+id/listviewApp”,会自动在R.java文件中产生相应的int型的id。如果想引用已有的或者手动添加,不想系统自动生成,则不要用“+”,即“@id/id_value”即可。
iv. res/values/strings.xml文件,存储的是所有在程序中用到的字符串资源。



这个类似预定义资源,如果程序中所有引用的静态字符串都定义在这,则方便管理。在xml文件可以对字符串进行直接引用,比如:android:text="@string/hello",则表示将text设置为“Hello World,MainActivity!”
v. AndroidManifest.xml表示应用程序的初始信息,比如:



<manifest>节点的package属性,设置程序apk的唯一性名字和其他信息。
<application>的子节点<activity>设置程序初始启动的Activity类(如果存在多个Activity类的话)。
<intent-filter>设置程序初始的启动模式,可以通过这些信息过滤一些程序。比如:



Intent表示程序初始启动的信息。
android程序的开发模式类似,web开发:前台设计+后台程序。还要知道java的常用类,在android中都可以用,android编程其实就是java编程。

参考网址:
http://wenku.baidu.com/link?url=A-ADIh5ZvA0B0AZ3rb978Kh3340MsoUi9hYznEKRxjDS7kQrcr_Gwq3VGLgZh_wK2jBwumx26rPuQ5C4TyWfWGmiRFvXhfFGA9KTRh3TfIa

http://www.jb51.net/article/50395.htm
http://zhidao.baidu.com/link?url=EokUctCsrsOMzCU5Mh4CeTfHvI1RpcLnLDhHklT3vRE3zpgK0ilkbRFtwavAwre4QQL3YwOfxnw0wMJI_siPuq

http://www.cnblogs.com/allin/archive/2010/05/11/1732200.html

http://flysnow.iteye.com/blog/865944

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

iii. Intent类
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://baike.baidu.com/link?url=Alx8Ups1cUwK_VC5DmDA9fH-nmmO0OFblGUqOvPvBb24Q4ZoFhWghvxkgwcSkuGh6HEZjgeQt7wYQCaCiFxGla

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

来获取应用程序占用的空间大小。
vi.eclipse 如何创建aidl文件,即java中用于反射用的文件
点击“File->New->File”,在打开的New File对话框中,输入aidl文件,加上后缀名,即xxx.aidl,程序自动创建aidl文件。
参考网址:
http://my.oschina.net/u/779520/blog/79936

http://blog.csdn.net/stonecao/article/details/6425019

vii. Java中如何遍历MAP?
第一种:
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);
}
参考网址:
http://rain-2372.iteye.com/blog/1615615

viii. 其他

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

程序附带的所有源码的链接地址:

http://download.csdn.net/detail/syx19930206/8713777
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: