ADB常用命令

前几天参加了公司组织的Android兴趣小组的培训,里面讲到了很多Android ADB中常用的命令,有些是很实用的,整理一下以备后用。

进入adb shell: android shell

查看日志:adb? logcat

重新挂载文件系统为可写:adb? remount

adb pull remote local:adb -d pull /storage/sdcard1/ceshi.txt e:/temp

adb push local to remote:adb push ceshi.txt /storage/sdcard1

adb install XXX.apk:adb -e install XXX.apk

adb uninstall packagename:adb -e uninstall com.thunisoft.app

pm list packages|grap XXX:pm list packages| grep thunisoft

pm path <packagename>:pm path com.thunisoft.beijingPerson.search

am start <Intent> :am start com.thunisoft.beijingPrison.XXX/.MainActivity

am broadcast <Intent>:am broadcast -a android.intent.action.BOOT_COMPLETED

Monkey -p? <package> exetimes:monkey -p con,thunisoft.beijingPersion.XXX 100

 

一个应用是怎么在Android系统中运行的

以前一直听说Android是基于Linux操作系统的基础上修改而来的,是阉割版的Linux。但是一个APP是怎样在Android上运行的,资源怎么分配,和Linux又有什么关系还是不得而知。直到前几天在看android的官方API才直到了一点答案。现将API中的原话摘录如下:

“Android应用程序以java作为开发语言。用Android SDK 提供的工具,可以将应用程序所需要的数据和资源文件打包到一个android包文件中,这个文件用.apk作为扩展名。所有代码都在单个.apk文件中,这个文件就是通常安装在Android设备中的应用. 一旦安装到了一个设备,每个应用生存在它自己的安全沙箱中。

  • 一个Android系统是一个多用户的Linux系统,其中的每个应用都是一个不同的用户。
  • 默认情况下,系统给每个应用分配一个独立的Linux用户ID(这个ID只由系统使用并且对应用来说是不可知的),系统给在某个应用中的所有文件设置了权限,所以只有分配了那个用户ID的应用才能访问它们
  • 每个进程拥有它自己的虚拟机,所以一个应用代码的运行,与其他应用代码的运行是隔离的.
  • 默认情况下,每个应用程序均运行于它自己的Linux进程中。当应用程序中的任意代码开始执行时,Android启动一个进程,而当不再需要此进程而其它应用程序又需要系统资源时,则关闭这个进程。

通过这种方法,Android系统实现了最小特权原则。默认,每个应用仅仅访问需要工作的组件,并不多做其他的事。这样创建了一个非常安全的环境,应用不能访问系统没有授权的其他部分.

然而,应用可以有多种方法来与其他应用,共享数据及访问系统服务:

  • 有可能安排两个应用共用一个linux系统ID,在那种情况下,它们能互相访问相互的数据。为了节约系统资源,拥用相同用户ID的应用,可能也被安排运行在同一个Linux进程中并共享相同的VM(应用必须被签名成同样的认证)。
  • 所用应用能请求允许访问硬件数据,比如像用户通信录,SMS消息及可挂载的存储设备(SD card),摄像头,蓝牙等,所有应用的权限必须在用户安装时被许可。”

 

Activity生命周期

从去年接触Android搭建开发环境开始我就看过与Activity有关的api,但是因为后来没怎么接触android,所以与Activity生命周期有关的知识点都忘记了,这几天温故了一下,现将Activity生命周期有关的官网图贴出来,以便后面查看和记忆。

activitylifecycle

生命周期图中的各个方法的说明如下:

onCreate():当?activity?第一次创建时会被调用。在这个方法中你需要完成所有的正常静态设置?,比如创建一个视图(?view?)、绑定列表的数据等等。如果能捕获到?activity?状态的话,这个方法传递进来的?Bundle?对象将存放了?activity?当前的状态。调用该方法后一般会调用?onStart()?方法。

onRestart():在?activity?被停止后重新启动时会调用该方法。其后续会调用?onStart?方法。

onStart():当?activity?对于用户可见前即调用这个方法。如果?activity回到前台则接着调用?onResume()?,如果?activity?隐藏则调用onStop()

onResume():在?activity?开始与用户交互前调用该方法。在这时该activity?处于?activity?栈的顶部,并且接受用户的输入。其后续会调用?onPause()?方法。

onPause():在系统准备开始恢复其它?activity?时会调用该方法。这个方法中通常用来提交一些还没保存的更改到持久数据?中,停止一些动画或其它一些耗?CPU?的操作等等。无论在该方法里面进行任何操作,都需要较快速完成,因为如果它不返回的话,下一个?activity?将无法恢复出来。如果?activity?返回到前台将会调用?onResume()?,如果?activity?变得对用户不可见了将会调用onStop()?。

onStop():在?activity?对用户不可见时将调用该方法。可能会因为当前?activity?正在被销毁,或另一个?activity?(已经存在的activity?或新的?activity?)已经恢复了正准备覆盖它,而调用该方法。如果?activity?正准备返回与用户交互时后续会调用onRestart?,如果?activity?正在被释放则会调用?onDestroy?。

onDestroy():在?activity?被销毁前会调用该方法。这是?activity?能接收到的最后一个调用。可能会因为有人调用了?finish?方法使得当前activity?正在关闭,或系统为了保护内存临时释放这个?activity的实例,而调用该方法。你可以用?isFinishing?方法来区分这两种不同的情况。

最后还有几个特殊的情况需要知道:

Activity的启动过程:onCreate—onStart—onResume;

按下返回键时:onPause—onStop—onDestroy ,当按下返回键时,此Activity弹出栈,程序销毁。

再次打开:onCreate—onStart—onResume

按下Home键:onPause—onStop,回到Launcher

从onStop()再次打开的运行过程:onRestart—onStart—onResume

屏幕横竖屏切换时activity也会先销毁再重建一遍。