zoukankan      html  css  js  c++  java
  • android定制化开关机动画、铃音

    原文:http://www.eoeandroid.com/thread-228083-1-1.html

    不错的帖子:

    滑动菜单(双层类path)+下拉刷新
    http://www.eoeandroid.com/thread-228627-1-1.html

    仿Iphone的camera 叶片的旋转,帮忙 让他跑的更流畅些
    http://www.eoeandroid.com/thread-228756-1-1.html

    [ApiDemos分析与讲解]App-Activity-PersistentState
    http://www.eoeandroid.com/thread-228342-1-1.html

    -------------------帖子正文----------------------

    系统通常默认支持开机动画,开机关机铃声服务倒是预先定义了,不过使用时需要在/sysytem/media/下添加相应的音频文件。长按Power键弹出关键选项,关机时也只是显示进度条,而不是我们期望的关机动画同时伴有关机铃声,当然在做二次开发的时候,这些都是可以定制的。下面将逐步分析如何实现这些定制化的需求。
    一. 
     
    制作开机动画

    开机画面是保存在/system/media的bootanimation.zip,下面分析系统开机画面的构成
    文件名为bootanimation.zip
    一定是这个不能修改,里面包含part1 part2文件夹 和desc.txt,part 文件夹里面放的是动画拆分的图片,格式为png,
    desc.txt里面是播放的设置。
    格式是这样的

    480 800 15
    p 1 0 part0
    p 0 0
    part1
    480 800是指显示的分辨率宽 高
    15是一秒的帧数
    p后面的数字是指播放次数
    0为循环,N为播放N次
    后面那位数字一般为0(空指令), 表示播放一遍后稍作停顿的时间
    part0,part1
    为文件夹名
    一般我们只使用part0目录

    图片准备好了,desc.txt里面的命令也准备好了,就可以把他们一起打包压缩成zip格式了。记住,是zip格式,而不是rar格式。另外压缩的时候注意一点,压缩的时候压缩方式要选择存储,否则开机时手机会不认的。当然不至于变砖,只是开机的时候会黑着没动画一直到进入桌面为止。

    开机动画的替换也很简单,我们把做好的bootanimation.zip替换掉原来的/system/media/bootanimation.zip文件即可。关机动画其实和开机动画的制作一样,我们命名为shutdownanimation.zip,和bootanimation.zip放在同一目录下。

    二. 开关机动画实现原理

    Android系统在init.rc中定义了很多Servic,具体定义格式可以参考《Android Platform
    Developer’s Guide》中的“Android Init
    Language”。Init.rc中定义的Service将会被Init进程创建,其中已经定义的服务就包含了开机动画,但没有关机动画的定义

    service bootsound /system/bin/mplayer /system/media/bootsound
    
        user media
    
        group audio
    
        oneshot
    
    //开机铃声服务 /system/media/startupsound是铃声文件
    
    service startupsound /system/bin/mplayer /system/media/startupsound
    
        user media
    
        group audio
    
        disabled
    
        oneshot
    
    //关机铃声服务 /system/media/shutdownsound是关机铃声
    
    service shutdownsound /system/bin/mplayer /system/media/shutdownsound
    
        user media
    
        group audio
    
        disabled
    
        oneshot
    
    //定义了一个bootanim的服务,对应执行/system/bin/bootanimation
    
    //disabled 表示init进程创建只是创建它,但不立刻执行
    
    //oneshot 表示该服务只执行一次
    
    service bootanim /system/bin/bootanimation
    
        user graphics
    
        group graphics
    
        disabled
    
    oneshot

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

    //源文件SurfaceFlinger.cpp
    
    status_t SurfaceFlinger::readyToRun() {
    
    
    
        // start boot animation service
    
        property_set("ctl.start", "bootanim");//
    
        {
    
            char value[PROPERTY_VALUE_MAX];
    
            property_get("persist.sys.profile.silent", value, "0");
    
            if (atoi(value)== 0){
    
                LOGI("start:persist.sys.profile.silent is soundable");
    
                // start startupsound service
    
                property_set("ctl.start","startupsound");//
    
             } else {
    
                LOGI("start:persist.sys.profile.silent is silent");
    
             }
    
        }
    
        return NO_ERROR;
    
    }
    
    
    
    当Android完成boot后,关闭动画和开机铃声,代码位于
    
    //源文件SurfaceFlinger.cpp
    
    void SurfaceFlinger::bootFinished() {
    
       const nsecs_t now = systemTime();
    
       const nsecs_t duration = now - mBootTime;
    
       LOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
    
       mBootFinished = true;
    
       //stop bootanim service
    
       property_set("ctl.stop", "bootanim");
    
       char value[PROPERTY_VALUE_MAX];
    
       property_get("persist.sys.profile.silent", value, "0");
    
       if (atoi(value)== 0){
    
           LOGI("stop:persist.sys.profile.silent is soundable");
    
           //stop startupsound service
    
           property_set("ctl.stop","startupsound");
    
       } else {
    
           LOGI("stop:persist.sys.profile.silent is silent");
    
       }
    
    }

    如何理解ctr.start和ctr.stop系统属性?

    每一项服务必须在/init.rc中定义.Android系统启动时,init守护进程将解析init.rc和启动属性服务,属性“
    ctl.start ”和“ ctl.stop ”是用来启动和停止服务的。一旦收到设置“ ctrl.start
    ”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入“ init.svc.<服务名>“属性中
    。客户端应用程序可以轮询那个属性值,以确定结果。想更深入了解Android property系统可以参考博文《(翻译)Android属性系统》。
    property_set("ctl.start",ServiceName);就是启动ServiceName服务(在init.rc中定义);

    property_set("ctl.stop",ServiceName)相对的是关闭ServiceName服务。

    A启动动画服务

    由于开机动画和关机动画除了播放的动画文件不同,其他的完全一致,这里重复利用/system/bin/bootanimation代码,
    仿照开机动画服务,我们新定义关机动画

    service shutdownanim /system/bin/bootanimation -shutdown
    
        user graphics
        group graphics
        disabled
        oneshot
    

    唯一要注意的是关机动画使用的/system/bin/bootanimation带了-shutdown参数,这个参数用来区分加载的动画文件为开机还是关机动画。当bootanimation服务启动时,进入/frameworks/base/cmds/bootanimation/bootanimation_main.cpp主函数main

    int main(int argc, char** argv)
    
    {
    
    #if defined(HAVE_PTHREADS)
    
        setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY);
    
    #endif
    
        char value[PROPERTY_VALUE_MAX];
    
        property_get("debug.sf.nobootanimation", value, "0");
    
        int noBootAnimation = atoi(value);
    
        LOGI_IF(noBootAnimation,  "boot animation disabled");
    
        if (!noBootAnimation) {
    
            sp<ProcessState> proc(ProcessState::self());
            ProcessState::self()->startThreadPool();
    
            // create the animation object
    
            sp<BootAnimation> boot = new BootAnimation();
    
            //根据是否有参数,来设置动画对象的isShutdown属性
    
            if (argc > 0) {
    
                if (strcmp(argv[0], "-shutdown")==0) {
                    boot->isShutdown(true);
    
                }
            }
    IPCThreadState::self()
    ->joinThreadPool(); } return 0; }
  • 相关阅读:
    xposed的基本使用
    scrapy发送邮件
    Image Pipeline
    javax.validation.ConstraintViolationException---Hibernate后台实体校验
    oracle中lead和lag函数 (转载)
    oracle中根据当前记录查询前一条和后一条记录
    物化视图知识了解(转载)
    10个线程同步处理1000行消息
    SQL语句执行效率及分析(note)
    js对文本框特殊字符串过滤
  • 原文地址:https://www.cnblogs.com/vus520/p/2772962.html
Copyright © 2011-2022 走看看