第一天 第二天的代码 要求掌握 listview baseadapter 第四条 :知道原理 URL url.openconntion get post 第五天 handler message 在子线程里面更新main ui 内容 怎么开启新的activity 传递数据 第六天 知道service 知道 如何开启service bind(); start(); bind() 调用服务里面的方法. 第七天: 看明白代码 常用的控件 会用 对话框 notification 第八天 : 动画 安全退出应用程序 国际化. 屏幕. //笔记 layout_weight:就是与Z-INDEX一样,区别是安卓中,数值越小,优先级越高。 //国际化: 在string.xml里面写字符串第一可以减少该字符在项目中出现的次数 第二,可以实现国际化。 文字国际化和图片国际化。 文件夹: values values-en values-zh 三个里面都用strings.xml 程序会根据手机相应的语言去调用相关内容。 如果没有找到与手机语言匹配的就调用values里面的东西。 屏幕适配: px:指定的真实的像素的点数。所以肯定在不同的分辨率下会出问题。 dip:是一个相对值。推荐使用dip. 第二:做多个分辩率下的布局。 不同分辨率下做不同的布局。 layout layout-320*240 layout-480*320 系统会自动加载最合适的布局。 也可以这样指定: layout-hdpi layout-ldpi 它也会自动匹配。与图片的那种原理是一样的。 你也可以指定横向布局是什么,竖向布局是什么。 layout-land layout-port 在文档的最佳实践里面有这种说明 。 其实在实际项目中,都有一个默认的,然后设置不同分辨率下的。 采用代码编写:例如你要开发一些SDK,肯定不可能有文件做布局, 所以用代码直接写UI。 安卓的样式和主题: 可以把共用的字体大小,颜色等抽取出来 组成一个style. 并且可以继承Style. 所有标题,所有正文都要一样,所以这个时间肯定要统一定义。 <resources> <string name="hello">Hello World, StyleActivity!</string> <string name="app_name">Style</string> <style name="test_style"> <item name="android:layout_width">wrap_content</item> <item name="android:layout_height">wrap_content</item> <item name="android:textSize">18sp</item> <item name="android:textColor">#ff66ff00</item> </style> <style name="test_style1" parent="@style/test_style"> <item name="android:textSize">28sp</item> </style> </resources> 调用: <TextView style="@style/test_style" android:text="@string/hello" /> <TextView style="@style/test_style1" android:text="@string/hello" /> 其实样式主就是WEB中的CSS. 主题: 首先系统的提供一些默认的主题: 在activity里面: android:theme="@android:style/Theme.NoTitleBar" android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" @android:style/Theme.NoTitleBar.Fullscreen 也可以自己定义一些主题,然后让activity调用。 <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, ThemeActivity!</string> <string name="app_name">Theme</string> <style name="mytheme" parent="@android:style/Theme.NoTitleBar.Fullscreen"> <item name="android:background">@color/red</item> </style> <color name="red">#FFFF0000</color> </resources> 调用:android:theme="@style/mytheme" 你要学会在XML调用资源性文件的方法是用@。 如果你把android:theme="@style/mytheme"放在application里面,所有的activity都会是这个主题。 9patch图片格式: 在安卓的SDK下的tools工具下面。 安卓动画: 两种: 1、tween:通过对View对象的一些变化有四种变化 ,可以组合 。 2、帧动画。 详情看anim项目。 传感器:指南针。 判断SIM卡属于哪个移动运营商: 第一种方法: 获取手机的IMSI码,并判断是中国移动\中国联通\中国电信 TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); /** 获取SIM卡的IMSI码 * SIM卡唯一标识:IMSI 国际移动用户识别码(IMSI:International Mobile Subscriber Identification Number)是区别移动用户的标志, * 储存在SIM卡中,可用于区别移动用户的有效信息。IMSI由MCC、MNC、MSIN组成,其中MCC为移动国家号码,由3位数字组成, * 唯一地识别移动客户所属的国家,我国为460;MNC为网络id,由2位数字组成, * 用于识别移动客户所归属的移动网络,中国移动为00,中国联通为01,中国电信为03;MSIN为移动客户识别码,采用等长11位数字构成。 * 唯一地识别国内GSM移动通信网中移动客户。所以要区分是移动还是联通,只需取得SIM卡中的MNC字段即可 */ String imsi = telManager.getSubscriberId(); if(imsi!=null){ if(imsi.startsWith("46000") || imsi.startsWith("46002")){//因为移动网络编号46000下的IMSI已经用完,所以虚拟了一个46002编号,134/159号段使用了此编号 //中国移动 }else if(imsi.startsWith("46001")){ //中国联通 }else if(imsi.startsWith("46003")){ //中国电信 } } 第二种方法 TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); String operator = telManager.getSimOperator(); if(operator!=null){ if(operator.equals("46000") || operator.equals("46002")){ //中国移动 }else if(operator.equals("46001")){ //中国联通 }else if(operator.equals("46003")){ //中国电信 } } 如何在一个程序中安装另外一个程序? 例如:在安卓市场里面下载后安装文件, public void install(View view){ String path = et_path.getText().toString().trim(); Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); // intent.setData(Uri.fromFile(new File(path))); // intent.setType("application/vnd.android.package-archive"); intent.setDataAndType(Uri.fromFile(new File(path)), "application/vnd.android.package-archive"); startActivity(intent); } 因为你调用setType的时间它会清除上面的setData数据,所以出现了setDataAndType方法。 setType的来源是tomcat web.xml 里面,apk对应的mine类型。 如何反编译别人的文件? 安装ApkTool工具,该工具可以解码得到资源文件,但不能得到Java源文件。 安装环境:需要安装JRE1.6 1> 到http://code.google.com/p/android-apktool/下载apktool1.3.2.tar.bz2 和apktool-install-windows-2.2_r01-3.tar.bz2 文件。解压两个文件,然后把解压后的文件放在一起,如:c:\apktool 2> 在系统变量PATH中添加进aapt.exe,如:;c:\apktool\aapt.exe 3> 在DOS窗口下进入apktool.jar所在目录。执行DOS命令:apktool d -s c:\soft\xxx.apk c:\soft\source。 命令格式:apktool d [opts] <file.apk> [dir] 中的d代表解码,[opts]代表选项,-s选项代表不解码源文件。 Apktool工具只能反编译成smali的中间代码文件,这里需要借助另外一个开源工具Dex2Jar,该工具可以把dex文件转换成jar文件。这个工具不能直接翻译成java文件,但是可以把dex文件转换成jar文件 下载地址:http://code.google.com/p/dex2jar/。 1> 把APK安装包中的classes.dex解压到某个目录下,如:c:\soft 2> 在DOS窗口下进入dex2jar.bat所在目录,执行DOS命令:dex2jar.bat c:\soft\source\classes.dex c:\soft\source,命令生成classes.dex.dex2jar.jar文件。 apktool可以把应用程序的所有资源给获取出来, 也就是res目录下的xml文件。 apk是个压缩文件,可以直接解压缩,但是文件是乱码。 安装jd-gui工具,该工具可以把jar文件反编译成Java源文件 下载地址:http://java.decompiler.free.fr/jd-gui/downloads/jd-gui-0.3.3.windows.zip。 运行该软件,直接打开classes.dex.dex2jar.jar文件即可看到java源代码。 思路:dex-->class-->java 资源文件通过上面的工具打开 。 阻止反编译:混淆。 由于apk是Android虚拟机加载的,它有一定的规范,加密apk后Dalvik无法 识别apk了。完全避免是不可能的,总有人能够破解你的代码。但是有几种 方式来提高被反编译取代码的难度。 1 关键代码使用jni调用本地代码,用c或者c++编写,因此相对比较难于反 编译 2 混淆java代码。混淆是不改变代码逻辑的情况下,增加无用代码,或者重 命名,使反编译后的源代码难于看懂。 网上开源的java代码混淆工具较多,一般是用ant的方式来编译的 在我们曾经介绍的一片关于 Android系统架构基本模式解析的文章中,大家可以充分的对这一功能强大的手机系统有一个初步的掌握。在这里大家可以通过Android本地应用程序的一些介绍更加深入的对这一开源系统进行解读。 Android本地应用程序也使用Intent来启动Activity和子Activity。 下面的列表简单的列出了Intent类中以静态字符串常量保存的本地动作。你可以在你自己的应用程序里当创建隐式Intent来启动Activity和子Activity时使用这些动作。 ? ACTION_ANSWER 打开一个Activity来处理来电。目前,它是被本地的电话拨号工具处理。 ? ACTION_CALL 启动电话拨号工具,并立即用数据URI中的号码初始化一个呼叫。一般来说,如果可能的话,它认为是比使用Dial_Action好的一种方式。 ? ACTION_DELETE 启动一个Activity来让你删除储存在URI位置的数据入口。 ? ACTION_DIAL 启动一个电话拨号程序,使用预置在数据URI中的号码来拨号。默认情况下,它是由Android本地的电话拨号工具处理。这个拨号工具能规范多数的号码;举个例子,tel:555-1234和tel:(212)555 1212都是有效的号码。 ? ACTION_EDIT 请求一个Activity来编辑URI处的数据。 ? ACTION_INSERT 打开一个能在数据域的特定游标处插入新项目的Activity。当以子Activity方式调用时,它必须返回新插入项目的URI。 ? ACTION_PICK 启动一个子Activity来让你从URI数据处挑选一个项目。当关闭时,它必须返回指向被挑选项目的URI。启动的Activity取决于要挑选的数据;例如,传入content://contacts/people会引发本地的联系人列表。 ? ACTION_SEARCH 启动一个UI来执行搜索。在Intent的数据包里使用SearchManager.QUERY键值来提供搜索内容的字符串。 ? ACTION_SENDTO 启动一个Activity来给URI中的指定联系人发送一个消息。 ? ACTION_SEND 启动一个Activity来发送特定的数据(接收者经由解析Activity来选择)。使用setType来设置Intent的类型为传输数据的mime类型。 数据本身依赖于类型使用EXTRA_TEXT或EXTRA_STREAM来储存。在e-mail的情况下,Android本地应用程序还可以接受使用EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC, 和EXTRA_SUBJECT键值的extras。 ? ACTION_VIEW 最通用的动作。View动作要求Intent URI中的数据以最合理的方式显示。不同的应用程序将处理View请求,依赖于URI中的数据。一般的,http:地址会在浏览器中打开,tel:地址会在拨号工具中打开并呼叫号码,geo:地址会在Google地图应用程序中显示,联系人内容会在联系人管理器中显示。 ? ACTION_WEB_SEARCH 打开一个Activity,执行基于数据URI中文本的网页搜索。 和这些Activity动作一样,Android本地应用程序还包括大量的Broadcast动作,用来创建Intent将系统消息通知给应用程序。这些Broadcast动作将在这章稍后部分描述。