目录
Flutter开发者需要补充的Android知识!
可随意转载!
Context详解
Context源码片段:
/**
* Interface to global information about an application environment. This is
* an abstract class whose implementation is provided by
* the Android system. It
* allows access to application-specific resources and classes, as well as
* up-calls for application-level operations such as launching activities,
* broadcasting and receiving intents, etc.
*/
public abstract class Context {
......
}
ContextImpl源码片段:
/**
* Common implementation of Context API, which provides the base
* context object for Activity and other application components.
*/
class ContextImpl extends Context {
private Context mOuterContext;
......
}
ContextWrapper源码片段:
public class ContextWrapper extends Context {
Context mBase;
...
}
ContextThemeWrapper源码片段:
/**
* A ContextWrapper that allows you to modify the theme from what is in the
* wrapped context.
*/
public class ContextThemeWrapper extends ContextWrapper {
......
}
Activity源码片段:
public class Activity extends ContextThemeWrapper
implements LayoutInflater.Factory2,
Window.Callback, KeyEvent.Callback,
OnCreateContextMenuListener, ComponentCallbacks2,
Window.OnWindowDismissedCallback {
......
}
Service源码片段:
public abstract class Service extends ContextWrapper implements ComponentCallbacks2 {
......
}
Application源码片段:
public class Application extends ContextWrapper implements ComponentCallbacks2 {
......
}
那么一个App下有多少个Context呢?
Context总数 = Application数(1) + Activity数(M) + Service数(N) = M + N +1
context.getResources是不是同一个实例?
是!因为这个方法是单例的。
Context使用不当会不会引起内存泄漏?
会!比如数据库管理类需要Context,就只能传递Application的Context,而不能传递Activity的Context,因为Activity和它的Context两个生命周期相同,如果数据库管理类持有的Context,这个Activity就无法内存回收。反之,凡是跟UI相关的类需要传递Context的,不能传递Application的Context。
Activity
- 启动Activity: onCreate()—>onStart()—>onResume(),Activity进入运行状态。
- Activity退居后台: 当前Activity转到新的Activity界面或按Home键回到主屏: onPause()—>onStop(),进入停滞状态。
- Activity返回前台: onRestart()—>onStart()—>onResume(),再次回到运行状态。
- Activity退居后台,且系统内存不足, 系统会杀死这个后台状态的Activity,若再次回到这个Activity,则会走onCreate()–>onStart()—>onResume()
- 锁定屏与解锁屏幕 只会调用onPause(),而不会调用onStop方法,开屏后则调用onResume()
- Activity A 启动另一个Activity B,回调如下:Activity A 的onPause() → Activity B的onCreate() → onStart() → onResume() → Activity A的onStop();如果B是透明主题又或则是个DialogActivity,则不会回调A的onStop;
Service
Service 是一段长生命周期的,没有用户界面的程序。可以用来开发如监控类程序。比如媒体播放器,它会有多个activity,让用户选择歌曲并播放歌曲。然而,音乐播放这个功能没有activity,显然导航到其它屏幕时音乐应该一直在播放。
权限
1.Android11系统会根据请求自动向某些类型的应用授予 SYSTEM_ALERT_WINDOW 权限:
- 系统会自动向具有 ROLE_CALL_SCREENING 且请求 SYSTEM_ALERT_WINDOW 的所有应用授予该权限。如果应用失去 ROLE_CALL_SCREENING,就会失去该权限。
- 系统会自动向通过 MediaProjection 截取屏幕且请求 SYSTEM_ALERT_WINDOW 的所有应用授予该权限,除非用户已明确拒绝向应用授予该权限。当应用停止截取屏幕时,就会失去该权限。此用例主要用于游戏直播应用。
ADB命令
- 查看ADB版本:adb version
- 查看手机设备:adb devices
- 查看设备型号:adb shell getprop ro.product.model
- 查看电池信息:adb shell dumpsys battery
- 查看设备ID:adb shell settings get secure android_id
- 查看设备IMEI:adb shell dumpsys iphonesubinfo
- 查看Android版本:adb shell getprop ro.build.version.release
- 查看手机网络信息:adb shell ifconfig
- 查看设备日志:adb logcat
- 重启手机设备:adb reboot
- 安装一个apk:adb install /path/demo.apk
- 卸载一个apk:adb uninstall <package>
- 查看系统运行进程:adb shell ps
- 查看系统磁盘情况:adb shell ls /path/
- 手机设备截屏:adb shell screencap -p /sdcard/aa.png
- 手机文件下载到电脑:adb pull /sdcard/aa.png ./
- 电脑文件上传到手机:adb push aa.png /data/local/
- 手机设备录像:adb shell screenrecord /sdcard/ab.mp4
- 手机屏幕分辨率:adb shell wm size
- 手机屏幕密度:adb shell wm density
- 手机屏幕点击:adb shell input tap xvalue yvalue
- 手机屏幕滑动:adb shell input swipe 1000 1500 200 200
- 手机屏幕带时间滑动:adb shell input swipe 1000 1500 0 0 1000
- 手机文本输入:adb shell input text xxxxx
- 手机键盘事件:adb shell input keyevent xx
- 连接多个手机设备时,指定手机设备:adb -s serialNumber <command>
- 打开某个App:adb shell am start package/activity
- 关闭某个App:adb shell am force-stop package