Android知识点

下面这段activity的配置可以防止onCreate方法在锁屏或者屏幕旋转时被调用,转而调用onConfigurationChanged方法,避免onCreate重复调用
<activity android:name=".ProgressTestActivity"
android:label="@string/app_name"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard">
</activity>
Android程序启动时,同时会启动一个主线程,主要负责处理UI相关事件,所以主线程通常被叫做UI线程。当多个线程并发操作UI组件时,可能导致线程安全问题。为了解决这个问题,Android制定了一条简单的规则:只允许UI线程修改Activity里的UI组件。而这个规则也会导致新的问题,即新启动的线程无法动态改变界面组件的属性,此时需要借助Handler的消息传递机制来改变UI组件,Android提供了如下几种解决方案:(1)使用Handler实现线程之间的通信(2)Activity.runOnUiThread(Runnable)(3)View.post(Runnable)(4)View.postDelayed(Runnable,long)。
配置Activity时可以指定android:launchMode属性,用于指定该Activity的加载模式:(a)standard,标准模式,默认的加载模式(b)singleTop,Task项单例模式(c)singleTask,Task内单例模式(d)singleInstance,全局单例模式。Android采用Task来管理多个Activity,启动一个应用时就会创建一个Task,可以调用getTaskId()方法来获得Activity所在Task的ID。Task以栈的形式来管理Activity,先启动的Activity被放在Task栈底,后启动的Activity被放在Task栈顶。Activity的加载模式launchMode就负责管理实例化、加载Activity的方式,并可以控制Activity与Task之间的加载关系。(1)standard:通过该模式启动Activity时,Android总会为目标Activity创建一个新的实例,并将该Activity添加到当前Task栈中。这种模式不会启动新的Task,新Activity被添加到原有的Task中。用户按下“返回”键时,系统会将Activity从栈顶逐一删除。(2)singleTop:与standard基本相似,但当被启动的Activity已经位于栈顶时,系统不会重新创建Activity的实例,而是直接复用已有的Activity实例。(3)singleTask:在同一个Task内只有一个Activity实例。如果要启动的Activity不存在,会创建新的Activity实例并加入栈顶;如果目标Activity已位于栈顶,此时与singleTop模式行为相同,直接复用;如果目标Activity存在但不在栈顶,系统会把位于目标Activity上的所有Activity移出Task栈,使目标Activity转入栈顶。(4)singleInstance:系统保证无论从哪个Task中启动目标Activity,只会创建一个目标Activity实例,并会使用一个全新的Task栈来装载该实例。如果目标Activity不存在,会创建全新的Task,再创建目标Activity实例;如果已存在,无论位于哪个应用或Task中,系统会把该Activity所在Task转到前台,使该Activity显示出来。采用该模式,Activity总位于栈顶,所在Task只包含该Activity。
在使用下拉列表Spinner时,如果你在onCreate中调用了getSelectedItemPosition方法,即使你只是设置listener,它的setOnItemSelectedListener事件也会自动执行。
AsyncTask用的是线程池机制,容量是128,最多同时运行5个core线程,剩下的排队。所以有时候,使用AsyncTask会很慢,甚至导致doInBackground不会执行。如果要停止AsyncTask的执行,不仅要调用cancel方法,还要在AsyncTask内部调用iscancelled方法来决定是否终止AsyncTask。某些情况下,即使你设置了标志位或者调用了cancel方法也不能结束AsyncTask的执行,也许是AsyncTask内部阻塞了,所以AsyncTask一直为running状态。
permission是自己定义权限,uses-permission是申请权限。调用Android函数时,要考虑到权限,如果配置文件中没有获取权限,会出现异常。比如获取DeviceID需要ReadPhoneState权限,获取Mac地址需要AccessWifiState权限。
动态加载布局时,将layout文件变为View,可以使用LayoutInflater:
LayoutInflater flater = LayoutInflater.from(this);
View view = flater.inflate(R.layout.example, null);
Button button = (Button) view.findViewById(R.id.button);
Android系统的消息队列和消息循环都是针对具体线程的,一个线程可以存在(当然也可以不存在)一个消息队列和一个消息循环(Looper),特定线程的消息只能分发给本线程,不能进行跨线程,跨进程通讯。但是创建的工作线程默认是没有消息循环和消息队列的,如果想让该线程具有消息队列和消息循环,需要在线程中首先调用Looper.prepare()来创建消息队列MessageQueue,然后调用Looper.loop()进入消息循环。异步消息处理线程启动后会进入一个无限的循环体之中,每循环一次,从其内部的消息队列中取出一个消息,然后回调相应的消息处理函数。若消息队列为空,线程则会阻塞等待。Looper的主要作用:
1、 与当前线程绑定,保证一个线程只会有一个Looper实例,同时一个Looper实例也只有一个MessageQueue。
2、 loop()方法,不断从MessageQueue中去取消息,交给消息的target属性的dispatchMessage去处理。
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
Activity是一个UI线程,运行于主线程中,Android系统在启动的时候会为Activity创建一个消息队列和消息循环(Looper),所以直接创建Handler就可以了。
消息的创建者就是一个或多个Handler。要发消息时,可以调用sendMessage,也可以用post或postDelayed方法。
如何更新UI才能不出异常呢?有以下4种方式可以从其它线程访问UI线程:
(1)Activity.runOnUiThread(Runnable)(2)View.post(Runnable)(3)View.postDelayed(Runnable, long)(4)Handler
Android知识点的更多相关文章
- Android开发工程师文集-Android知识点讲解
前言 大家好,给大家带来Android开发工程师文集-Android知识点讲解的概述,希望你们喜欢 WebView讲解 一般通过Intent调用系统的浏览器: Uri uri = Uri.parse( ...
- android知识点duplicateParentState
android知识点duplicateParentState 今天要做一个效果,组件RelativeLayout上有两个TextView,这两个TextView具有不同的颜色值,现在要的效果是,当Re ...
- Android知识点总结
说明 当中大部分文章都是转载自其它大神之手.在转载的过程中学到了非常多,这里主要解说的是android体系的相关知识点,本文会持续更新. 1 Android service相关知识点 Android ...
- android知识点随笔
android project中Manifest.xml中的<uses-sdk>标签元素决定的. 此标签包含如下3个属性: android:minSdkVersion —— 此属性决定你的 ...
- android 知识点收集
1. 计算时间流逝请使用SystemClock.elapsedRealtime... currentTimeMillis会受系统时钟影响 //未验证 2. android app私有文件的目录 ...
- android 知识点
版本更新 数据库Relam 图片加载库 视频bilibili 幻灯片 网络请求框架 内存检测工具 内存优化总结 压缩包下载并且解压 新闻资讯导航 联系人 滑动退出activity mvp框架 加载进度 ...
- Android知识点网址
1.proguard字段详解 http://blog.csdn.net/jddkdd2/article/details/8858909 2.android提示框(时间,普通单选.多选对话框),常用控件 ...
- Android知识点剖析系列:深入了解layout_weight属性
摘录自:http://www.cnblogs.com/net168/p/4227144.html 前言 Android中layout_weight这个属性对于经常捣鼓UI的我们来说,肯定不会陌生.但是 ...
- android 知识点汇总
1.activity 它是 android 应用程序的基本功能单元.一个Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务,例如拨号.拍照.Activity 本身是没有 ...
随机推荐
- Samza的ApplicationMaster
当Samza ApplicationMaster启动时,它做以下的事情: 通过STREAMING_CONFIG环境变量从YARN获取配置信息(configuration) 在随机端口上 启动一个JMX ...
- JS 封装类
function HighchartsObj(id, type) { var that = this; this.options = { chart : { renderTo : id, type : ...
- [itint5]字符串匹配
http://www.itint5.com/oj/#15 用hash来做,目前为止做到最好也是case16超时(20w的规模),即使分桶也超时.注意计算hashcode时,'a'要算成1,否则如果'a ...
- 从iPhone4、iPhone5、iPhone6看手机外壳加工工艺进化史
从iPhone4.iPhone5到iPhone6,苹果为我们推出了一代又一代新产品,让我们享受到最新的科技产品.每次不只是配置上的改变,苹果在工艺上也不断改变.下面就阐述一下我对这几款手机在设计和制造 ...
- adb开启不了解决方案
原文地址: adb开启不了解决方案 - vaecer - 博客频道 - CSDN.NET http://blog.csdn.net/vaecer/article/details/45894643 ...
- php简陋版实现微信公众号主动推送消息
推荐一个网站www.itziy.com csdn免积分下载器.pudn免积分下载器.51cto免积分下载器www.verypan.com 百度网盘搜索引擎www.94cto.com 编程相关视频教程. ...
- C# 自定义光标 WaitCursor
一种: 把图像文件放到项目的文件夹中 1 如果图像文件是.cur格式: Cursor cur=new Cursor(文件名); this.cursor=cur; 两句话 就完事 2 如果图像文件是其他 ...
- Pomelo服务器琐碎方法
1.获取客户端ip地址:session__session__.__socket__remoteAddress.ip 2.日志文件无法打印到文件,删除node_modules/pomelo/node_m ...
- URAL1501. Sense of Beauty(记忆化)
链接 dfs+记忆化 对于当前状态虽然满足和差 但如果搜下去没有满足的情况也是不可以的 所以需要记忆化下 #include <iostream> #include<cstdio> ...
- 高性能PHP支持静态类型
PHP+QB是一个可选的PHP虚拟机,它声称在性能上提供了数量级的提升.而负面影响就是它需要所有的内容都必须是静态类型,同时也对数组做了一些限制. 静态 类型声明 是通过PHPDoc语法的一个扩展添加 ...