A33关机动画

一、首先跟踪代码发现:    

grep -Rns "shutdownanimation" frameworks/base/
frameworks/base/services/java/com/android/server/power/ShutdownThread.java:380:        int shutdownanimation = SystemProperties.getInt("persist.sys.shutdownanimation", 0);
frameworks/base/services/java/com/android/server/power/ShutdownThread.java:381:        if (mBootFastEnable || shutdownanimation != 1) pd.show();
frameworks/base/services/java/com/android/server/power/ShutdownThread.java:447:            int shutdownanimation = SystemProperties.getInt("persist.sys.shutdownanimation", 0);
frameworks/base/services/java/com/android/server/power/ShutdownThread.java:450:            if (shutdownanimation == 1) {
frameworks/base/services/java/com/android/server/power/ShutdownThread.java:568:            if (shutdownanimation == 1) {
frameworks/base/cmds/bootanimation/BootAnimation.cpp:57:#define SYSTEM_SHUTDOWNANIMATION_FILE "/system/media/shutdownanimation.zip"   

    A33已经添加了关机动画相关代码,我们进一步跟踪代码发现:

    frameworks/base/services/java/com/android/server/power/ShutdownThread.java 

public void run() {
        BroadcastReceiver br = new BroadcastReceiver() {
            @Override public void onReceive(Context context, Intent intent) {
                // We don't allow apps to cancel this, so ignore the result.
                actionDone();
            }
        };
        if(!mBootFastEnable){
            int shutdownanimation = SystemProperties.getInt("persist.sys.shutdownanimation", 0);
            int value = Settings.System.getIntForUser(mContext.getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, 0, UserHandle.USER_CURRENT);
            int rotation = Surface.ROTATION_0;
            if (shutdownanimation == 1) {
                IWindowManager mWindowManager = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
                if (mWindowManager != null) {
                    try{
                        rotation = mWindowManager.getRotation();
                        mWindowManager.freezeRotation(Surface.ROTATION_0);
                        mWindowManager.updateRotation(true, true);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }

    persist.sys.shutdownanimation 是关键;可以在系统build.prop中加入 persist.sys.shutdownanimation=1,可以实现关机动画效果;

二、测试发现添加关机动画,关机音乐出现且和开机音乐一样(一般情况二者是不同的)?

      \android\frameworks\base\cmds\bootanimation\bootanimation_main.cpp 代码中

if (!noBootAnimation) {
        sp<ProcessState> proc(ProcessState::self());
        ProcessState::self()->startThreadPool();
        // create the boot animation object
        sp<BootAnimation> boot = new BootAnimation();
        boot->playBootMusic("/system/media/boot.wav");
        IPCThreadState::self()->joinThreadPool();
    }

      此处要作一个处理:

 if (!noBootAnimation) {
        sp<ProcessState> proc(ProcessState::self());
        ProcessState::self()->startThreadPool();
        // create the boot animation object
        sp<BootAnimation> boot = new BootAnimation();
// Await add 
        char shutdown[PROPERTY_VALUE_MAX];
        property_get("sys.shutdown_animation", shutdown, "boot");
        char* animation;
        if (strcmp(shutdown, "shutdown")) {
            boot->playBootMusic("/system/media/boot.wav");
    } else {
            boot->playBootMusic("/system/media/shutdownboot.wav");
    }
            IPCThreadState::self()->joinThreadPool();        
        }

三、以上二步实现了关机动画及关机音乐,但有一个小问题:我们在竖屏关机的时候发现关机瞬间有横屏现象?

   1、在ShutdownThread.java  中只是对方向作了一个简单的处理

     if (shutdownanimation == 1) {
                IWindowManager mWindowManager = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
                if (mWindowManager != null) {
                    try{
                        rotation = mWindowManager.getRotation();
                        mWindowManager.freezeRotation(Surface.ROTATION_0);
                        mWindowManager.updateRotation(true, true);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
                if (rotation != Surface.ROTATION_0) {
                    SystemClock.sleep(600);
                } else {
                    SystemClock.sleep(200);
                }

       2、在\android\frameworks\base\services\java\com\android\server\wm\WindowManagerService.java中我们加入:

Intent it = new Intent(Intent.ACTION_UI_BOOT_FINISH);
        mContext.sendBroadcast(it);
// Await add
    if(SystemProperties.get("persist.sys.rotation", "false").equals("true")){
    Settings.System.putInt(mContext.getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, 1);
    }
        mPolicy.enableScreenAfterBoot();
        // Make sure the last requested orientation has been applied.
        updateRotationUnchecked(false, false);
        rotation_boostuperf_enable = true;

   3、此时还需要在ShutdownThread.java中作一个判断:

if (rotation != Surface.ROTATION_0) {
                    SystemClock.sleep(600);
                } else {
                    SystemClock.sleep(200);
                }
// Await add
                if( value == 1){
    SystemProperties.set("persist.sys.rotation", "true");
    } else {
    SystemProperties.set("persist.sys.rotation", "false");
    }
                SystemProperties.set("sys.shutdown_animation", "shutdown");
                SystemProperties.set("service.bootanim.exit", "0");
                SystemProperties.set("ctl.start", "bootanim");

  这样竖屏关机的时候横屏的问题就可以解决了

转载于:https://my.oschina.net/u/2273845/blog/345852

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值