最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

Android开关机动画铃声播放原理

IT圈 admin 34浏览 0评论

2024年1月24日发(作者:厉泓)

Android开关机动画/铃音是如何播放的?

1. 开关机动画的启动

Android系统在中定义了很多Servic,具体定义格式可以参考《Android Platform

Developer’s Guide》中的“Android Init Language”。中定义的Service将会被Init进程创建,其中已经定义的服务就包含了开机动画.

每一项服务必须在/中定义.Android系统启动时,init守护进程将解析和启动属性服务,属性“ ”和“ ”是用来启动和停止服务的。一旦收到设置“ ”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入“ .<服务名>“属性中 。客户端应用程序可以轮询那个属性值,以确定结果。

service bootanim /system/bin/bootanimation

user graphics

group graphics

disabled

oneshot

//定义了一个bootanim的服务,对应执行/system/bin/bootanimation

//disabled 表示init进程创建只是创建它,但不立刻执行

//oneshot 表示该服务只执行一次

当android系统boot时,开始加载动画和开机铃声,其代码位于

//源文件

status_t SurfaceFlinger::readyToRun()

{

// start boot animation service

property_set("", "bootanim");//

}

当Android完成boot后,关闭动画和开机铃声,代码位于

//源文件

void SurfaceFlinger::bootFinished()

{

//stop bootanim service

property_set("", "bootanim");

}

在Android系统中,长按Power键默认会弹出对话框让你选择“飞行模式”,“静音”,“关机”等功能。

选择”关机“,弹出“设备将要关机”选择对话框。如果可以选择“是”关机,和“否”返回系统。

从代码中我们可以看出,如果选择上述对话框的“关机”选项之后,将会调用的shutdown方法来关机。shutdown方法的第二个参数标识是否弹出询问对话框。

ShutdownThread代码位于

frameworks/base/core/java/com/android/internal/app/

shutdown方法中有如下代码

public static void shutdown(final Context context, boolean confirm)

{

….

beginShutdownSequence(context);

….

}

beginShutdownSequence(context)-》startBootAnimation():

private static void startBootAnimation()

{

if (bPlayaudio) {

("","bootanim:shut mp3");

Log.d(TAG, "bootanim:shut mp3" );

} else {

("","bootanim:shut nomp3");

Log.d(TAG, "bootanim:shut nomp3" );

}

}

从上述分析可知,开关机动画的启动/停止都会设置 bootanim property来,最终通过bootanimation service来实现的。

这样就转入 bootanimation这个service来真正处理开关机动画和铃声。

注:可以用setprop bootanim:shut 命令动态启动bootanimation service

2. bootanimation service详解

bootanimation service 的代码所在位置:/frameworks/base/cmds/bootanimation, 主要有两个文件:

bootanimation_

bootanimation_是主入口文件:

int main(int argc, char** argv)

{

。。。。。。

if(argc > 1){

if(!strcmp(argv[1],"shut"))

}

}

}

setBoot = false;

if(argc > 2){

if(!strcmp(argv[2],"nomp3"))

sePaly = false;

if(argc > 3){

if(!strcmp(argv[3],"rotate"))

setRotated = true;

。。。。。

sp boot = new BootAnimation(setBoot,sePaly,setRotated);

XLOGD("");

IPCThreadState::self()->joinThreadPool();

XLOGD("exit ");

}

return 0;

}

其主要的功能是根据传进来的参数决定是是要播放开机还是关机动画/铃音,并且启动BootAnimation:

集成自Thread,在创建时会调用readyToRun()->threadLoop():

status_t BootAnimation::readyToRun() {

……………………………………

mAndroidAnimation = false;

if(bBootOrShutDown){

status_t err = ("/data/local/");

if (err != NO_ERROR) {

err = ("/system/media/");

if (err != NO_ERROR) {

mAndroidAnimation = true;

}

}

} else {

if(!bShutRotate){

status_t err = ("/data/local/");

if (err != NO_ERROR) {

err = ("/system/media/");

if (err != NO_ERROR) {

}

}

}

return NO_ERROR;

}

readyToRun() 方法判断/system/media/()是否存在,如果存在,则将 mAndroidAnimation 设置false,这个变量决定threadLoop中调用android()还是movie()来具体实现动画的播放。

bool BootAnimation::threadLoop()

{

…................

if(!bBootOrShutDown){

}

pSoundFileName= "/data/local/3";

pBackupSoundFileName="/system/media/3";

pSoundFileName= "/data/local/3";

pBackupSoundFileName="/system/media/3";

}

mAndroidAnimation = true;

} else {

…...............

mediastatus = mediaplayer->setDataSource(pBackupSoundFileName, NULL);

mediaplayer->setAudioStreamType(AudioSystem::BOOT);

mediastatus = mediaplayer->prepare();

mediaplayer->setAudioStreamType(AudioSystem::BOOT);

mediastatus = mediaplayer->prepare();

mediaplayer->setVolume(0.28, 0.28);

mediastatus = mediaplayer->start();

…..........................

if (mAndroidAnimation)

r = android();

} else {

}

threadLoop首先判断system/media/3(3)文件是否存在,如果存在则调用mediaplayer的接口播放(setdatasoruce,prepare,setvolume,start)。

然后根据 mAndroidAnimation 变量调用android()/movie(). 如果system/media//存在的话,调用movie(),该接口会解析zip文件中的文件,根据txt文件中的配置来播放动画。

