当前位置: 首页 > news >正文

android实现获取系统全局对象实例

无需Context获取系统常用全局对象:Application,Activity,PackageManager等。

import android.app.Activity;
import android.app.Application;
import android.app.Service;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Handler;
import android.os.IBinder;
import android.os.IInterface;import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;/*** 获取系统全局实例对象,无需Context*/
public class GlobalHelper {/*** 获取当前应用实例** @return*/public static Application getApplication() {try {Class ActivityThread = Class.forName("android.app.ActivityThread");Method currentApplication = ActivityThread.getMethod("currentApplication");currentApplication.setAccessible(true);return (Application) currentApplication.invoke(null);} catch (Throwable e) {e.printStackTrace();}return null;}/*** 获取UI线程** @return*/public static Object getActivityThread() {try {Class ActivityThread = Class.forName("android.app.ActivityThread");Method currentActivityThread = ActivityThread.getMethod("currentActivityThread");currentActivityThread.setAccessible(true);return currentActivityThread.invoke(null);} catch (Throwable e) {e.printStackTrace();}return null;}/*** 获取主线程Handler* @return*/public static Handler getMainHandler() {try {Class ActivityThread = Class.forName("android.app.ActivityThread");Field sMainThreadHandlerField = ActivityThread.getDeclaredField("sMainThreadHandler");sMainThreadHandlerField.setAccessible(true);return (Handler) sMainThreadHandlerField.get(null);} catch (Throwable e) {e.printStackTrace();}return null;}/*** 获取系统上下文实例ContextImpl** @return*/public static Context getSystemContext() {Object mActivityThread = getActivityThread();if (mActivityThread != null) {try {Method getSystemContext = mActivityThread.getClass().getDeclaredMethod("getSystemContext");getSystemContext.setAccessible(true);return (Context) getSystemContext.invoke(mActivityThread);} catch (Throwable e) {e.printStackTrace();}}return null;}/*** 获取全局上下文** @return*/public static Context getContext() {Context context = getApplication();if (context != null) {return context;} else {return getSystemContext();}}/*** 获取包管理器对象** @return*/public static PackageManager getPackageManager() {Context context = getContext();if (context != null) {return context.getPackageManager();} else {return null;}}/*** 获取包管理器接口** @return*/public static Object getIPackageManager() {try {Class ActivityThread = Class.forName("android.app.ActivityThread");Method getPackageManager = ActivityThread.getMethod("getPackageManager");getPackageManager.setAccessible(true);return getPackageManager.invoke(null);} catch (Throwable e) {e.printStackTrace();}return null;}/*** 创建包管理器接口实例** @return*/public static IInterface newIPackageManager() {try {Class ServiceManager = Class.forName("android.os.ServiceManager");Method getService = ServiceManager.getMethod("getService", String.class);getService.setAccessible(true);IBinder mIBinder = (IBinder) getService.invoke(ServiceManager, "package");Class<?> IPackageManagerStub = Class.forName("android.content.pm.IPackageManager$Stub");Method asInterface = IPackageManagerStub.getDeclaredMethod("asInterface", IBinder.class);asInterface.setAccessible(true);return (IInterface) asInterface.invoke(null, mIBinder);} catch (Throwable e) {e.printStackTrace();}return null;}/*** 获取所有Activity实例** @return*/public static List<Activity> getActivities() {List<Activity> activities = new ArrayList<>();Object mActivityThread = getActivityThread();try {Class mActivityThreadClass = mActivityThread.getClass();Field mActivitiesField = mActivityThreadClass.getDeclaredField("mActivities");mActivitiesField.setAccessible(true);Object mActivities = mActivitiesField.get(mActivityThread);if (mActivities instanceof Map) {Map<IBinder, Object> arrayMap = (Map) mActivities;for (Map.Entry<IBinder, Object> entry : arrayMap.entrySet()) {Object mActivityClientRecord = entry.getValue();if (mActivityClientRecord != null) {Field activityField = mActivityClientRecord.getClass().getDeclaredField("activity");activityField.setAccessible(true);Activity activity = (Activity) activityField.get(mActivityClientRecord);if (activity != null) {activities.add(activity);}}}}} catch (Throwable e) {e.printStackTrace();}return activities;}/*** 获取所有服务实例** @return*/public static List<Service> getServices() {List<Service> services = new ArrayList<>();Object mActivityThread = getActivityThread();try {Class mActivityThreadClass = mActivityThread.getClass();Field mServicesField = mActivityThreadClass.getDeclaredField("mServices");mServicesField.setAccessible(true);Object mServices = mServicesField.get(mActivityThread);if (mServices instanceof Map) {Map<IBinder, Service> arrayMap = (Map) mServices;for (Map.Entry<IBinder, Service> entry : arrayMap.entrySet()) {Service service = entry.getValue();if (service != null) {services.add(service);}}}} catch (Throwable e) {e.printStackTrace();}return services;}}

http://www.lryc.cn/news/114003.html

相关文章:

  • viewerjs 如何新增下载图片功能(npm包补丁)
  • 基于YOLOv7开发构建MSTAR雷达影像目标检测系统
  • 关于c++中mutable、const、volatile这三个关键字及对应c++与汇编示例源码
  • 把大模型装进手机,分几步?
  • c++游戏制作指南(三):c++剧情类文字游戏的制作
  • Flutter系列文章-实战项目
  • HCIA---TCP/UDP协议
  • 数据库索引的使用
  • 校验 GPT-4 真实性的三个经典问题:快速区分 GPT-3.5 与 GPT-4,并提供免费测试网站
  • SpringBoot整合MongoDB连接池(含源码)
  • [oeasy]python0082_[趣味拓展]控制序列_清屏_控制输出位置_2J
  • Zookeeper+kafka
  • Gpt微信小程序搭建的前后端流程 - 前端小程序部分-1.基础页面框架的静态设计(二)
  • Flask进阶:构建RESTful API和数据库交互
  • 6.9(Java)二叉搜索树
  • 洛谷P2256 一中校运会之百米跑
  • python-opencv对极几何 StereoRectify
  • pom文件---maven
  • 界面控件DevExpress.Drawing图形库早期增强功能分享
  • Semantic Kernel 入门系列:Connector连接器
  • Maven介绍-下载-安装-使用-基础知识
  • Ansible环境搭建,CentOS 系列操作系统搭建Ansible集群环境
  • Django基础
  • HTML,url,unicode编码
  • Hbase-热点问题(数据存储倾斜问题)
  • 一个基于Java线程池管理的开源框架Hippo4j实践
  • 源码解析Flink源节点数据读取是如何与checkpoint串行执行
  • 进阶:Docker容器管理工具——Docker-Compose使用
  • 策略模式(Strategy)
  • webpack基础知识十:与webpack类似的工具还有哪些?区别?