Ericson's blog Time is limited, To be a better better man

LogCat调试Android

在Android开发中,LogCat是一个非常重要的调试工具,可以输出很多信息。LogCat输出类型一般有五种:verbose, debug, info, warn, error。这些层次是向下兼容的。我们可以通过进程ID、项目包名、tag标签、text输出文本来限定输出范围。 主要通过定义Filter来实现。如下图所示: LogCat Filter

Activity生命周期总结

Activity是Android中的四大重要组件之一,必须了解的点,主要是它的生命周期: Activity LifeCycle 主要有一下几个过程:

  1. 启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。
  2. 当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行,并继续执行onStop方法。
  3. 当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onRestart方法,再次进入运行状态。
  4. 当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。
  5. 用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。
  6. 当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。
  7. 用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。

但是知道这些还不够,我们必须亲自试验一下才能深刻体会,融会贯通。下面是示例:

###启动时: Activity Start ###锁屏时: Activity Lock ###解锁时: Activity Unlock 其中还有一个onSaveInstanceState方法,该方法调用是在onPause方法之后,主要有三种情况调用:

  1. 在Activity被覆盖或退居后台之后,系统资源不足将其杀死,此方法会被调用;
  2. 在用户改变屏幕方向时,此方法会被调用;
  3. 在当前Activity跳转到其他Activity或者按Home键回到主屏,自身退居后台时,此方法会被调用。

当屏幕旋转时,android会先销毁当前Activity,再建一个新的,log如下: Activity Rotate

Android安装配置

本人比较喜欢使用JetBrains的Intellij IDEA作为java的开发工具,所以在Intellij中搭建的Android开发环境,Intellij中包含了Android的插件,如果没有包含,可以自行搜索下载。另外,我用的是Genymotion充当android模拟器,Intellij自带的模拟器太慢,配置主要遇到了几个问题:

###Android sdk的下载:
很遗憾的是,这个Android sdk更新网站要翻墙,所以需要翻墙下载(翻墙你懂的)。然后就是在Setting中设置路径。

###首次运行Android小程序出现java -source 1.3中不支持注释:
本来以为需要下载更新的jdk,后来发现只要在Project Structure的Project中设置Project language level就行了。

###Compilation failed:internal java compiler error:
重新在Setting中设置下Java Compiler就行,设成你电脑上对应的版本。

###Genymotion安装出错:VirtualBox can’t run the virtual device,错误图如下所示: Genymotion Error 系统为win10,网上很多方法,比如,更改网络连接,使用管理员权限启动程序,修改注册表等等;但我都试了下,还没解决,看了日志文件发现上面说的是不能激活,看起来像是要花钱购买,但是网上个人使用的似乎不用花钱。待解决~~~

Linux环境变量问题

在Linux系统中每个用户都有自己专属的运行环境,由各自的环境变量定义。用户可以设置临时环境变量:

export NAME=”hello word”

exho $NAME

env命令用来查看当前用户的环境变量。

下面介绍登录linux环境变量执行过程:
首先启动/etc/profile文件,然后启动用户目录下的~/.bash_profile, ~/.bash_login或~/.profile三个文件中的一个,执行的顺序为:~/.bash_profile, ~/.bash_login, ~/.profile。如果~/.bash_profile文件存在的话,一般还会执行~/.bashrc文件。因为~/.bashrc文件中还会调用./etc/bashrc,所以总的执行顺序为:

/etc/profile -> (~/.bash_profile | ~/.bash_login | ~/.profile) -> ~/.bashrc -> ./etc/bashrc -> ~/.bash_logout

各文件作用说明:

  • /etc/profile:此文件为系统的每个用户设置环境变量,当用户第一次登录时,该文件被执行。并从/etc/profile.d目录的配置文件中搜集shell的设置。
  • /etc/bashrc:为每一个运行bash shell的用户执行此文件。当bash shell被打开时,该文件被读取(就是每次新开一个终端,都会执行bashrc)。
  • ~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。默认情况下,设置一些环境变量,执行用户的.bashrc文件。
  • ~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时,以及每次打开新的shell时,该文件被读取。
  • ~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件,另外,/etc/profile中设定的变量可以作用于任何用户,而~/.bashrc等中设定的变量只能继承/etc/profile中的变量,它们是“父子”关系。
  • ~/.bash_profile:是交互式、login方式进入bash运行的,~/.bashrc是交互式、non-login方式进入bash运行的,通常两者设置大致相同,所以通常前者会调用后者。

对于用户的shell初始化而言是先执行/etc/profile,再读取文件/etc/environment;对整个系统而言是先执行/etc/environment。

登录系统的顺序:

/etc/environment–>/etc/profile–>$HOME/.profile–>$HOME/.env

/etc/profile:是所有用户的环境变量

/etc/environment:是系统的环境变量

登录系统时shell读取顺序是:

/etc/profile–>/etc/environment–>$HOME/.profile–>$HOME/.env

Hadoop配置错误一

场景:有个Hadoop集群,有两个用户,各自都配有Hadoop,更改的端口,能正常启动,各自把hadoop的配置写在了~/.bashrc文件中。两个hadoop可以同时启动,并且运行wordcount程序正常。

问题:现在一个root账户,一个ericson账户,两个账户都配置了hadoop,当我用root账户启动命令行,并且用su ericson转到ericson账户下启动hadoop,会出现问题。(该问题应该和linux配置文件执行顺序机制有关)

解决:在Linux装软件,配置环境时,尽量要用当前用户登录命令行,有时候可能会需要重新开启命令行来加载更改的环境变量。

###补充

上面之所以不能su切换用户,主要是ericson的环境变量设置错了,没有覆盖root的用户环境变量,导致运行出错。还有种方法是用su -来切换用户,示例如下:

ericson里面没有设置HADOOP_YARN_HOME变量,而root里面设置了HADOOP_YARN_HOME变量为自己的hadoop路径,当ericson启动hadoop或运行hadoop时,就会读取该配置,由于hadoop的版本不一样,可能导致错误。