r = movie();

}

2024年1月24日发(作者:厉泓)

Android开关机动画/铃音是如何播放的?

1. 开关机动画的启动

Android系统在中定义了很多Servic,具体定义格式可以参考《Android Platform

Developer’s Guide》中的“Android Init Language”。中定义的Service将会被Init进程创建,其中已经定义的服务就包含了开机动画.

每一项服务必须在/中定义.Android系统启动时,init守护进程将解析和启动属性服务,属性“ ”和“ ”是用来启动和停止服务的。一旦收到设置“ ”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入“ .<服务名>“属性中 。客户端应用程序可以轮询那个属性值,以确定结果。

service bootanim /system/bin/bootanimation

user graphics

group graphics

disabled

oneshot

//定义了一个bootanim的服务,对应执行/system/bin/bootanimation

//disabled 表示init进程创建只是创建它,但不立刻执行

//oneshot 表示该服务只执行一次

当android系统boot时,开始加载动画和开机铃声,其代码位于

//源文件

status_t SurfaceFlinger::readyToRun()

{

// start boot animation service

property_set("", "bootanim");//

}

当Android完成boot后,关闭动画和开机铃声,代码位于

//源文件

void SurfaceFlinger::bootFinished()

{

//stop bootanim service

property_set("", "bootanim");

}

在Android系统中,长按Power键默认会弹出对话框让你选择“飞行模式”,“静音”,“关机”等功能。

选择”关机“,弹出“设备将要关机”选择对话框。如果可以选择“是”关机,和“否”返回系统。

从代码中我们可以看出,如果选择上述对话框的“关机”选项之后,将会调用的shutdown方法来关机。shutdown方法的第二个参数标识是否弹出询问对话框。

ShutdownThread代码位于

frameworks/base/core/java/com/android/internal/app/

shutdown方法中有如下代码

public static void shutdown(final Context context, boolean confirm)

{

….

beginShutdownSequence(context);

….

}

beginShutdownSequence(context)-》startBootAnimation():

private static void startBootAnimation()

{

if (bPlayaudio) {

("","bootanim:shut mp3");

Log.d(TAG, "bootanim:shut mp3" );

} else {

("","bootanim:shut nomp3");

Log.d(TAG, "bootanim:shut nomp3" );

}

}

从上述分析可知,开关机动画的启动/停止都会设置 bootanim property来,最终通过bootanimation service来实现的。

这样就转入 bootanimation这个service来真正处理开关机动画和铃声。

注:可以用setprop bootanim:shut 命令动态启动bootanimation service

2. bootanimation service详解

bootanimation service 的代码所在位置:/frameworks/base/cmds/bootanimation, 主要有两个文件:

bootanimation_

bootanimation_是主入口文件:

int main(int argc, char** argv)

{

。。。。。。

if(argc > 1){

if(!strcmp(argv[1],"shut"))

}

}

}

setBoot = false;

if(argc > 2){

if(!strcmp(argv[2],"nomp3"))

sePaly = false;

if(argc > 3){

if(!strcmp(argv[3],"rotate"))

setRotated = true;

。。。。。

sp boot = new BootAnimation(setBoot,sePaly,setRotated);

XLOGD("");

IPCThreadState::self()->joinThreadPool();

XLOGD("exit ");

}

return 0;

}

其主要的功能是根据传进来的参数决定是是要播放开机还是关机动画/铃音,并且启动BootAnimation:

集成自Thread,在创建时会调用readyToRun()->threadLoop():

status_t BootAnimation::readyToRun() {

……………………………………

mAndroidAnimation = false;

if(bBootOrShutDown){

status_t err = ("/data/local/");

if (err != NO_ERROR) {

err = ("/system/media/");

if (err != NO_ERROR) {

mAndroidAnimation = true;

}

}

} else {

if(!bShutRotate){

status_t err = ("/data/local/");

if (err != NO_ERROR) {

err = ("/system/media/");

if (err != NO_ERROR) {

}

}

}

return NO_ERROR;

}

readyToRun() 方法判断/system/media/()是否存在,如果存在,则将 mAndroidAnimation 设置false,这个变量决定threadLoop中调用android()还是movie()来具体实现动画的播放。

bool BootAnimation::threadLoop()

{

…................

if(!bBootOrShutDown){

}

pSoundFileName= "/data/local/3";

pBackupSoundFileName="/system/media/3";

pSoundFileName= "/data/local/3";

pBackupSoundFileName="/system/media/3";

}

mAndroidAnimation = true;

} else {

…...............

mediastatus = mediaplayer->setDataSource(pBackupSoundFileName, NULL);

mediaplayer->setAudioStreamType(AudioSystem::BOOT);

mediastatus = mediaplayer->prepare();

mediaplayer->setAudioStreamType(AudioSystem::BOOT);

mediastatus = mediaplayer->prepare();

mediaplayer->setVolume(0.28, 0.28);

mediastatus = mediaplayer->start();

…..........................

if (mAndroidAnimation)

r = android();

} else {

}

threadLoop首先判断system/media/3(3)文件是否存在,如果存在则调用mediaplayer的接口播放(setdatasoruce,prepare,setvolume,start)。

然后根据 mAndroidAnimation 变量调用android()/movie(). 如果system/media//存在的话,调用movie(),该接口会解析zip文件中的文件,根据txt文件中的配置来播放动画。

r = movie();

}

发布评论

评论列表 (0)

  1. 暂无评论