frameworks/base/cmds/bootanimation/BootAnimation.cpp
在原来开机动画的基础上,获取动画文件方法
BootAnimation::getAnimationFileName(){
...
state = checkBootState() ? 0 : 1; //若state 为1 调用关机动画
...
}
char value[PROPERTY_VALUE_MAX];
if (strcmp(value, "null") != 0) {
ret = false;
}
return ret;
frameworks/base/services/java/com/android/server/pm/ShutdownThread.java
ShutdownThread一个线程类 在 run方法里面 添加
SystemProperties.set(SHUTDOWN_ACTION_PROPERTY, reason); //SHUTDOWN_ACTION_PROPERTY为sys.shutdown.requested
点击关机dialog执行
private static void beginShutdownSequence(Context context) {
...
if (FeatureQuery.FEATURE_BOOT_ANIMATION && checkAnimationFileExist()) {
lockDevice();
showShutdownAnimation();
...
}
...
}
private static void showShutdownAnimation() {
SystemProperties.set("ctl.start", "bootanim"); //调用开机动画服务
}
==================================
开机动画停止
frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
void SurfaceFlinger::bootFinished(){
...
property_set("service.bootanim.exit", "1"); //设置停止动画属性
}
-------------------
frameworks/base/cmds/bootanimation/BootAnimation.cpp
在动画循环中调用方法 checkExit()
void BootAnimation::checkExit() {
char value[PROPERTY_VALUE_MAX];
property_get(EXIT_PROP_NAME, value, "0");//EXIT_PROP_NAME为字符串 service.bootanim.exit
int exitnow = atoi(value);
if (exitnow) {
requestExit();
}
}