参考 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; } } };
android\frameworks\base\core\java\android\app\IActivityController.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); }