下面这段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知识点的更多相关文章

  1. Android开发工程师文集-Android知识点讲解

    前言 大家好,给大家带来Android开发工程师文集-Android知识点讲解的概述,希望你们喜欢 WebView讲解 一般通过Intent调用系统的浏览器: Uri uri = Uri.parse( ...

  2. android知识点duplicateParentState

    android知识点duplicateParentState 今天要做一个效果,组件RelativeLayout上有两个TextView,这两个TextView具有不同的颜色值,现在要的效果是,当Re ...

  3. Android知识点总结

    说明 当中大部分文章都是转载自其它大神之手.在转载的过程中学到了非常多,这里主要解说的是android体系的相关知识点,本文会持续更新. 1 Android service相关知识点 Android ...

  4. android知识点随笔

    android project中Manifest.xml中的<uses-sdk>标签元素决定的. 此标签包含如下3个属性: android:minSdkVersion —— 此属性决定你的 ...

  5. android 知识点收集

    1.  计算时间流逝请使用SystemClock.elapsedRealtime... currentTimeMillis会受系统时钟影响  //未验证 2.  android app私有文件的目录 ...

  6. android 知识点

    版本更新 数据库Relam 图片加载库 视频bilibili 幻灯片 网络请求框架 内存检测工具 内存优化总结 压缩包下载并且解压 新闻资讯导航 联系人 滑动退出activity mvp框架 加载进度 ...

  7. Android知识点网址

    1.proguard字段详解 http://blog.csdn.net/jddkdd2/article/details/8858909 2.android提示框(时间,普通单选.多选对话框),常用控件 ...

  8. Android知识点剖析系列:深入了解layout_weight属性

    摘录自:http://www.cnblogs.com/net168/p/4227144.html 前言 Android中layout_weight这个属性对于经常捣鼓UI的我们来说,肯定不会陌生.但是 ...

  9. android 知识点汇总

    1.activity 它是 android 应用程序的基本功能单元.一个Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务,例如拨号.拍照.Activity 本身是没有 ...

随机推荐

  1. 使用rsyslog+loganalzey收集日志显示客户端ip

    http://www.ituring.com.cn/article/128536 rsyslog localhost 转发 http://bigsec.net/one/tool/rsyslog.htm ...

  2. Android中如何取消调转界面后EditText默认获取聚焦问题

    最近在做一个项目,当我点击跳转至一个带有EditText的界面后,模拟器中的软键盘会自动弹出,严重影响了用户体验.在网上找了资料,现总结如下. 我们知道,EditText有一个 android:foc ...

  3. HashTable、HashMap、LinkedHashMap、TreeMap的比较

    HashTable:继承自Dictionary类,实现了Map接口,不允许键或值为空,线程同步: HashMap:继承自AbstractMap类,实现了Map接口,允许键或值为空,线程不同步: Lin ...

  4. mybatis传入map参数parameterType

    基本数据类型:包含int,String,Date等.基本数据类型作为传参,只能传入一个.通过#{参数名} 即可获取传入的值 复杂数据类型:包含JAVA实体类.Map.通过#{属性名}或#{map的Ke ...

  5. Java IO5:序列化与反序列化

    一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...

  6. 如何定制Sink扩展.Net Remoting功能

    http://www.cnblogs.com/rickie/archive/2004/10/21/54891.html

  7. Maven、gradle、Ant、Eclipse IDE

    Maven.gradle.Ant.Eclipse IDE之间的关系 http://wenku.baidu.com/view/d33208810912a21615792910.html?from=sea ...

  8. POI使用cell.getCellStyle()设置指定单元格颜色,但是其它没有指定的单元格也会变色

    HSSFCell cell = row.createCell((short)i); cell.getCellStyle().setAlignment(HSSFCellStyle.ALIGN_RIGHT ...

  9. SCADA软件整体架构

    SCADA软件整体框架如下所示: 1.免费版本可以支持的IO容量为2048点,无运行时间限制. 2.免费版本仅支持本地Runtime运行,CLServer服务器只能运行24小时. 3.免费版本支持的驱 ...

  10. mac osx 升级yosemite后java出错的解决

    原文  http://www.cnblogs.com/walkerwang/p/4034152.html