Flutter开发者需要补充的Android知识!

可随意转载!

Context详解

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

  1. 启动Activity: onCreate()—>onStart()—>onResume(),Activity进入运行状态。
  2. Activity退居后台: 当前Activity转到新的Activity界面或按Home键回到主屏: onPause()—>onStop(),进入停滞状态。
  3. Activity返回前台: onRestart()—>onStart()—>onResume(),再次回到运行状态。
  4. Activity退居后台,且系统内存不足, 系统会杀死这个后台状态的Activity,若再次回到这个Activity,则会走onCreate()–>onStart()—>onResume()
  5. 锁定屏与解锁屏幕 只会调用onPause(),而不会调用onStop方法,开屏后则调用onResume()
  6. 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