Android:getContext().getSystemService()

本文详细介绍了Android中getSystemService方法的使用,这是一个重要的API,允许开发者通过传递特定名称获取系统服务对象,如WindowManager。文章提供了具体代码示例,展示了如何利用此方法获取窗口管理服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、介绍

getSystemService是Android很重要的一个API,它是Activity的一个方法,根据传入的NAME来取得对应的Object,然后转换成相应的服务对象

二、语法

WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);

三、其他服务

 

转载于:https://www.cnblogs.com/hahayixiao/p/10087023.html

FATAL EXCEPTION: main Process: com.skr.uninstall2, PID: 2680 java.lang.IllegalArgumentException at android.os.Parcel.createExceptionOrNull(Parcel.java:3266) at android.os.Parcel.createException(Parcel.java:3246) at android.os.Parcel.readException(Parcel.java:3229) at android.os.Parcel.readException(Parcel.java:3171) at android.app.admin.IDevicePolicyManager$Stub$Proxy.setPackagesSuspended(IDevicePolicyManager.java:8218) at android.app.admin.DevicePolicyManager.setPackagesSuspended(DevicePolicyManager.java:9844) at com.skr.proxy.MainActivity$initViews$26.onClick(MainActivity.kt:1487) at android.view.View.performClick(View.java:8451) at android.view.View.performClickInternal(View.java:8420) at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0) at android.view.View$PerformClick.run(View.java:33356) at android.os.Handler.handleCallback(Handler.java:997) at android.os.Handler.dispatchMessage(Handler.java:111) at android.os.Looper.loopOnce(Looper.java:237) at android.os.Looper.loop(Looper.java:325) at android.app.ActivityThread.main(ActivityThread.java:10361) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:635) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:961) Caused by: android.os.RemoteException: Remote stack trace: at com.android.internal.util.Preconditions.checkArgument(Preconditions.java:47) at com.android.server.devicepolicy.DevicePolicyManagerService.getCallerIdentity(DevicePolicyManagerService.java:2628) at com.android.server.devicepolicy.DevicePolicyManagerService.setPackagesSuspendedPreCoexistence(DevicePolicyManagerService.java:13719) at com.android.server.devicepolicy.DevicePolicyManagerService.setPackagesSuspended(DevicePolicyManagerService.java:13802) at android.app.admin.IDevicePolicyManager$Stub.onTransact$setPackagesSuspended$(IDevicePolicyManager.java:14388) callee: null 2786/7093
06-26
android单实例handler。 @Override public void onCreate() { super.onCreate(); if (mWorkThread == null) { mWorkThread = new HandlerThread("vis"); mWorkThread.start(); } if (mWorkHandler == null) { mWorkHandler = new Handler(mWorkThread.getLooper(), this); } mWorkHandler.sendMessage(Message.obtain(mWorkHandler, MSG_INIT)); Log.d("TAGAA", "onCreate: 00 —— "+ mWorkHandler.hashCode()); } @Override public boolean handleMessage(@NonNull Message msg) { Log.d("TAGAA", "Handler处理消息: what=" + msg.what + ", obj=" + msg.obj); switch (msg.what) { case MSG_INIT: initData(); break; case MSG_READ_DATA: Log.d("TAGAA", "handleMessage: 执行了 read_data"); // 获取屏幕大小,判断vis 节点应该位于屏幕区域内 if (screenSize == null) { WindowManager windowManager = (WindowManager) getContext().getSystemService(WINDOW_SERVICE); Point temp = new Point(); windowManager.getDefaultDisplay().getSize(temp); if (temp.x > 0 && temp.y > 0) { screenSize = temp; } } mViewTextList = ViewDataManager.getData(progress -> { float finalProgress = progress * WEIGHT_PROGRESS_READ_SCREEN; if (mOverlayView != null) { mOverlayView.updateProgress(finalProgress); } }, screenSize); break; case MSG_MERGE_DATA: Log.d("TAGAA", "handleMessage: 执行了 merge_data"); mergeTextLists(); finalizeAndMergeData(); break; default: break; } return false; } @Override public void onShow(Bundle args, int showFlags) { super.onShow(args, showFlags); Log.d("TAGAA", "onShow: "); mSessionActive = true; if (frameLayout != null && frameLayout.isAttachedToWindow()) { if (isProcessingScreenshot) return; onHide(); } Log.i(TAG, "onShow: flags=0x" + Integer.toHexString(showFlags) + " args=" + args); if (isShowWindow) return; if (!App.getInstance().isState() || !SettingUtil.isAssistScreenShotEnabled(getContext()) || !SettingUtil.isAssistStructureEnabled(getContext())) { Intent startMainActivity = new Intent(this.getContext(), VoiceInteractionMain.class); startMainActivity.setAction(Constant.ACTION_CHECK_SETTINGS); startMainActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getContext().startActivity(startMainActivity); return; } // 通过此session返回的view,暂时未找到不影响AS的浮窗属性。通过AS创建overlay浮窗 frameLayout = new ExFrameLayout(getContext()); mOverlayView = new OverlayView(mContext, MainInteractionSession.this); NluManager.getInstance().setMainInteractionSession(MainInteractionSession.this); frameLayout.addView(mOverlayView); frameLayout.setEventCallBack(() -> { Log.i(TAG, "onBackPressed: "); MainInteractionSession.this.onBackPressed(); }); try { SelectToSpeakService as = SelectToSpeakService.getInstance(); as.showFloat(frameLayout, true); } catch (Exception ex) { Log.d(TAG, "ShowFloat exception: " + ex.toString()); } isShowWindow = true; // Utils.setNavAttr(getWindow().getWindow()); } @Override public void onHandleAssist(@NonNull AssistState state) { if (!mSessionActive) return; AssistStructure currentStructure = state.getAssistStructure(); Log.d("TAGAA", "onHandleAssist: "+currentStructure); if (currentStructure != null) { mLastValidAssistState = state; } AssistState effectiveState = currentStructure != null ? state : mLastValidAssistState; if (effectiveState == null || effectiveState.getAssistStructure() == null) { return; } mState = effectiveState; ViewDataManager.setData(effectiveState); synchronized (dataLock) { Log.d("TAGAA", "onHandleAssist: 执行了几次啊"); mWorkHandler.sendMessage(Message.obtain(mWorkHandler, MSG_READ_DATA)); } } /** * 获取到屏幕截图 */ @Override public void onHandleScreenshot(Bitmap screenshot) { Log.d("TAGAA", "onHandleScreenshot: "); Log.d(TAG, "enter onHandleScreenshot()"); if (isProcessingScreenshot) { Log.d(TAG, "processing screenshot, do nothing"); return; } if (screenshot != null && isShowWindow && App.getInstance().isState()) { if (mOverlayView != null) { mOverlayView.updateBg(screenshot); mOverlayView.updateProgress(0); } else { Log.w(TAG, "overlay view is null"); } mCurrentScreenshot = screenshot; isProcessingScreenshot = true; recognizeTextFromBitmap(screenshot); } else { Log.d(TAG, "screenshot[" + screenshot + "] isShowWindow[" + isShowWindow + "] asState[" + App.getInstance().isState() + "]"); } } @Override public void onHide() { synchronized (dataLock) { if (mWorkHandler != null) { Log.d("TAGAA", "onHide中已移除Handler所有任务: " + mWorkHandler.hashCode()); mWorkHandler.removeCallbacksAndMessages(null); } } mLastValidAssistState = null; mState = null; mCurrentScreenshot = null; if (mFinalTextList != null) { mFinalTextList.clear(); } if (mOcrTextList != null) { mOcrTextList.clear(); } if (mOcrBlocks != null) { mOcrBlocks.clear(); } if (mOcrLines != null && !mOcrLines.isEmpty()) { mOcrLines.clear(); } if (mExSymbols != null) { mExSymbols.clear(); } mSessionActive = false; ViewDataManager.clearState(); if (App.getInstance().isState()) { SelectToSpeakService as = SelectToSpeakService.getInstance(); as.showFloat(frameLayout, false); } isShowWindow = false; isProcessingScreenshot = false; super.onHide(); } 就是长按home开始识别,进度值识别到百分之四五十,我双击取消。然后快速再次进行识别,然后就变成了提示“没有实体类型”。我觉得是因为执行第二次的时候,handler中还有第一次未执行完的任务,就导致了这个问题,你看一下log。 2025-06-16 15:33:51.995 3599-3599/com.leas.suademo D/TAGAA: onHide中已移除Handler所有任务: 93393434 2025-06-16 15:33:52.661 3599-3599/com.leas.suademo D/TAGAA: onShow: 2025-06-16 15:33:52.754 3599-3599/com.leas.suademo D/TAGAA: onHandleAssist: android.app.assist.AssistStructure@2dfa91e 2025-06-16 15:33:52.754 3599-3599/com.leas.suademo D/TAGAA: onHandleAssist: 执行了几次啊 2025-06-16 15:33:52.754 3599-3599/com.leas.suademo D/TAGAA: onHandleAssist: android.app.assist.AssistStructure@9f655ff 2025-06-16 15:33:52.754 3599-3599/com.leas.suademo D/TAGAA: onHandleAssist: 执行了几次啊 2025-06-16 15:33:52.755 3599-3599/com.leas.suademo D/TAGAA: onHandleScreenshot: 2025-06-16 15:33:52.755 3599-3599/com.leas.suademo D/TAGAA: recognizeTextFromBitmap: 2025-06-16 15:33:52.907 3599-3989/com.leas.suademo D/TAGAA: Handler处理消息: what=1, obj=null 2025-06-16 15:33:52.907 3599-3989/com.leas.suademo D/TAGAA: handleMessage: 执行了 read_data 2025-06-16 15:33:52.911 3599-3599/com.leas.suademo D/TAGAA: onDraw: 没有实体类型 2025-06-16 15:33:52.921 3599-3599/com.leas.suademo D/TAGAA: onDraw: 没有实体类型 2025-06-16 15:33:52.929 3599-3599/com.leas.suademo D/TAGAA: onDraw: 没有实体类型 2025-06-16 15:33:52.987 3599-3989/com.leas.suademo D/TAGAA: Handler处理消息: what=1, obj=null 2025-06-16 15:33:52.987 3599-3989/com.leas.suademo D/TAGAA: handleMessage: 执行了 read_data 2025-06-16 15:33:52.996 3599-3599/com.leas.suademo D/TAGAA: onDraw: 没有实体类型 2025-06-16 15:33:53.005 3599-3599/com.leas.suademo D/TAGAA: onDraw: 没有实体类型 2025-06-16 15:33:53.328 3599-3989/com.leas.suademo D/TAGAA: Handler处理消息: what=2, obj=null 2025-06-16 15:33:53.328 3599-3989/com.leas.suademo D/TAGAA: handleMessage: 执行了 merge_data 2025-06-16 15:33:53.587 3599-3599/com.leas.suademo D/TAGAA: onDraw: 没有实体类型 2025-06-16 15:33:54.917 3599-3599/com.leas.suademo D/TAGAA: onHide中已移除Handler所有任务: 93393434
06-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值