现在的位置: 首页 > 综合 > 正文

安卓学习第八天

2018年05月17日 ⁄ 综合 ⁄ 共 6250字 ⁄ 字号 评论关闭
第一天
第二天的代码 要求掌握

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动作将在这章稍后部分描述。







抱歉!评论已关闭.