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 本身是没有 ...
随机推荐
- 用IDEA调试Play工程
IDEA的版本是14.0.1,运行在MAC OS X Yosemite上. IDEA已经装了Scala插件,但是在新建工程中,Scala的选项中并没有Play框架,不知道什么原因. 导入Play工程 ...
- HDU 1429 胜利大逃亡(续)(三维BFS)
题目链接 题意 : 中文题不详述. 思路 : 这个题和1885差不多一样的,所以我直接改了改那个代码就交上了,链接 #include <stdio.h> #include <stri ...
- EntityFreamwork 读写分离
http://www.cnblogs.com/cjw0511/p/4391092.html
- [topcoder]BadNeighbors
http://community.topcoder.com/stat?c=problem_statement&pm=2402&rd=5009 动态规划题.对于圈状的题目有了点感觉. 题 ...
- 【mysql的编程专题⑥】视图
视图是表的一个映射,是一张虚表,在结构上视图和普通的表没什么区别,一样可以用sql语句来增删改查; 视图创建后是一直存在数据库内 操作 创建视图 语法 CREATE [ALGORITHM]={UNDE ...
- java项目
http://www.java1234.com/a/kaiyuan/java/ http://www.cnblogs.com/burellow/archive/2011/04/22/2024871.h ...
- poj2886Who Gets the Most Candies? (约瑟夫环)
http://poj.org/problem?id=2886 单点更新 初始位置都是1 如果这个人出去 位置变为0 利用线段树求区间k值 k值的计算如下 如果这个数值是负的 那么下一个人的就是((k- ...
- mysql隔离机制
转 MySQL隔离级别 mysql-Innodb事务隔离级别-repeatable read详解(转)
- bzoj1044
好题 第一问不难,毕竟二分答案类的题目在USACO上都练了好多遍了 第二问充分的暴露了我dp渣的本性 一开始楞是没想出来 f[i,j]表示到第i根木棒切了j刀满足最长段小于等于ans的方案数 式子是这 ...
- 使用hibernate tools插件生成POJO
很多时候我们已经设计好了数据库,需要使用hibernate来做数据持久化,因此需要根据数据库中的表结构生成相应的POJO. 本例使用hibernatetools来自动创建pojo. 测试环境:ecli ...