下面这段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. C++: std::string 与 Unicode 如何结合?

    关键字:std::string Unicode 转自:http://www.vckbase.com/document/viewdoc/?id=1293 一旦知道 TCHAR 和_T 是如何工作的,那么 ...

  2. Tarjan+模板

    #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #in ...

  3. highcharts 切换

    <!doctype html> <html lang="en"> <head> <script type="text/javas ...

  4. 【转】VMware设置共享文件夹之后Ubuntu中看不到怎么办?

    一.共享文件夹设置好了,但是在虚拟机中的Ubuntu系统下却看不到,怎么办? 一种可能的原因是系统没有自动挂载,解决办法: 1.安装:               sudo apt-get insta ...

  5. P38、面试题3:二维数组中的查找

    题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 首先选取数组中右上角的数字 ...

  6. Git教程(10)git比较复杂的功能

    1,只拣选某分支中的一个提交,然后把它合并到当前分支 $ git cherry-pick e43a6fd3e94888d76779ad79fb568ed180e5fcdf 2,Rerere 它是一种重 ...

  7. Application.CommonAppDataPath的路径

    Application.CommonAppDataPath; win7的路径 C:\ProgramData\CompanyName\ProductName\2.0.5.1 [assembly: Ass ...

  8. 在try...catch语句中执行Response.End()后如何停止执行catch语句中的内容

    在调用Response.End()时,会执行Thread.CurrentThread.Abort()操作. 如果将Response.End()放在try...catch中,catch会捕捉Thread ...

  9. JQuery安全分析

    JQuery安全分析: JQuery的风险均来源于对输入的数据没有进行有效性检验.客户端的Javascript需要检验:来源于服务器的数据.来源于当前页面的用户输入,服务器端需要检验来源于用户端的数据 ...

  10. postgreSQL数据类型转换字符串和数值

    1.将数值转成字符串类型  方法1:调用to_char(int, text)函数,int为要转换值,text为数值格式化模式,其中模式描述为: 模式 描述 9 带有指定数值位数的值 0 带前导零的值 ...