Android AudioService VolumeController,音量UI更新
在SystemUI啟動的時候就會主動去向AudioService註冊自己VolumeDialogControllerImpl內部實現了IVolumeController.Stub的VC。
後續音量調節也是通過這個VolumeController來完成UI更新的。
06-21 12:55:21.770 3122 3122 W System.err: java.lang.Exception: setVolumeController
06-21 12:55:21.771 3122 3122 W System.err: at com.android.systemui.volume.VolumeDialogControllerImpl.setVolumeController(VolumeDialogControllerImpl.java:150)
06-21 12:55:21.771 3122 3122 W System.err: at com.android.systemui.volume.VolumeDialogControllerImpl.register(VolumeDialogControllerImpl.java:176)
06-21 12:55:21.771 3122 3122 W System.err: at com.android.systemui.volume.VolumeDialogComponent.register(VolumeDialogComponent.java:171)
06-21 12:55:21.771 3122 3122 W System.err: at com.android.systemui.volume.VolumeUI.setDefaultVolumeController(VolumeUI.java:71)
06-21 12:55:21.771 3122 3122 W System.err: at com.android.systemui.volume.VolumeUI.start(VolumeUI.java:47)
06-21 12:55:21.771 3122 3122 W System.err: at com.android.systemui.SystemUIApplication.startServicesIfNeeded(SystemUIApplication.java:215)
06-21 12:55:21.771 3122 3122 W System.err: at com.android.systemui.SystemUIApplication.startServicesIfNeeded(SystemUIApplication.java:164)
06-21 12:55:21.771 3122 3122 W System.err: at com.android.systemui.SystemUIService.onCreate(SystemUIService.java:33)
06-21 12:55:21.771 3122 3122 W System.err: at android.app.ActivityThread.handleCreateService(ActivityThread.java:3339)
06-21 12:55:21.771 3122 3122 W System.err: at android.app.ActivityThread.-wrap4(Unknown Source:0)
06-21 12:55:21.771 3122 3122 W System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1677)
06-21 12:55:21.771 3122 3122 W System.err: at android.os.Handler.dispatchMessage(Handler.java:106)
06-21 12:55:21.771 3122 3122 W System.err: at android.os.Looper.loop(Looper.java:164)
06-21 12:55:21.771 3122 3122 W System.err: at android.app.ActivityThread.main(ActivityThread.java:6494)
06-21 12:55:21.771 3122 3122 W System.err: at java.lang.reflect.Method.invoke(Native Method)
06-21 12:55:21.771 3122 3122 W System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
06-21 12:55:21.772 3122 3122 W System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
06-21 12:55:21.774 2979 3337 D AudioService: Volume controller: VolumeController( [email protected],mVisible=false)
@Override public void setVolumeController(final IVolumeController controller) { enforceVolumeController("set the volume controller"); // return early if things are not actually changing if (mVolumeController.isSameBinder(controller)) { return; } // dismiss the old volume controller mVolumeController.postDismiss(); if (controller != null) { // we are about to register a new controller, listen for its death try { controller.asBinder().linkToDeath(new DeathRecipient() { @Override public void binderDied() { if (mVolumeController.isSameBinder(controller)) { Log.w(TAG, "Current remote volume controller died, unregistering"); setVolumeController(null); } } }, 0); } catch (RemoteException e) { // noop } } mVolumeController.setController(controller); if (DEBUG_VOL) Log.d(TAG, "Volume controller: " + mVolumeController);
private final class VC extends IVolumeController.Stub { private final String TAG = VolumeDialogControllerImpl.TAG + ".VC"; @Override public void displaySafeVolumeWarning(int flags) throws RemoteException { if (D.BUG) Log.d(TAG, "displaySafeVolumeWarning " + Util.audioManagerFlagsToString(flags)); if (mDestroyed) return; mWorker.obtainMessage(W.SHOW_SAFETY_WARNING, flags, 0).sendToTarget(); } @Override public void volumeChanged(int streamType, int flags) throws RemoteException { if (D.BUG) Log.d(TAG, "volumeChanged " + AudioSystem.streamToString(streamType) + " " + Util.audioManagerFlagsToString(flags)); if (mDestroyed) return; mWorker.obtainMessage(W.VOLUME_CHANGED, streamType, flags).sendToTarget(); } @Override public void masterMuteChanged(int flags) throws RemoteException { if (D.BUG) Log.d(TAG, "masterMuteChanged"); } @Override public void setLayoutDirection(int layoutDirection) throws RemoteException { if (D.BUG) Log.d(TAG, "setLayoutDirection"); if (mDestroyed) return; mWorker.obtainMessage(W.LAYOUT_DIRECTION_CHANGED, layoutDirection, 0).sendToTarget(); } @Override public void dismiss() throws RemoteException { if (D.BUG) Log.d(TAG, "dismiss requested"); if (mDestroyed) return; mWorker.obtainMessage(W.DISMISS_REQUESTED, Events.DISMISS_REASON_VOLUME_CONTROLLER, 0) .sendToTarget(); mWorker.sendEmptyMessage(W.DISMISS_REQUESTED); } @Override public void setA11yMode(int mode) { if (D.BUG) Log.d(TAG, "setA11yMode to " + mode); if (mDestroyed) return; switch (mode) { case VolumePolicy.A11Y_MODE_MEDIA_A11Y_VOLUME: // "legacy" mode mShowA11yStream = false; break; case VolumePolicy.A11Y_MODE_INDEPENDENT_A11Y_VOLUME: mShowA11yStream = true; break; default: Log.e(TAG, "Invalid accessibility mode " + mode); break; } mWorker.obtainMessage(W.ACCESSIBILITY_MODE_CHANGED, mShowA11yStream).sendToTarget(); } }
相關推薦
Android AudioService VolumeController,音量UI更新
在SystemUI啟動的時候就會主動去向AudioService註冊自己VolumeDialogControllerImpl內部實現了IVolumeController.Stub的VC。 後續音量調節也是通過這個VolumeController來完成UI更新的。06-21 1
Android混合開發,html5自動更新爬過的坑
現在使用混合開發的公司越來越多,雖然出現了一些新技術,比如Facebook的react native、阿里的weex,但依然阻擋不了一些公司採用h5的決心,當然,這也是從多方面考慮的選擇。 在三年前就使用過html5混合開發,當時做的是一款貴金屬軟體,漲跌五線
Android混合開發,html5自己主動更新爬過的坑
script loadurl 處理 必須 ack 功能 是個 code ppt 如今使用混合開發的公司越來越多,盡管出現了一些新技術,比方Facebook的react native、阿裏的weex,但依舊阻擋不了一些公司採用h5的決心。當然,這也是從多方
Android TabLayout+ViewPager+Fragment實現tab欄的時候,無法實時更新ViewPager內的Fragment問題終極解決方法
TabLayout+ViewPager+Fragment模式在應用中必不可少,有時候我們可能會遇到tab欄會動態改變的問題,如新增,或刪減,這時候就需要把viewpager內相應的fragment新增或刪減; 如想做以下等操作? 1、更新單個item mDataList.remove(0
Android可以在子執行緒更新(重新整理)UI---"假象"
有時候,我們線上程裡面需要彈框,然而在用Toast彈框後,會出一個Can't create handler inside thread that has not called Looper.prepare() 錯誤。。。。原因很簡單就是因為安卓介面更新的操作需要在主執行緒操作. 實現
Android UI 更新
1 : 使用 handle sendMessage 把資料傳遞給主執行緒進行修改; 2 : 使用handle.post 方法中進行主執行緒 UI 的修改,(POST 方法就是排隊在主執行緒中執行) 3 : 使用 view.post 方法中進行 UI 修改(原理還是呼叫的 handle 的 p
Android中使用非同步執行緒更新UI檢視的幾種方法
在Android中子執行緒是不能更新ui的。 所以我們要通過其他方式來動態改變ui檢視, 1、runOnUiThreadactivity提供的一個輕量級更新ui的方法,在Fragment需要使用的時候要用getActivity.runOnUiThread開啟執行緒 這種方法最簡單,方便更新一些不需要判斷的
為什麼Android必須在主執行緒更新UI?
為什麼Android必須在主執行緒更新UI? 站在各位大牛的肩膀上,謝謝! 正常情況下,Android需要在UI執行緒更新UI,然鵝,在特殊情況下,子執行緒也能更新UI不在討論之列,可參考Android中子執行緒真的不能更新UI嗎?這篇文章主要講一下個人理解的正常情況下為什麼不能在非
Android 子執行緒UI更新操作之二------AsyncTask
為了更方便的對子執行緒的中的UI進行操作,android提供了一些好用的工具,比如AsyncTask。藉助這個就可以簡單的從子執行緒切換到主執行緒。 當然這個工具也是基於非同步訊息處理機制的,只是安卓做了很好的封裝。 首先要說明的是AsyncTask是一個抽線類,要使用它
Android可以在子執行緒更新(重新整理)UI---"假象"
有時候,我們線上程裡面需要彈框,然而在用Toast彈框後,會出一個Can't create handler inside thread that has not called Looper.prepare() 錯誤。。。。原因很簡單就是因為安卓介面更新的操作需要在主執行緒操
Android API相容,其他API,UI適配(3)
-- 在application的oncreate方法前 StrictMode.setThreadPolicy(new StrictModel.ThreadPolicy.Builder().detectAll().penaltyLog().build()); 執行緒檢測策略; 虛擬機器檢測
Android API相容,其他API,UI適配(2)
- Gson、FastJson、org.JSON到底哪一個效率更高,速度更快- https://blog.csdn.net/zml_2015/article/details/52165317 -- Try catch與throw new Exception的區別? Try catch
Android API相容,其他API,UI適配
Android XML shape 標籤使用詳解- http://www.cnblogs.com/popfisher/p/6238119.html shape寫line虛線的時候發現4.0以上機型很多都沒辦法顯示,後來在xml中 android:layerType="software" 
android開發之在activity中控制另一個activity的UI更新
第一種方法: 遇到一個問題,需要在一個activity中控制另一個acitivity做一些更新,沒想到傳遞handler的方法,通過以下方式解決。 1.在MyAPP中定義屬性handler package jason.com; import jason.com.MasterAc
RxJava實戰(後臺執行耗時操作,實時通知 UI 更新)
開源專案 RxJava-Android-Samples,這裡一共介紹了十八種RxJava2的使用場景,這一系列文章主要參考該專案進行。 我們經常會在後臺執行緒中去做一些耗時的操作,比如去網路取資料,處理的方法有 HandlerThread、Threa
android 檢查版本,自動更新
<span style="font-size:14px;">怎麼檢索apk版本,然後自動更新?</span><span style="font-size:14px;">一共需要4步</span><span style="
Android初級開發----用Handle機制更新UI介面
引入: 之前對Android講義的一個小專案——–隨指尖移動的小球進行修改,利用View中的invalidate()方法實現每次觸碰螢幕更新(UI執行緒)小球的位置並且附加判斷大小,實現觸碰更新小球大小隨之更改顏色. API引入: 每次執行inva
Android探索之旅(第三十三篇)恩?你想成為Android架構師,我這裡有料呦~~(持續更新中)
筆者認為你若想要成為熟悉及精通Android知識,勢必對於Gradle要求很是熟悉,推薦大家看徐宜生的《Android群英傳·神兵利器》,這本書最突出的就是它對於Gradle講解的非常詳細,讀完這本書之
Android通過AIDL實現跨程序更新UI
一、概述 本篇文章將和大家一起來學習AIDL實現跨程序更新UI。 需求是:在同一個應用中有兩個Activity,MainActivity和TempActivity,這兩個Activity不在同一個程序中。 現在需要通過TempActivity來改變Ma
Android:UI更新方法五:利用AsyncTask更新UI
關於AsyncTask的用法: 3個範型引數: Params啟動任務執行的輸入引數 Progress後臺任務執行的百分比 Result,後臺計算的結果型別 在一個非同步任務裡,不是所有的型別總被用。假如一個型別不被使用,可以簡單地使用Void型別: private c