zoukankan      html  css  js  c++  java
  • SystemUI中监听app启动,修改app中的状态栏背景色

    参考 http://www.2cto.com/kf/201206/137225.html

    从Android4.4开始,app可以自定义status bar 背景。 对于一些第三方app定义的状态栏背景,可以在系统源码中对其修改。

    SystemUI是随着SystemUIService启动的,SystemUIService是常驻内存的,所以可以增加实时监听/观察功能。

    PhoneStatusBar.java中
    
    import android.app.IActivityManager;
    import android.app.ActivityManagerNative;
    import android.app.IActivityController;
    
    IActivityManager mAm;
    
    @Override
        public void start() {
            ……
            ……
                 mAm = ActivityManagerNative.getDefault();
            try {
                mAm.setActivityController(new ActivityController());
            } catch (RemoteException e) {
            }
            
        }
        
        private class ActivityController extends IActivityController.Stub {
            private boolean needUpdate = false;
            public boolean activityStarting(Intent intent, String pkg) {
                Log.d("antoon", "activityStarting, --> "+pkg);
                if("com.android.mms".equals(pkg)){
                    mBgHandler.sendEmptyMessage(updateBg);
                    needUpdate = true;
                }else if(needUpdate){
                    mBgHandler.sendEmptyMessage(rebackBg);
                    needUpdate = false;
                }
                return true;
            }
    
            public boolean activityResuming(String pkg) {
                Log.d("antoon", "activityResuming, --> "+pkg);
                return true;
            }
    
            public boolean appCrashed(String processName, int pid,
                                      String shortMsg, String longMsg,
                                      long timeMillis, String stackTrace) {
                return false;
            }
    
            public int appEarlyNotResponding(String processName, int pid, String annotation){
                return 0;
            }
    
            public int appNotResponding(String processName, int pid, String processStats) {
                return 0;
            }
    
            public int systemNotResponding(String msg){
                return -1;
            }
        }
    
        private final int updateBg = 1;
        private final int rebackBg = 2;
    
        private Handler mBgHandler = new Handler(){
            public void handleMessage(Message msg) {
                Log.d("antoon", "mBgHandler, ---, msg = "+msg);
                switch (msg.what){
                    case updateBg:
                        mStatusBarView.setBackgroundColor(Color.BLUE);
                        break;
                    case rebackBg:
                        mStatusBarView.setBackgroundColor(R.color.system_bar_background_opaque);
                        break;
                }
            }
        };

    androidframeworksasecorejavaandroidappIActivityController.aidl

    /*
    **
    ** Copyright 2009, The Android Open Source Project
    **
    ** Licensed under the Apache License, Version 2.0 (the "License"); 
    ** you may not use this file except in compliance with the License. 
    ** You may obtain a copy of the License at 
    **
    **     http://www.apache.org/licenses/LICENSE-2.0 
    **
    ** Unless required by applicable law or agreed to in writing, software 
    ** distributed under the License is distributed on an "AS IS" BASIS, 
    ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
    ** See the License for the specific language governing permissions and 
    ** limitations under the License.
    */
    
    package android.app;
    
    import android.content.Intent;
    
    /**
     * Testing interface to monitor what is happening in the activity manager
     * while tests are running.  Not for normal application development.
     * {@hide}
     */
    interface IActivityController
    {
        /**
         * The system is trying to start an activity.  Return true to allow
         * it to be started as normal, or false to cancel/reject this activity.
         */
        boolean activityStarting(in Intent intent, String pkg);
        
        /**
         * The system is trying to return to an activity.  Return true to allow
         * it to be resumed as normal, or false to cancel/reject this activity.
         */
        boolean activityResuming(String pkg);
        
        /**
         * An application process has crashed (in Java).  Return true for the
         * normal error recovery (app crash dialog) to occur, false to kill
         * it immediately.
         */
        boolean appCrashed(String processName, int pid,
                String shortMsg, String longMsg,
                long timeMillis, String stackTrace);
        
        /**
         * Early call as soon as an ANR is detected.
         */
        int appEarlyNotResponding(String processName, int pid, String annotation);
    
        /**
         * An application process is not responding.  Return 0 to show the "app
         * not responding" dialog, 1 to continue waiting, or -1 to kill it
         * immediately.
         */
        int appNotResponding(String processName, int pid, String processStats);
    
        /**
         * The system process watchdog has detected that the system seems to be
         * hung.  Return 1 to continue waiting, or -1 to let it continue with its
         * normal kill.
         */
        int systemNotResponding(String msg);
    }
    View Code
  • 相关阅读:
    IIS请求筛选模块被配置为拒绝超过请求内容长度的请求(转)
    解决Android AVD启动报错问题
    找新朋友
    【枚举】【SDOI 2011】【bzoj 2241】打地鼠
    Invalidate、RedrawWindow与UpdateWindow的差别
    蓝牙DA14580开发:固件格式、二次引导和烧写
    【C/C++学院】0723-32位与64位/调戏窗体程序/数据分离算法/内存检索/二分查找法/myVC
    Maven 使用 二——nexus
    Linux程序编译链接动态库版本号的问题
    Key-Value Observing (键值监測)
  • 原文地址:https://www.cnblogs.com/antoon/p/6807832.html
Copyright © 2011-2022 走看看