没有合适的资源?快使用搜索试试~ 我知道了~
android开发重要知识点整理.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 96 浏览量
2021-11-24
01:48:36
上传
评论
收藏 1.34MB PDF 举报
温馨提示
试读
43页
android开发重要知识点整理.pdf
资源推荐
资源详情
资源评论
1. android 单实例运行方法
我们都知道 Android 平台没有任务管理器,而内部 App 维护者一个 Activity history stack 来
实 现 窗 口显 示 和销 毁 ,对 于 常规 从 快捷 方 式运 行 来看 都 是 startActivity 可 能 会 使 用
FLAG_ACTIVITY_NEW_TASK 标记来打开一个新窗口, 比如 Launcher ,所以考虑单任务的
实 现 方 法 比 较 简 单 , 首 先 Android123 纠 正 下 大 家 一 种 错 误 的 方 法 就 是 直 接 在
androidmanifest.xml 的 application 节点中加入 android:launchMode="singleInstance" 这句,其
实这样将不会起到任何作用, Apps 内部维护的历史栈作用于 Activity ,我们必须在 activity
节点中加入 android:launchMode="singleInstance" 这句才能保证单实例,当然一般均加在主
程序启动窗口的 Activity 。
2. px 像素如何转为 dip 设备独立像素
最近有网友问如何将 px 像素转为 dip 独立设备像素,由于 Android 的设备分辨率众多,目
前主流的为 wvga ,而很多老的设备为 hvga 甚至低端的 qvga,对于兼容性来说使用 dip 无非
是比较方便的,由于他和分辨率无关和屏幕的密度大小有关,所以推荐使用。 px= (int)
(dip*density+0.5f) //这里 android 开发网提示大家很多网友获取 density(密度 )的方法存在问
题,从资源中获取的是静态定义的,一般为 1.0 对于 HVGA 是正好的,而对于 wvga 这样的
应该从 WindowsManager 中获取, WVGA 为 1.5 这里可以再补充一下 dip,sip 的知识
3. Android 中动态改变 ImageView 大小
很多网友可能发现在 layout.xml 文件中定义了 ImageView 的绝对大小后, 无法动态修改以后
的大小显示, 其实 Android 平台在设计 UI 控件时考虑到这个问题, 为了适应不同的 Drawable
可以通过在 xml 的相关 ImageView 中加入 android:scaleType="fitXY" 这行即可, 但因为使用
了缩放可能会造成当前 UI 有所变形。使用的前提是限制 ImageView 所在的层,可以使用一
个内嵌的方法限制显示。
4. 如何判断 Android 手机当前是否联网 ?
如果拟开发一个网络应用的程序, 首先考虑是否接入网络, 在 Android 手机中判断是否联网
可以通过 ConnectivityManager 类的 isAvailable() 方法判断,首先获取网络通讯类的实例
ConnectivityManager
cwjManager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); ,
使用 cwjManager.getActiveNetworkInfo().isA vailable(); 来返回是否有效, 如果为 True 则表示
当前 Android 手机已经联网,可能是 WiFi 或 GPRS、 HSDPA 等等,具体的可以通过
ConnectivityManager 类的 getActiveNetworkInfo() 方法判断详细的接入方式, 需要注意的是
有 关 调 用 需 要 加 入 <uses-permission
android:name="android.permission.ACCESS_NETWORK_STA TE"></uses-permission> 这个权
限, android 开发网提醒大家在真机上 Market 和 Browser 程序都使用了这个方法,来判断是
否继续, 同时在一些网络超时的时候也可以检查下网络连接是否存在, 以免浪费手机上的电
力资源。
5. Drawable、 Bitmap、 Canvas 和 Paint 的关系
很多网友刚刚开始学习 Android 平台,对于 Drawable 、Bitmap、Canvas 和 Paint 它们之间的
概念不是很清楚,其实它们除了 Drawable 外早在 Sun 的 J2ME 中就已经出现了,但是在
Android 平台中, Bitmap、 Canvas 相关的都有所变化。 首先让我们理解下 Android 平台中
的显示类是 View ,但是还提供了底层图形类 android.graphics,今天所说的这些均为 graphics
底层图形接口。 Bitmap - 称作位图,一般位图的文件格式后缀为 bmp,当然编码器也有
很多如 RGB565、RGB888 。作为一种逐像素的显示对象执行效率高,但是缺点也很明显存
储效率低。 我们理解为一种存储对象比较好。 Drawable - 作为 Android 平下通用的图形对
象,它可以装载常用格式的图像,比如 GIF 、PNG、JPG,当然也支持 BMP,当然还提供一
些高级的可视化对象, 比如渐变、 图形等。 Canvas - 名为画布, 我们可以看作是一种处理
过程,使用各种方法来管理 Bitmap、 GL 或者 Path 路径,同时它可以配合 Matrix 矩阵类给
图像做旋转、缩放等操作,同时 Canvas 类还提供了裁剪、选取等操作。 Paint - 我们可
以把它看做一个画图工具, 比如画笔、画刷。他管理了每个画图工具的字体、 颜色、样式。 如
果涉及一些 Android 游戏开发、显示特效可以通过这些底层图形类来高效实现自己的应用。
6. Activity 切换导致的 onCreate 重复执行
部分网友会发现 Activity 在切换到后台或布局从横屏 LANDSCAPE 切换到 PORTRAIT ,会
重新切换 Activity 会触发一次 onCreate 方法, 我们可以在 androidmanifest.xml 中的 activit 元
素加入这个属性 android:configChanges="orientation|keyboardHidden" 即可,比如 <activity
android:name=".android123" android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name"> 同 时 在 Activity 的 Java 文 件 中 重 载
onConfigurationChanged(Configuration newConfig) 这个方法,这样就不会在布局切换或窗口
切换时重载 onCreate 等方法。代码如下 : @Override
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
if (this.getResources().getConfiguration().orientation ==
Configuration.ORIENTA TION_LANDSCAPE)
{
//land
}
else if (this.getResources().getConfiguration().orientation ==
Configuration.ORIENTA TION_PORTRAIT)
{
//port
}
}
7. Android 的 ImageButton 问题
很多网友对 Android 提供的 ImageButton 有个疑问, 当显示 Drawable 图片时就不会再显示文
字了, 其实解决的方法有两种, 第一种就是图片中就写入文字, 但是这样解决会增加程序体
积,同时硬编码方式会影响多国语言的发布。第二种解决方法很简单,通过分析可以看到
ImageButton 的 layout,我们可以直接直接继承,添加一个 TextView ,对齐方式为右侧即可
实现 ImageButton 支持文字右侧显示。
8. Android 代码优化技术
1.Java 内存控制 对于字符串操作而言如果需要连加这样的操作建议使用 StringBuilder ,经
过 调 试 不 难 发 现 如果 你 的 字 符串 每 次 连 加, 使 用 String 需 要 的 内 存 开 销会 远 大 于
StringBuilder ,然后 Android 手机常规的运行内存大约在 128MB 左右, 对于运行多任务就需
要考虑了, Android 开发网 提示因为 Java 有 GC 不需要手动释放那么分配的时候就要格外的
小心, 频繁的 GC 操作仍然是很影响性能的, 在调试时我们可以通过 logcat 查看内存释放情
况。 2.循环使用 平时在访问一个属性的时候效率远比一个固定变量低,如果你的循环估
计次数常常大于 5,假设 xxx.GetLength() 方法的值一般大于 5,推荐这样写,比如 for(int
i=0;i<xxx.GetLength();i++) 这里 xxx.GetLength 在每次循环都要调用, 必然会影响程序效率,
在 游 戏 开 发 中 显 得 更 为 明 显 , 改 进 的 方 法 应 该 为 int j=xxx.GetLength() for(int
i=0;i<j;i++) 3.图片的优化 在 Android 平台中 2 维图像处理库 BitmapFactory 做的比较智
能,为了减少文件体积和效率,常常不用很多资源文件,而把很多小图片放在一个图片中,
有切片的方式来完成, 在 J2ME 中我们这样是为了将少文件头而解决 MIDP 这些设备的问题,
而 Android 中虽然机型硬件配置都比较高, 有关 Android G1 硬件配置可以参考 G1 手机参数
以及评测 ,但是当资源多时这样的运行效率还是令人满意的,至少 Dalvik 优化的还不是很
够。
9. Android 开发进阶之 NIO 非阻塞包 (一)
对于 Android 的网络通讯性能的提高, 我们可以使用 Java 上高性能的 NIO (New I/O) 技术进
行处理, NIO 是从 JDK 1.4 开始引入的, NIO 的 N 我们可以理解为 Noblocking 即非阻塞的
意思,相对应传统的 I/O ,比如 Socket 的 accpet()、read()这些方法而言都是阻塞的。 NIO
主要使用了 Channel 和 Selector 来实现, Java 的 Selector 类似 Winsock 的 Select 模式,是一
种基于事件驱动的,整个处理方法使用了轮训的状态机,如果你过去开发过 Symbian 应用
的话这种方式有点像活动对象, 好处就是单线程更节省系统开销, NIO 的好处可以很好的处
理并发,对于 Android 网游开发来说比较关键,对于多点 Socket 连接而言使用 NIO 可以大
大减少线程使用, 降低了线程死锁的概率, 毕竟手机游戏有 UI 线程, 音乐线程, 网络线程,
管理的难度可想而知, 同时 I/O 这种低速设备将影响游戏的体验。 NIO 作为一种中高负载
的 I/O 模型,相对于传统的 BIO (Blocking I/O) 来说有了很大的提高, 处理并发不用太多的线
程,省去了创建销毁的时间,如果线程过多调度是问题,同时很多线程可能处于空闲状态,
大大浪费了 CPU 时间,同时过多的线程可能是性能大幅下降,一般的解决方案中可能使用
线程池来管理调度但这种方法治标不治本。 使用 NIO 可以使并发的效率大大提高。 当然 NIO
和 JDK 7 中的 AIO 还存在一些区别, AIO 作为一种更新的当然这是对于 Java 而言,如果你
开发过 Winsock 服务器,那么 IOCP 这样的 I/O 完成端口可以解决更高级的负载,当然了今
天 Android123 主要给大家讲解下为什么使用 NIO 在 Android 中有哪些用处。 NIO 我们分
为几个类型分别描述, 作为 Java 的特性之一, 我们需要了解一些新的概念, 比如 ByteBuffer
类, Channel, SocketChannel,ServerSocketChannel,Selector 和 SelectionKey。有关具体的
使用, Android 开发网将在明天详细讲解。网友可以在 Android SDK 文档中看下 java.nio 和
java.nio.channels 两个包了解。 http://www.android123.com.cn/androidkaifa/695.html
了解下这种技术,看看在马上要做的项目中是否用得到
10. Android Theme 和 Styles 内部定义解析
昨天我们讲到的有关在 AndroidManifest.xml 中定义 Activity 的 theme 方法来实现无标题的方
法,在 使用 xml 让你的 Activity 无标题方法 一文中讲到的, 很多网友不明白为什么这样做,
其实在 Android123 以前的文章中多次提到了 styles 样式定义方法, 今天 Android 开发网再次
把一些网友回顾了解下 android 样式的内部定义。在一个工程的 res/values/theme.xml 中我们
可以方便的定义自己的风格主题,比如下面的 cwjTheme 中我们使用了基于 android 内部的
白色调的背景 Theme.Light ,设置 windowsNoTitle 为 true 代表没有标题,背景颜色我们使用
了 android 内部定义的透明,同时设置 listView 控件的样式为 cwjListView ,xml 样式代码如
下: <?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="cwjTheme" parent="android:Theme.Light">
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:listViewStyle">@style/cwjListView</item>
</style> 有关 ListView 控件我们自定义的风格就是修改下系统 listview 这个控件的每行分隔
符样式, 这里我们在工程下 res/drawable 文件夹下放一个图片名为 list_selector 图片,这样我
们 的 cwjListView 的 代 码 可 以 这 样 写 <style name="cwjListView"
parent="@android:style/Widget.ListView">
<item name="android:listSelector">@drawable/list_selector</item>
</style>
</resources> 通过定义 style 可以设 置更多 ,比如 让 cwjListView 的字 体颜色 就加入
textAppearance 属 性 , 比 如 <item
name="textAppearance">@android:style/TextAppearance</item> 等等。
11.Android JSON 解析示例代码
来自 Google 官方的有关 Android 平台的 JSON 解析示例,如果远程服务器使用了 json 而不
是 xml 的数据提供,在 Android 平台上已经内置的 org.json 包可以很方便的实现手机客户端
的解析处理。下面 Android123 一起分析下这个例子,帮助 Android 开发者需要有关 HTTP
通讯、正则表达式、 JSON 解析、appWidget 开发的一些知识。 public class WordWidget extends
AppWidgetProvider { //appWidget
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
context.startService(new Intent(context, UpdateService.class)); //避免 ANR ,所以 Widget
中开了个服务
} public static class UpdateService extends Service {
@Override
public void onStart(Intent intent, int startId) {
// Build the widget update for today
RemoteViews updateViews = buildUpdate(this); ComponentName
thisWidget = new ComponentName(this, WordWidget.class);
AppWidgetManager manager = AppWidgetManager.getInstance(this);
manager.updateAppWidget(thisWidget, updateViews);
} public RemoteViews buildUpdate(Context context) {
// Pick out month names from resources
Resources res = context.getResources();
String[] monthNames = res.getStringArray(R.array.month_names); Time
today = new Time();
today.setToNow(); String pageName =
res.getString(R.string.template_wotd_title,
monthNames[today.month], today.monthDay);
RemoteViews updateViews = null;
String pageContent = ""; try {
SimpleWikiHelper.prepareUserAgent(context);
pageContent = SimpleWikiHelper.getPageContent(pageName, false);
} catch (ApiException e) {
Log.e("WordWidget", "Couldn't contact API", e);
} catch (ParseException e) {
Log.e("WordWidget", "Couldn't parse API response", e);
} Pattern pattern =
Pattern.compile(SimpleWikiHelper.WORD_OF_DAY_REGEX); // 正则表达式处理, 有关定义见
下面的 SimpleWikiHelper 类
Matcher matcher = pattern.matcher(pageContent);
if (matcher.find()) {
updateViews = new RemoteViews(context.getPackageName(),
R.layout.widget_word); String wordTitle = matcher.group(1);
updateViews.setTextViewText(R.id.word_title, wordTitle);
updateViews.setTextViewText(R.id.word_type, matcher.group(2));
updateViews.setTextViewText(R.id.definition,
matcher.group(3).trim()); String definePage =
res.getString(R.string.template_define_url,
Uri.encode(wordTitle));
Intent defineIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(definePage)); //
这里是打开相应的网页,所以 Uri 是 http 的 url ,action 是 view 即打开 web 浏览器
PendingIntent pendingIntent = PendingIntent.getActivity(context,
0 /* no requestCode */, defineIntent, 0 /* no flags */);
updateViews.setOnClickPendingIntent(R.id.widget, pendingIntent); // 单击 Widget
打开 Activity } else {
updateViews = new RemoteViews(context.getPackageName(),
R.layout.widget_message);
CharSequence errorMessage = context.getText(R.string.widget_error);
updateViews.setTextViewText(R.id.message, errorMessage);
}
return updateViews;
} @Override
public IBinder onBind(Intent intent) {
// We don't need to bind to this service
return null;
}
}
} 有关网络通讯的实体类,以及一些常量定义如下 : public class SimpleWikiHelper {
private static final String TAG = "SimpleWikiHelper"; public static final String
WORD_OF_DAY_REGEX =
"(?s)\\{\\{wotd\\|(.+?)\\|(.+?)\\|([^#\\|]+).*?\\}\\}"; private static final String
WIKTIONARY_PAGE =
"http://en.wiktionary.org/w/api.php?action=query&prop=revisions&titles=%s &" +
"rvprop=content&format=json%s"; private static final String
WIKTIONARY_EXPAND_TEMPLA TES =
"&rvexpandtemplates=true"; private static final int HTTP_STA TUS_OK =
200; private static byte[] sBuffer = new byte[512]; private static String sUserAgent =
null; public static class ApiException extends Exception {
public ApiException(String detailMessage, Throwable throwable) {
super(detailMessage, throwable);
} public ApiException(String detailMessage) {
super(detailMessage);
}
剩余42页未读,继续阅读
资源评论
cyh76339129
- 粉丝: 1
- 资源: 14万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功