安卓常规知识更新总结(特别是Linux指令)
One(一):
//--------------------------------------------------------------
串口调试:
zero:串口调试开启安卓命令行调试:start adbd
one:获取系统读写权限:mount -o remount,rw /system/
two:在cd 路径的时候使用Tab键来补充路径和显示文件夹下的所有文件
three:使用U盘获取和写入文件到system->cp sourcepath destinationpath
four:查看文件的大小(byte)->ls -l
//--------------------------------------------------------------
CSDN博客离线网址:http://write.blog.csdn.net/mdeditor
Markdown的语法使用:
- 加粗 `Ctrl + B`
- 斜体 `Ctrl + I`
- 引用 `Ctrl + Q`
- 插入链接 `Ctrl + L`
- 插入代码 `Ctrl + K`
- 插入图片 `Ctrl + G`
- 提升标题 `Ctrl + H`
- 有序列表 `Ctrl + O`
- 无序列表 `Ctrl + U`
- 横线 `Ctrl + R`
- 撤销 `Ctrl + Z`
- 重做 `Ctrl + Y`
[^footnote] 脚注
[TOC] 生成目录
以下是表格模式:
| 项目 | 价格 | 数量 | ----定义表格项
| :-------- | --------:| :--: | ---定义内容的位置(靠右,居中还是靠左)
//---------------------------------------------------------------------------
Unicode:汉字(\u4E00-\u9FA5)19968-40869
//---------------------------------------------------------------------------
Android中应用程序apk安装的情况:
/data/system/packages.xml 记录了apk安装的相关信息包括包名、位置等
/data/app/ 第三方aok安装位置;/data/app-lib 第三方app的so库位置
/system/app/ 系统apk安装位置 或者 /system/priv-app;/system/lib 系统app的so库位置
/data/data/ 存放apk运行时的数据包括文件和数据库等
/data/dalvik-cache/ 缓存apk对应的dex文件
linux命令词:
注意:window的命令行想切换到其他盘符只需:盘符号:回车\r即可,如果想进入该盘符的具体位置则需要cd xxx
procrank---查看所有应用的各内存的占用情况
cat /proc/meminfo---查看系统内的内存情况
adb shell dumpsys cpuinfo---查看当前的cpu的占用信息
adb shell dumpsys meminfo---查看当前的内存占用信息
rm -r xxx---删除指定xxx名字的文件夹以及其内部的文件
rm -rf xxx---可以删除文件夹和文件
rm xxx---删除xxx文件
rmdir xxx---删除xxx文件夹
mkdir xxx---创建xxx文件夹
ps---查看所有的进程
getevent---显示物理按键的按下和抬起的信息(-c count:显示count行信息)
cd /data/dalvik-cache/arm(或者/arm64)
cd ../---回到上一级目录
am startservice -a xxx
am start -n 包名/类全名
am broadcast -a xxx
adb shell dumpsys media.audio_policy
dumpsys package com.iflytek.xiri | grep "versionCode"---查询com.iflytek.xiri包名的版本号等信息
adb shell tinycap /data/data/file.wav -D 0 -d 2 -p 10(adb push tinycap /system/bin)
pm clear 包名---清空应用的本地存储数据
ls -l---查看在该目录下所有文件的内存占用等详情
chmod 777 file---修改该文件被所有人读写修改操作 //或者664
top---查看cpu占用率和使用内存等 ; 可以加上包名筛选:top | grep com.iflytek.xiri 或者显示内存占用最高的5个:top -m 5
pm path 包名---查询系统中有没有该应用程序,位置在哪里
cd sys/devices/system/cpu/cpu0/cpufreq---查看cpu的主频等信息;cat cpuinfo_cur_freq---查看数据情况
pm install 全名---类似于adb install,可用于usb中安装apk
adb install -r 全名---覆盖安装应用
adb logcat -c---清除所有log
adb logcat -v time >D:\xxx.txt---按时间获取log存放在本地D盘的下
mount -o remount,rw/system
getprop | grep release---获取系统的安卓版本号
cat audio_policy.conf---在命令行查看该配置文件
首先adb shell 进去 之后cat /proc/cupinfo---在命令行查看cpu的属性例如平台的硬件版本(hi3751等)
adb pull /system/etc/bluetooth/bt_stack.conf---导出蓝牙配置,修改配置可以调试
adb shell进去logcat -v time | grep 进程号或者TAG---可以在控制台上打印log输出
adb shell进去top -m 5 -t | grep xxx---可以看到xxx进程中前五个线程的cpu占用
netstat -ano | findstr "5037"---查看进程占用的
busybox ps---查看所有运行的进程
adb kill-server---杀一下adb进程
adb start-server---启动adb进程服务
am broadcast -a android.net.conn.CONNECTIVITY_CHANGE---命令行启动一个ation广播
am startservice -n com.android.traffic/com.android.traffic.maniservice---命令行启动一个服务/-a intentaction
am start -n com.android.browser/com.android.browser.BrowserActivity---命令行启动一个活动
mstar848/hisiv811:
ps -A | grep com.iflytek.xiri---848查看进程
分支:
mount -o remount,chagnhong,rw /system---长虹除848外其他机种的权限
smart_ch---密码
分支:
konka:开启log--->adb shell start adbd
海思v811:
需要命令行开启屏幕显示:
第一步:先屏蔽所有系统log:su \r(回车) echo 0 > /proc/sys/kernel/printk
第二步:su \r sample_hdmitx 之后敲击键盘:Ctrl+Z
注意:首先要在康佳电视上选对hdmi口即可显示界面
tips:夜神模拟器adb连接到eclipse
首先切换到夜神的bin目录下,然后执行命令:nox_adb.exe connect 127.0.0.1:62001即可
串口工具的使用:要么使用专用的服务孔调试线进行串口调试,要么使用usb转接芯片转换的串口调试线,都必须下载串口调试软件,我现在使用的是SecureCRT.exe
在串口软件主窗口处可以使用TAB键来自动填充存在的文件夹或者文件名称
串口软件具有缓存logcat的功能,你可以执行完命令后打log查找自己想要的logcat;
chmod是Linux下设置文件权限的命令:三个数字,第一个是文件所有者权限,第二个是与文件所有者同属一个用户组的其他用户的权限,第三个表示其他用户组的权限;权限分三种:读(r=4),写(w=2),执行(x=1)
mount -o rw,remount /system---获取权限
df---获取U盘的相关信息,主要用于看U盘的位置信息等
mount---获取一些相关信息,待完善
ifconfig---可以查看IP地址信息
如果需要装一些文件或者apk:
apk:pm install apk在U盘中的确切路径
file:cp file在U盘中的确切路径 希望存入系统的确切路径
echo 0 > /proc/sys/kernel/printk---串口工具关闭log
logcat |grep xiri &---后台运行xiri的log
fg 回车 然后ctrl+C 取消后台log
top > /data/data/com.iflytek.xiri/xxx.log---将cpu的占用率写入xxx.log的文件中
--->其他的例如创建文件夹mkdir、rm、mv等都和adb中的Android调试一样
clear---串口工具窗口请屏幕
//---------------------------------------------------------------------------
重点理解:容易遗忘,难点
知识点零:计算机中处理整数(主要是unsigned)采用补码进行存储数据(补码的形式在+0和-0是一致性的)
知识点一:signed byte的范围:-127~127(外加-128因为-0是10000000)
知识点二:正数的原码、反码和补码都是其本身,负数的原码是其本身,反码是除了符号位其他位取反,补码是反码加一
//--------------------------------------------------------------------------
音频焦点:
1、AudioManager.AUDIOFOCUS_LOSS_TRANSIENT--->临时丢失
2、AudioManager.AUDIOFOCUS_GAIN
3、AudioManager.AUDIOFOCUS_GAIN_TRANSIENT--->临时获取
4、AudioManger.AUDIOFOCUS_LOSS
首先:requestAudioFocus;使用完之后:abandonAudioFocus
状态栏的统一背景:
1、全屏模式
2、着色模式
安卓5.0以上有改变statusbar的API,但是4.4才可以使用--->api19
kotlin学习:
AndroidStudio3.0才装有kotlin插件
Android 之 audio系统设计相机的视频等操作...
1、声音类型:
2、录音:AudioRecord以及MediaRecord----->是需要录音权限的
3、播音:AudioTrack和MediaPlayer
4、Camera
注意事项:considerations
1、使用已将存在的api去获取用相机捕获图片或者视频剪辑
android.hardware.camera2 以及 camera Intent
(Intent)MediaStore.ACTION_IMAGE_CAPTURE or MediaStore.ACTION_VIDEO_CAPTURE
(Permission):CAMERA ----意图不需要权限
(Camera Features): android.hardware.camera for users-feature
声明相机特征是为了让应用市场阻止没有该硬件设备的手机下载此应用
2、自定义相机的特征
因为相机硬件是一个共享的资源,第一步就是探测和接近相机,用完了必须正确释放相机资源
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)
获取相机参数信息
继承surfaceview自定义相机的预览类
录制视频时录音需要锁住相机---》mediarecord + camera
安卓USB设备知识总结:
一、USB HOST 安卓手机作为主机
二、USB OTG 需要OTG硬件,既可以做主机也可以作为slave,安卓版本3.1以上才有驱动
三、USB 技术 主机和设备(HOST和DEVICE)
通过安卓开发文档:
两种模式:USB配件(外部USB硬件担当主机)和USB主机(安卓设备担当主机)
重点:USB主机模式:以下介绍重要的classes的使用
UsbManager:允许你枚举和交流已连接上的USB设备
UsbDevice:代表一个已连接上的USB设备并且包含接近使用它的特征信息、接口和端点
UsbInterface:代表一个USB设备的接口,它定义了一系列的有关该设备的功能。一个设备可以有一个或者更多的和其交流的接口
UsbEndpoint:代表一个接口端点,是一个交流通道在接口处。一个接口可以有一个或者更多的端点,通常有输入和输出端点和设
备进行两个方向的交流
UsbDeviceConnection:代表一个和设备的连接,在端点处传递数据。这个类允许你发送同步或者异步的往返数据
UsbRequest:代表一个异步请求通过conenct去和设备进行交流
UsbConstants:定义了USB常量和linux kernal中的linux/usb/ch9.h中的定义一致
java中的IO流之过滤流:
* 其次:CheckedInputStream主要用于模拟文件下来检测和源文件是否一致:得到校验和checksum的值
* 再其次:CheckedOutputStream用于写入字符进行校验
* 最后:传入的校验和有两种:CRC32(循环冗余校验)以及Adler32(安全性较CRC32差,但是计算速度快)
安卓的copy and paste功能:设计剪切板管理者等
重点:蓝牙BlueTooth:
BluetoothAdapter:代表本地蓝牙适配器。蓝牙适配器是所有蓝牙互动的切入点。使用它可以发现别的蓝牙设备,查询一系列绑定的设备
实例化一个蓝牙设备使用一个知道的MAC地址,然后创建一个蓝牙服务套接字去监听交流来自别的设备
BluetoothDevice:
BluetoothSocket:
BluetoothServerSocket:
BluetoothClass:
BluetoothProfile:
BluetoothHeadset:
BluetoothA2dp:
BluetoothProfile.ServiceListener:
蓝牙4.0部分的学习和详述:
传统蓝牙可以用于数据量比较大的传输,如语音,音乐,较高数据量传输等,
低功耗蓝牙这样应用于实时性要求比较高,但是数据速率比较低的产品,如遥控类的,如鼠标,键盘,遥控鼠标(Air Mouse),传感设备的数据发送,如心跳带
,血压计,温度传感器等
重点:NFC(Near Field Communication)
NfcManager:
NfcAdapter:
NdefMessage:
NdefRecord:
Tag:
TagTechnology:
NfcA:
NfcB:
NfcF:
NfcV:
IsoDep:
Ndef:
NdefFormatable:
MifareClassic:
MifareUltralight:
Android中的跨进程通讯:
方式一:Activity
同一个应用访问Activity:Intent intent=new Intent(Context,Activity.class);
跨应用访问Activity:Intent intent=new Intent(Intent.Action,Uri.parse("xxx"));
最后都调用startActivity(intent);
延伸:如何去实现共享的Activity:
给想要共享的Activity配置action标签,如果需要URI的话需要配置data标签,传递数据通过Bundle
方式二:ContentProvider
涉及到以下几个重点类:ContentResolver ContentObserver UriMatcher Cursor
自定义还有查询系统的内容提供者都有很多学的......,主要一点便是SQLite数据库的使用
/*表示匹配所有字符 /#表示匹配所有数字
最后数据库和游标都需要手动关闭
方式三:Broadcast 被动的跨进程通讯
一:发送指定包名接收的广播
二、有序广播和无序广播
前方高能:
无序广播不可以使用abortBroadcast和setResultData,否则会报错
有序广播可以设置priority优先级
三、粘性广播
方式四:AIDLService 后台运行和跨进程通讯
创建aidl:首先创建一个.aidl的java接口定义类
接着创建一个服务,需要一个action标签,重写得onBind中返回的就是自定义的接口对象
使用aidl:首先创建一个和接口一样的包,把aidl文件复制进去
接着创建ServiceConnection对象在匿名方法中得到需要的接口对象
最后绑定服务bindService(Intent.action,connection,Context.BIND_AUTO_CREATE);
重点:aidl中in out inout以及parcelable的使用(除了基本数据类型其他类型都需要增加这些需要的标志)
方式四的扩展:
安卓菜单的应用:optionmenu(3.0及以上出现在标题栏位置,2.3及以下出现在底部,超过六个最后一个由更多代替)和contextmenu(类似于pc的右击)
......
popupwindow和popupmenu的使用:(都属于Android的widget)
......
//----------------------------------------------------------------------------------------------------------
安卓开发小知识:
JAR包:jar -cvf plugin.jar com/dl/plugin/Plugin.class
DEX包:dx --dex --output=f:\dynamic.jar f:\Plugin.jar
dp2px:两种方式
其一是:原始的获取density然后依据px=dp*scale来算,加上0.5f是为了四舍五入,相对精准而已
其二是:(这种方式不太好,原因见源码即可)使用TypedValue.applyDimension(xxx),注意区分TypedValue 和 TypedArray
listview的属性:
android:stackFromBottom="true"
android:transcriptMode="alwaysScroll"
windowmanager:
LayoutParams的flags:
FLAG_NOT_FOCUSABLE:该window不需要和用户交互,即不需要软键盘
FLAG_LAYOUT_IN_SCREEN:该window忽略界面的状态栏可以在其上展示
FLAG_NOT_TOUCHABLE:该window接受触摸事件
介绍xliff:XML本地化交换文件格式
在res/value/string.xml中需要:
一、命名空间:xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"
二、标签内容中添加替换:<xliff:g id="device_name">%1$s</xliff:g> id命名随意
三、代码使用[Context]getString(resid,要替换的实际内容);
Java和Android的类加载器ClassLoader以及DexClassLoader(安卓插件化探索):
DexClassLoader localDexClassLoader = new DexClassLoader(dexPath,dexOutputDir, null, localClassLoader);
一般考虑接口去定义...
1.接口一般定义在Host中,如本例的Comm.java。
2.Plugin项目中需要使用Comm是,必须通过一个外部的jar包,这个jar包必须是以Library方式添加到Plugin的build
path中,不能以外部jar包的方式添加,因为我们只需要在Host中存在我们定义的接口,而不想在Plugin中也编译进去,如果都编译进去,
就会产生包名相同但验证码不同的文件,导致”Class ref in pre-verified class resolved to unexpected implementation”
----重点 虚拟机知识点----
Java虚拟机的ClassLoader使用和Dalvik虚拟机的子类PathClassLoader和DexClassLaoder的使用:
Java虚拟机的加载器简单的流程:bootstrap加载器-》extension加载器和application加载器
委托模型机制:遇到需要加载的请求时,会先请求父类去搜索解决,如果父类没有办法,再由自己去解决处理加载请求
java中自定义ClassLoader加载其他的class和jar:Java中提供的默认ClassLoader,只加载指定目录下的jar和class--->只需要重写findClass方法即可
DexClassLoader可以加载任何路径的apk/dex/jar也可以从sd卡加载
PathClassLoader只能加载/data/app中的apk或者/dex,也就是已经安装到手机中的apk
MeasureSpec中的三种模式:UNSPECIFIED AT_MOST EXACTLY--->getMode()
Android和Java的IO流:
第一个介绍:RandomAccessFile
两种模式:“r”、“rw”
//-------Android沉浸模式的应用:安卓4.4开始引入,安卓5.0改进------------
//-------使用ScrollView配合ListView做回弹效果--------------------------
//-------------------------------Android UIWidget Development--------------------------------------
one:jazzyViewPaper->viewpager
two:circle picture
three:reflect picture
//--------------------------------------------------------------------------------------------------
Android Studio:
一、lib库文件的添加:
切换到project项目下选择需要添加的module会出现libs的文件夹,将需要的第三方jar包拷贝进去,然后快捷键F12进入Project Structure
选择菜单栏最右边的dependencies,之后点击右上角的加号添加:File Dependency选择该jar即可
二、把特定的几个java类打成jar包供第三方应用使用:
可能需要在app中的build.gradle中添加模块依赖,然后在当前module下的build.gradle中添加相应的代码。示例如下:
task deleteOldJar(type: Delete) {
//删除存在的
delete 'build/libs/Test_aidl.jar'
}
task makeJar(type: org.gradle.api.tasks.bundling.Jar) {
//指定生成的jar名
baseName 'Test_aidl'
//从哪里打包class文件
//基本都是在build文件下把class文件打包成jar
from('build/intermediates/classes/debug/com/example/zbv/aidl/')
//jar包的目录结构(文件处于com/c_imageloader目录下)
//生成的jar包没有包名
into('build/libs/')
//去掉不需要打包的目录和文件
//exclude('BuildConfig.class', 'R.class')
//去掉R$开头的文件
//exclude{ it.name.startsWith('R$');}
//include('classes.jar')
//重命名
//rename ('classes.jar', 'mysdk.jar')
}
makeJar.dependsOn(deleteOldJar, build)
//jar包默认生成在build/libs下
之后sync后点击Gradle(显示在代码窗口的侧边菜单栏),选择moduleName/Tasks/other/makeJar点击即可,有一段时间的编译打包过程,生成的jar在build/libs下
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
快应用:https://www.quickapp.cn
微信小程序:
www.wandroid.com--->hongyang网站
Two(二):
* 进取之路:
第一:U盘启动盘重装系统--------------------------启动
第二:网页布局:HTML、CSS、JavaScript
第三:素材、PS
第四:Unity3D
第五:Kotlin
第六:foxmail如何清理空间,即把服务器的文件删除---pop3
* 理想之路:
第一:长篇架空历史小说--------------------------启动
* 感恩之路:
* 思索之路:
2018/3/21:总感觉有点不对劲,原来右脚鞋垫没有垫好,有点咯脚!
产品、技术
* 现实之路:
手机安卓重点:
一、Handler机制
二、Fragment和Activity通讯等
三、动画的运用--->帧动画、补间动画、属性动画
四、网络通讯方式
五、高阶视图自定义
尾、AndroidStudio以及Java8以及Kotlin
博客大神的自定义View以及动画学习实践:
一、自定义控件:自定义view验证码
one:自定义属性:在res/values下创建attrs.xml--->八种属性
two:自定义代码
three:使用显示
* 资源整理之路:
物理按键事件的分发:
dispatchKeyEvent(Activity)->superDispatchKeyEvent(PhoneWindow(Window)[frameworks\base\policy\src\com\android\internal\policy\impl])
->superDispatchKeyEvent(DecorView是PhoneWindow的内部类final)
触摸事件的事件分发机制:
* 知识之路:(七零八乱集)
安卓知识:
内存泄露(memory leak):是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但
内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
内存溢出(out of memory):是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。
网络连接和网速的确定大小:
实时网速显示:安卓的流量统计类TrafficStats---api8 NetworkStatsManager---api23(robust)
TrafficStats类是由Android提供的一个从你的手机开机开始,累计到现在使用的流量总量,或者统计某个或多个进程或应用所使用的流量,当然这个流量包括的Wifi和移动数据网Gprs
网络连接类型:
判断网络连接:安卓的连接管理类ConnectivityManager--->获取到网络运行的信息类NetworkInfo--->判断3g和2g需要用到安卓的电话管理类TelephonyManager
通过广播监听网络状态的切换:android.net.conn.CONNECTIVITY_CHANGE即ConnectivityManager.CONNECTIVITY_ACTION
安卓NDK的编译:android.mk的语法规范
XML的解析:四中方式(DOM解析、SAX解析、JDOM解析、DOM4J解析)
前两种是与平台无关的,通用数据交换格式,dom内存消耗大,可随机访问,sax内存消耗小,事件驱动访问
RSA公钥加密系统:
公钥加密私钥解密用于:某公司想秘密发送消息给私钥持有者,不被第三方窃听
私钥加密公钥解密用于:数字签名
逻辑判断如下:
这是对生成的摘要签名,如果对源文件进行签名的话,如果源文件过大,签名会比较慢
具体的RSA签名过程如下:
一、小明对外发布公钥,并声明对应的私钥在自己手上
二、小明对消息M计算摘要,得到摘要D
三、小明使用私钥对D进行签名,得到签名S
四、将M和S一起发送出去
验证过程如下:
一、接收者首先对M使用跟小明一样的摘要算法计算摘要,得到D
二、使用小明公钥对S进行解签,得到D’
三、如果D和D’相同,那么证明M确实是小明发出的,并且没有被篡改过
Handler消息传递机制:
Handler:发送消息以及处理消息
Looper:管理消息队列MessageQueue,读取MessageQueue中保存的消息,读取到消息后发送给Handler,初始化会创建一个与之关联的MessageQueue,每个线程只能拥有一个Looper
MessageQueue:管理消息Message,Handler发送的Message送到指定的MessageQueue保存,先进先出的原则
Message:消息对象本身实现了Parcelable
异步任务(AsyncTask):确保合理容易操作UI线程不需要操作线程和Handler
一、三个泛型类型和四步方法
二、主线程实例化和执行,只可执行一次
为什么Toast可以在子线程中显示?但是正规的修改UI的不可以?
--->结论为:Toast可能是属于修改UI界面,但是它没有被ViewRootImpl进行线程检测。它依赖于Handler机制、Looper、AIDL进程通讯,系统服务的调用。
textView.setText()则被ViewRootImpl.checkThread()检测线程,必须在主线程中进行。
生命周期Activity和Fragment:
启动至显示:onCreate(A)->onAttach(F)->onCreate(F)->onCreateView(F)->onActivityCreated(F)->onStart(A)->onStart(F)->onResume(A)->onResume(F)->
碎片退至后台:->onPause(F)->onStop(F)->onDestroyView(F)->onDestroy(F)->onDetach(F)->
活动销毁:->onPause(A)->onStop(A)->onDestroy(A)
安卓音量监听:action=“android.media.VOLUME_CHANGED_ACTION”--->广播接收
AudioManager.RINGER_MODE_CHANGED_ACTION--->音量模式改变(静音、震动、正常)
注意:如果在静音下音量为零,此时按音量减因为音量值没有改变所以此广播不会执行
PID和UID和UUID:
PID:为Process Identifier,PID就是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID。进程中止后PID被系统回收,
可能会被继续分配给新运行的程序,但是在android系统中一般不会把已经kill掉的进程ID重新分配给新的进程,新产生进程的进程号,一般比产生之前所有的进程号都要大。
UID:一般理解为User Identifier,UID在linux中就是用户的ID,表明时哪个用户运行了这个程序,主要用于权限的管理。而在android 中又有所不同,因为android为单用户系统,这时UID 便被赋予了新的使命,数据共享,为了实现数据共享,android为每个应用几乎都分配了不同的UID,不像传统的linux,每个用户相同就为之分配相同的UID。(当然这也就表明了一个问题,
android只能时单用户系统,在设计之初就被他们的工程师给阉割了多用户),使之成了数据共享的工具。
因此在android中PID,和UID都是用来识别应用程序的身份的,但UID是为了不同的程序来使用共享的数据。
UUID是Universally Unique Identifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符。
跨进程启动Service通讯:
跨应用启动Service需要注意的地方有2点:
1.目标service需要声明exported=true 的属性,表示允许其他应用访问该服务.
2.android5.0之前是可以通过设置隐式意图来跨应用打开Service的,5.0之后就必须要通过显示意图来开启Service.
通过Intent的setComponent方法,可以传递一个ComponentName对象,该对象有一个接受2个参数的构造方法,第一参数传递目标Service所在的包名,第二个参数传递目标Service的完整类名
安卓各版本的特点:(重点是:更多的是处于安全问题考虑以前的一些方法无法正常使用)
一、google可能为了安全考虑,在5.1.+后调用activitymanager.getRunningAppProcesses()方法只能返回你自己应用的进程,那如何在5.1.+后获取运行中进程呢?
安卓的混合开发:
安卓的压力测试:
目的:提高产品的稳定性、提高产品的留存率
时机:首轮功能测试通过后的夜间
自动化测试:
工具:Monkey--->预置在手机系统中
连接:usb连接从而使用ADB
Monkey Script:可以执行固定重复的操作
实战操作:
Monkey Runner:通过API实现特殊操作,例如截屏
MonkeyRunner:
MonkeyDevice:
MonkeyImage:
测试结果分析(重点是崩溃和无响应):CRASH:
ANR:
实战记录:
环境配置:一、安卓adb环境 二、python环境(2.7版本)
adb devices---连接上的所有设备
adb shell monkey 1000---随机的1000模拟键操作
adb logcat | grep START---获取START的信息(任何启动的应用程序都会带这个tag)
adb shell monkey -p package number
Monkey的高级参数:
adb shell monkey -p package --throttle <period> <number> (throttle参数)
adb shell monkey -p package -s <seedValue>(seed参数-复现操作)
adb shell monkey -p package --pct-touch <percent>(操作触摸事件的百分比)
adb shell monkey -v -p package --pct-touch <percent>(-v 显示具体的操作事件)
adb shell monkey -p package --pct-motion <percent>(操作动作事件的百分比)
adb shell monkey -p package --pct-appswitch <percent>(启动Activity事件百分比)
adb shell monkey -p package --ignore-crashes <event-count>(忽略崩溃和异常)
adb shell monkey -p package --ignore-timeouts <event-count>(忽略ANR)---在/data/anr/traces.txt中记录anr的信息
adb shell monkey -f <script-file> <event-count>(执行monkey的脚本文件)
* 程序之路:(麻辣烫集)
Java模式:
一、观察者模式(Android中的View类供参考)又称订阅-发布模式------->适用于两个对象的存在依赖关系或者一对多的依赖关系
模式描述:定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
设计原则:面向接口编程而不是面向实现编程
最为简单的用例:两个接口(Observerable可观察的Observer观察者)两个接口实现(ConcreteObserverable可观察的实现类ConcreteObserver观察者的实现类)
可观察的接口定义三个方法:注册观察者registerObserver、通知观察者notifyObserver、移除观察者removeObserver
观察者接口定义一个方法:要更新自我的内容onUpdateSelf
*不过被观察者需要保留注册的观察者的实例
延伸两种模型:
推模型:把更新的数据传过去
拉模型:把自身的引用传过去,由观察者自己get
Java中内置的被观察者和观察者:java.util.Observerable类和java.util.Observer接口
二、装饰者模式(Java中的IO流类供参考)
模式描述:在不改变原类文件以及不使用继承的情况下,动态地将责任附加到对象上,从而实现动态拓展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
设计原则:对拓展开放对修改关闭
最为简单的用例:一个基类接口或者抽象类->有一个直接的实现子类(即被装饰者)和一个抽象类(装饰者基类)->抽象类下分派多个需要的装饰者类实现所有需要的抽象方法
原则是:不改变被装饰者的情况下为其添加额外的装饰者功能
*不过装饰者需要原始基类的对象
Three (三):
继续更新学习中…