如何打磨一个受欢迎的山寨app(2)
来源:互联网 发布:程序员站立办公 编辑:程序博客网 时间:2024/04/29 03:58
好了,牛吹多了终究不好,现在来点实在的。
万事开头难,难在不知道在哪里开头,好在android的开头在哪里我是知道的,那就是AndroidManifest.xml文件,这个文件是一个app的清单文件,通过这个文件,可以看到app从哪里来,从哪里去。现在,我们可以分析一下这个清单文件。
清单的所有内容如下:
<?xmlversion="1.0"encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="com.topnews"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="7"
android:targetSdkVersion="18"/>
<application
android:name=".app.AppApplication"
android:allowBackup="true"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name="com.topnews.Welcome"
android:label="@string/app_name">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN"/>
<categoryandroid:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activityandroid:name="com.topnews.MainActivity">
</activity>
<activityandroid:name="com.topnews.ChannelActivity">
</activity>
<activityandroid:name="com.topnews.DetailsActivity">
</activity>
<activityandroid:name="com.topnews.CityListActivity">
</activity>
<activityandroid:name="com.topnews.SettingsActivity">
</activity>
<activityandroid:name="com.topnews.ImageShowActivity">
</activity>
</application>
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permissionandroid:name="android.permission.INTERNET"/>
<!--在SDCard中创建与删除文件权限-->
<uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!--往SDCard写入数据权限-->
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--震动权限-->
<uses-permissionandroid:name="android.permission.VIBRATE"/>
</manifest>
分析:
<?xml version="1.0"encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="com.topnews"
android:versionCode="1"
android:versionName="1.0">
分析:这里可以看到xml的版本是1.0,听说1.1正在弄,编码格式是utf-8,这个格式,最好不要变,对于字符编码,这里不需要在展开了。需要提示一下的是,如果adt设置得不对,比如默认编码是gbk,那么这里看到的中文可能是乱码。知道就好,xmlns,就是xml的命名空间,这里用的是schemas这种约束方式,其实xml和html不一样,html的标签都是已经有了统一的规范,而xml不一样,xml的标签没有任何预先定义好的规范,所有的规范是你自己定义的,你定义好规范之后,你后面的xml文档如果遵循这个规范,那么你定义好的规范就成了后面xml文档的命名空间,其实不难,实在不能理解的,可以看看这里,http://blog.csdn.net/wanghuan203/article/details/9204337
package="com.topnews"
android:versionCode="1"
对消费者不可见,仅用于应用市场、程序内部识别版本,判断新旧等用途。
android:versionName="1.0">
展示给消费者,消费者会通过它认知自己安装的版本。<uses-sdk
android:minSdkVersion="7"
android:targetSdkVersion="18"/>
分析:7就是这个android app可以兼容的最低版本,7对应这android2.1,如果手机低于这个版本,就会安装不上。targetSdkVersion这个参数相对复杂一些,如果设置了此属性,那么在程序执行时,如果目标设备的API版本正好等于此数值, 他会告诉Android平台:此程序在此版本已经经过充分测,没有问题。不必为此程序开启兼容性检查判断的工作了。 也就是说,如果targetSdkVersion与目标设备的API版本相同时,运行效率可能会高一些。 但是,这个设置仅仅是一个声明、一个通知,不会有太实质的作用, 比如说,使用了targetSdkVersion这个SDK版本中的一个特性,但是这个特性在低版本中是不支持的 ,那么在低版本的API设备上运行程序时,可能会报错:java.lang.VerifyError。也就是说,此属性不会帮你解决兼容性的测试问题。 你至少需要在minSdkVersion这个版本上将程序完整的跑一遍来确定兼容性是没有问题的。
android版本与api 的对应关系
Android版本名和API Level关系全称
Android的版本
Android版本名称Code name
Android的API level
Android 1.0 (API level 1)
1.0
(no code name)
API level 1
Android 1.1 (API level 2)
1.1
(no code name)
API level 2
Android 1.5 Cupcake (API level 3)
1.5
Cupcake
API level 3, NDK 1
Android 1.6 Donut (API level 4)
1.6
Donut
API level 4, NDK 2
Android 2.0 Eclair (API level 5)
2.0
Eclair
API level 5
Android 2.0.1 Eclair (API level 6)
2.0.1
Eclair
API level 6
Android 2.1 Eclair (API level 7)
2.1
Eclair
API level 7, NDK 3
Android 2.2–2.2.3 Froyo (API level 8)
2.2.x
Froyo
API level 8, NDK 4
Android 2.3–2.3.2 Gingerbread (API level 9)
2.3 – 2.3.2
Gingerbread
API level 9, NDK 5
Android 2.3.3–2.3.7 Gingerbread (API level 10)
2.3.3 – 2.3.7
Gingerbread
API level 10
Android 3.0 Honeycomb (API level 11)
3.0
Honeycomb
API level 11
Android 3.1 Honeycomb (API level 12)
3.1
Honeycomb
API level 12, NDK 6
Android 3.2 Honeycomb (API level 13)
3.2.x
Honeycomb
API level 13
Android 4.0–4.0.2 Ice Cream Sandwich (API level 14)
4.0.1 – 4.0.2
Ice Cream Sandwich
API level 14, NDK 7
Android 4.0.3–4.0.4 Ice Cream Sandwich (API level 15)
4.0.3 – 4.0.4
Ice Cream Sandwich
API level 15, NDK 8
Android 4.1 Jelly Bean (API level 16)
4.1.x
Jelly Bean
API level 16
Android 4.2 Jelly Bean (API level 17)
4.2.x
Jelly Bean
API level 17
Android 4.3 Jelly Bean (API level 18)
4.3.x
Jelly Bean
API level 18
Android 4.4 KitKat (API level 19)
4.4
KitKat
API level 19
<application
android:name=".app.AppApplication"
android:allowBackup="true"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@style/AppTheme">
分析:这个几个参数,其实很简单,就是app的名字,是否允许数据备份,以及app的图标,标签,主题等等。
<activity
android:name="com.topnews.Welcome"
android:label="@string/app_name">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN"/>
<categoryandroid:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
分析:
一个应用程序可以有多个Activity,每个Activity是同级别的,那么在启动程序时,最先启动哪个Activity呢?有些程序可能需要显示在程序列表里,有些不需要。怎么定义呢?android.intent.action.MAIN决定应用程序最先启动的Activity ,android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里。Main和LAUNCHER同时设定才有意义,如果有多个同级的Activity都有过滤器
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
则只有最前面的Activity的 <action android:name="android.intent.action.MAIN" /> 有效,启动该程序时,执行的是该Activity。且在程序列表中有多个图标,这些Activity都在程序列表中显示,该Application有多个入口,执行不同的Activity,但是整个程序的主入口(整个程序最先运行的那个activity)只有最先定义的那个Activity。
如果一个应用没有LAUNCHER则该apk仍能安装到设备上,但是在主程序图中看不到。如果给那个Activity 设定了LAUNCHER,且同时设定了Main,则这个Activity就可出现在程序图中;如果没有Main,则不知启动哪个Activity,故也不会有图标出现。所以,<actionandroid:name="android.intent.action.MAIN"/>指明了,welcome是程序的入口。
<activityandroid:name="com.topnews.MainActivity"></activity>
<activityandroid:name="com.topnews.ChannelActivity"></activity>
<activityandroid:name="com.topnews.DetailsActivity"></activity>
<activityandroid:name="com.topnews.CityListActivity"></activity>
<activityandroid:name="com.topnews.SettingsActivity"></activity>
<activityandroid:name="com.topnews.ImageShowActivity"></activity>
</application>
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permissionandroid:name="android.permission.INTERNET"/>
<!--在SDCard中创建与删除文件权限-->
<uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!--往SDCard写入数据权限-->
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--震动权限-->
<uses-permissionandroid:name="android.permission.VIBRATE"/>
</manifest>
分析:最后一部分就是权限问题了,
android的权限有很多分类,开发app的时候,本着良心,按照权限最小的原则进行(除非你想图谋不轨),好了,下面给出了所有的android的所有权限,需要什么权限,请自行添加:
- 如何打磨一个受欢迎的山寨app(2)
- 如何打磨一个受欢迎的山寨app(1)
- App的打磨之路
- App的打磨之路(上)
- App的打磨之路(中)
- App的打磨之路(下)
- 如何山寨一个自己的比特币
- 如何成为一个受欢迎的人!
- 如何成为一个受欢迎的项目经理
- 如何成为一个受欢迎的项目经理
- 如何成为一个受欢迎的项目经理(转载)
- 如何做一个受欢迎的人
- 打磨APP(一)
- 打磨APP(二)
- 打磨Comodo,做有意义的事儿(2)
- 如何成为一个受欢迎的职场新人
- 【转载】如何成为一个受欢迎的职场新人
- 做一个受欢迎的人
- 第十二周 项目三:用递归方法求两个数的最大公约数
- php基础(一)
- JSTL用for和if标签实现换行变色
- Ruby源码分析
- Struts2自定义类型转换器
- 如何打磨一个受欢迎的山寨app(2)
- 单例模式2
- hdu 5106 Bits Problem(数位dp)
- Ubuntu1204 安装深度音乐 + 百度音乐插件
- 云栖小镇联盟,马云告诉你如何玩转云计算
- 《人月神话》书评
- Eclipse 代码自动补全
- 【微软2014实习生及秋令营技术类职位在线测试】题目1 : String reorder
- unity打不开asset store