全部 文章 问答 分享 共找到83个相关内容
[问答] Android应用检测设备多账号登录的原理

想问一下各位就是关于Android应用检测设备多账号登录的原理是什么?具体是怎么实现的。目前我能想到的是检测该手机的ip地址,有没有什么办法可以绕开检测

2023-04-11 23:54 · Android
[文章] UI 绘制流程及原理
UI绘制流程及原理Window是一个抽象类,提供了绘制窗口的一组通用API。
2022-02-10 15:57 · Android / 安卓
[文章] Spring Boot笔记 启动配置原理
#以debug来理解在SpringBoot项目,主配置类的run()方法处打断点,以debug模式运行,可以看到如下代码,留意两个流程:1、创建SpringApplication对象2、运行run()方法。publicstaticConfigurableApplicationContextrun(Class<?>[]primarySources,String[]args){return(newSpringApplication(primarySources)).run(args);}创建SpringApplication对象publicSpringApplication(ResourceLoaderresourceLoader,Class<?>...primarySources){this.sources=newLinkedHashSet();this.bannerMode=Mode.CONSOLE;this.logStartupInfo=true;this.addCommandLineProperties=true;this.addConversionService=true;this.headless=true;this.registerShutdownHook=true;this.additionalProfiles=newHashSet();this.isCustomEnvironment=false;this.lazyInitialization=false;this.resourceLoader=resourceLoader;Assert.notNull(primarySources,"PrimarySourcesmustnotbenull");this.primarySources=newLinkedHashSet(Arrays.asList(primarySources));//调用deduceFromClasspath()方法判断当前Web应用的类型:NONE,SERVLET,REACTIVEthis.webApplicationType=WebApplicationType.deduceFromClasspath();//调用getSpringFactoriesInstances()方法从类路径下找到META-INF/spring.factories配置的ApplicationContextInitializer类,保存起来this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));//调用getSpringFactoriesInstances()方法从类路径下找到META-INF/spring.factories配置的ApplicationListener类,保存起来this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));//从多个配置类中查找主配置类this.mainApplicationClass=this.deduceMainApplicationClass();}private<T>Collection<T>getSpringFactoriesInstances(Class<T>type){returnthis.getSpringFactoriesInstances(type,newClass[0]);}private<T>Collection<T>getSpringFactoriesInstances(Class<T>type,Class<?>[]parameterTypes,Object...args){ClassLoaderclassLoader=this.getClassLoader();//调用loadFactoryNames()方法从META-INF/spring.factories下找类名Set<String>names=newLinkedHashSet(SpringFactoriesLoader.loadFactoryNames(type,classLoader));//根据类名,通过反射创建实体放入instances中List<T>instances=this.createSpringFactoriesInstances(type,parameterTypes,classLoader,args,names);AnnotationAwareOrderComparator.sort(instances);returninstances;}publicstaticList<String>loadFactoryNames(Class<?>factoryType,@NullableClassLoaderclassLoader){StringfactoryTypeName=factoryType.getName();return(List)loadSpringFactories(classLoader).getOrDefault(factoryTypeName,Collections.emptyList());}privatestaticMap<String,List<String>>loadSpringFactories(@NullableClassLoaderclassLoader){MultiValueMap<String,String>result=(MultiValueMap)cache.get(classLoader);if(result!=null){returnresult;}else{try{//从META-INF/spring.factories位置找类名//此处可以看一下org/springframework/boot/spring-boot-autoconfigure/2.2.6.RELEASE/spring-boot-autoconfigure-2.2.6.RELEASE.jar!/META-INF/spring.factories里的内容Enumeration<URL>urls=classLoader!=null?classLoader.getResources("META-INF/spring.factories"):ClassLoader.getSystemResources(LinkedMultiValueMapresult=newLinkedMultiValueMap();while(urls.hasMoreElements()){URLurl=(URL)urls.nextElement();UrlResourceresource=newUrlResource(url);Propertiesproperties=PropertiesLoaderUtils.loadProperties(resource);Iteratorvar6=properties.entrySet().iterator();while(var6.hasNext()){Entry<?,?>entry=(Entry)var6.next();StringfactoryTypeName=((String)entry.getKey()).trim();String[]var9=StringUtils.commaDelimitedListToStringArray((String)entry.getValue());intvar10=var9.length;for(intvar11=0;var11<var10;++var11){StringfactoryImplementationName=var9[var11];result.add(factoryTypeName,factoryImplementationName.trim());}}}cache.put(classLoader,result);returnresult;}catch(IOExceptionvar13){thrownewIllegalArgumentException("Unabletoloadfactoriesfromlocation[META-INF/spring.factories]",var13);}}}privateClass<?>deduceMainApplicationClass(){try{StackTraceElement[]stackTrace=(newRuntimeException()).getStackTrace();StackTraceElement[]var2=stackTrace;intvar3=stackTrace.length;for(intvar4=0;var4<var3;++var4){StackTraceElementstackTraceElement=var2[var4];//从多个配置类中查找方法名是main的确定主配置类if("main".equals(stackTraceElement.getMethodName())){returnClass.forName(stackTraceElement.getClassName());}}}catch(ClassNotFoundExceptionvar6){}returnnull;}2.运行run()方法publicConfigurableApplicationContextrun(String...args){StopWatchstopWatch=newStopWatch();stopWatch.start();ConfigurableApplicationContextcontext=null;Collection<SpringBootExceptionReporter>exceptionReporters=newArrayList();this.configureHeadlessProperty();//获取SpringApplicationRunListeners,也是调用getSpringFactoriesInstances()方法从META-INF/spring.factories获取的SpringApplicationRunListenerslisteners=this.getRunListeners(args);//将这些监听器启动listeners.starting();CollectionexceptionReporters;try{//将命令行参数做一个封装ApplicationArgumentsapplicationArguments=newDefaultApplicationArguments(args);//准备环境ConfigurableEnvironmentenvironment=this.prepareEnvironment(listeners,applicationArguments);this.configureIgnoreBeanInfo(environment);//打印Banner图标BannerprintedBanner=this.printBanner(environment);//创建IOC容器context=this.createApplicationContext();//获取一个处理异常的实例,当出现异常的时候,用来处理异常报告,在catch里面会用到这个对象exceptionReporters=this.getSpringFactoriesInstances(SpringBootExceptionReporter.class,newClass[]{ConfigurableApplicationContext.class},context);//准备上下文环境this.prepareContext(context,environment,listeners,applicationArguments,printedBanner);//刷新IOC容器,扫描注解,加载里面的所有组件,如果是Web环境,创建Tomcat容器this.refreshContext(context);this.afterRefresh(context,applicationArguments);stopWatch.stop();if(this.logStartupInfo){(newStartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(),stopWatch);}//所有的SpringApplicationRunListener回调started()方法listeners.started(context);//从IOC容器中获取所有的ApplicationRunner和CommandLineRunner进行回调,先回调ApplicationRunner,后回调CommandLineRunnerthis.callRunners(context,applicationArguments);}catch(Throwablevar10){this.handleRunFailure(context,var10,exceptionReporters,listeners);thrownewIllegalStateException(var10);}try{listeners.running(context);returncontext;}catch(Throwablevar9){this.handleRunFailure(context,var9,exceptionReporters,(SpringApplicationRunListeners)null);thrownewIllegalStateException(var9);}}privateSpringApplicationRunListenersgetRunListeners(String[]args){Class<?>[]types=newClass[]{SpringApplication.class,String[].class};returnnewSpringApplicationRunListeners(logger,this.getSpringFactoriesInstances(SpringApplicationRunListener.class,types,this,args));}privateConfigurableEnvironmentprepareEnvironment(SpringApplicationRunListenerslisteners,ApplicationArgumentsapplicationArguments){//获取或创建环境ConfigurableEnvironmentenvironment=this.getOrCreateEnvironment();this.configureEnvironment((ConfigurableEnvironment)environment,applicationArguments.getSourceArgs());ConfigurationPropertySources.attach((Environment)environment);//回调SpringApplicationRunListener.environmentPrepared()方法表示环境准备完成listeners.environmentPrepared((ConfigurableEnvironment)environment);this.bindToSpringApplication((ConfigurableEnvironment)environment);if(!this.isCustomEnvironment){environment=(newEnvironmentConverter(this.getClassLoader())).convertEnvironmentIfNecessary((ConfigurableEnvironment)environment,this.deduceEnvironmentClass());}ConfigurationPropertySources.attach((Environment)environment);return(ConfigurableEnvironment)environment;}protectedConfigurableApplicationContextcreateApplicationContext(){Class<?>contextClass=this.applicationContextClass;if(contextClass==null){try{//根据webApplicationType的类型,得到类名,通过反射方式,创建对应的IOC容器switch(this.webApplicationType){caseSERVLET:contextClass=Class.forName("org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext");break;caseREACTIVE:contextClass=Class.forName("org.springframework.boot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext");break;default:contextClass=Class.forName("org.springframework.context.annotation.AnnotationConfigApplicationContext");}}catch(ClassNotFoundExceptionvar3){thrownewIllegalStateException("UnablecreateadefaultApplicationContext,pleasespecifyanApplicationContextClass",var3);}}return(ConfigurableApplicationContext)BeanUtils.instantiateClass(contextClass);}privatevoidprepareContext(ConfigurableApplicationContextcontext,ConfigurableEnvironmentenvironment,SpringApplicationRunListenerslisteners,ApplicationArgumentsapplicationArguments,BannerprintedBanner){//将刚才创建的IOC环境设置进来context.setEnvironment(environment);this.postProcessApplicationContext(context);//在创建SpringApplication的时候设置了一些initializer,获取这些initializer,调用initialize()方法this.applyInitializers(context);//在创建SpringApplication的时候设置了一些listener,获取这些listener,调用contextPrepared()方法listeners.contextPrepared(context);if(this.logStartupInfo){this.logStartupInfo(context.getParent()==null);this.logStartupProfileInfo(context);}ConfigurableListableBeanFactorybeanFactory=context.getBeanFactory();beanFactory.registerSingleton("springApplicationArguments",applicationArguments);if(printedBanner!=null){beanFactory.registerSingleton("springBootBanner",printedBanner);}if(beanFactoryinstanceofDefaultListableBeanFactory){((DefaultListableBeanFactory)beanFactory).setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);}if(this.lazyInitialization){context.addBeanFactoryPostProcessor(newLazyInitializationBeanFactoryPostProcessor());}Set<Object>sources=this.getAllSources();Assert.notEmpty(sources,"Sourcesmustnotbeempty");this.load(context,sources.toArray(newObject[0]));//回调所有listener的contextLoaded()方法listeners.contextLoaded(context);}protectedvoidapplyInitializers(ConfigurableApplicationContextcontext){Iteratorvar2=this.getInitializers().iterator();while(var2.hasNext()){ApplicationContextInitializerinitializer=(ApplicationContextInitializer)var2.next();Class<?>requiredType=GenericTypeResolver.resolveTypeArgument(initializer.getClass(),ApplicationContextInitializer.class);Assert.isInstanceOf(requiredType,context,"Unabletocallinitializer.");//获取SpringApplication中所有的initializer,调用initialize()方法initializer.initialize(context);}}voidcontextPrepared(ConfigurableApplicationContextcontext){Iteratorvar2=this.listeners.iterator();while(var2.hasNext()){SpringApplicationRunListenerlistener=(SpringApplicationRunListener)var2.next();//获取SpringApplication中所有的listener,调用contextPrepared()方法listener.contextPrepared(context);}}##3.事件监听机制ApplicationContextInitializer和SpringApplicationRunListener需要配置在META-INF/spring.factories中。ApplicationRunner和CommandLineRunner只需要放在IOC容器中。ApplicationContextInitializerpackagecom.atguigu.springboot.listener;importorg.springframework.context.ApplicationContextInitializer;importorg.springframework.context.ConfigurableApplicationContext;//ConfigurableApplicationContext是用来监听IOC容器的,当IOC容器初始化的时候,执行initialize()方法publicclassHelloApplicationContextInitializerimplementsApplicationContextInitializer<ConfigurableApplicationContext>{@Overridepublicvoidinitialize(ConfigurableApplicationContextconfigurableApplicationContext){System.out.println("ApplicationContextInitializer...initialize..."+configurableApplicationContext);}}SpringApplicationRunListener.javapackagecom.atguigu.springboot.listener;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.SpringApplicationRunListener;importorg.springframework.context.ConfigurableApplicationContext;importorg.springframework.core.env.ConfigurableEnvironment;publicclassHelloSpringApplicationRunListenerimplementsSpringApplicationRunListener{//构造器,否则会报错publicHelloSpringApplicationRunListener(SpringApplicationapplication,String[]args){}@Overridepublicvoidstarting(){System.out.println("HelloSpringApplicationRunListener.starting");}@OverridepublicvoidenvironmentPrepared(ConfigurableEnvironmentenvironment){Objectname=environment.getSystemProperties().get("os.name");System.out.println("HelloSpringApplicationRunListener.environmentPrepared:"+name);}@OverridepublicvoidcontextPrepared(ConfigurableApplicationContextcontext){System.out.println("HelloSpringApplicationRunListener.contextPrepared");}@OverridepublicvoidcontextLoaded(ConfigurableApplicationContextcontext){System.out.println("HelloSpringApplicationRunListener.contextLoaded");}@Overridepublicvoidrunning(ConfigurableApplicationContextcontext){System.out.println("HelloSpringApplicationRunListener.running");}@Overridepublicvoidfailed(ConfigurableApplicationContextcontext,Throwableexception){System.out.println("HelloSpringApplicationRunListener.failed");}}HelloApplicationRunner.javapackagecom.atguigu.springboot.listener;importorg.springframework.boot.ApplicationArguments;importorg.springframework.boot.ApplicationRunner;@ComponentpublicclassHelloApplicationRunnerimplementsApplicationRunner{@Overridepublicvoidrun(ApplicationArgumentsargs)throwsException{System.out.println("HelloApplicationRunner.run");}}HelloCommandLineRunner.javapackagecom.atguigu.springboot.listener;importorg.springframework.boot.CommandLineRunner;importjava.util.Arrays;@ComponentpublicclassHelloCommandLineRunnerimplementsCommandLineRunner{@Overridepublicvoidrun(String...args)throwsException{System.out.println("HelloCommandLineRunner.run..."+Arrays.asList(args));}}因为ApplicationRunner和CommandLineRunner需要放在IOC容器中,所以我们给HelloApplicationRunner和HelloCommandLineRunner的类添加@Component注解。因为ApplicationContextInitializer和SpringApplicationRunListener需要配置在META-INF/spring.factories中,所以我们在resources目录下,添加META-INF/spring.factories文件,内容如下。org.springframework.context.ApplicationContextInitializer=\com.atguigu.springboot.listener.HelloApplicationContextInitializerorg.springframework.boot.SpringApplicationRunListener=\com.atguigu.springboot.listener.HelloSpringApplicationRunListener启动项目,可以在控制台根据打印的log查看启动顺序。
2020-09-02 21:35 · SpringBoot
[问答] 求图片编辑器项目案例
文章或视频

求有功能实现原理讲解,不要那种直接丢代码,因为网上有的图片编辑器库不能满足要求需要定制但是奈何楼主是菜鸡,不明白原理无从下手。

2022-08-03 21:55 · Android / 项目案例
[分享] Android VSYNC (Choreographer)与UI刷新原理分析
从UI控件内容更改到被重新绘制到屏幕上,这中间到底经历了什么?另外,连续两次setTextView到底会触发几次UI重绘呢?为什么Android APP的帧率最高是60FPS呢,这就是本文要讨论的内容
2020-02-08 13:02 · android / 安卓 / 源码分析
[问答] retrofit的create方法中,放入的不是接口而是类的话,会出现什么?
试验过了一次,放入类,好像看不出什么,请问一下原理
2021-01-05 22:42 · retrofit / android
[问答] 图凌的界面分析
老哥们图凌界面这个是什么原理,背景是我的手机桌面透明activity嘛
2020-09-20 01:00 · android
[问答] 如果不使用postDelayed的话,会由于fragment布局没有加载出来,findViewById空指针错误,
这是什么原理?0秒和不使用handler有什么区别?难道就差几行代码的速度?
2020-11-11 14:37 · android
[问答] 美团接单app订单提醒的原理是什么
美团app会一直在后台运行,有订单来了,它会一直响铃提示只到有人接单。app是用那种方式实现这种效果的。
2020-07-10 08:37 · 订单提醒
[问答] 关于网络编程的小问题
我发现老师的jar包跑着不关,post、带参get、post都可以,但是我把它关了的话,普通post就没有log输出了,带参的却可以,这个是什么原理呀,带参的强一点嘛
2020-05-18 21:35 · 网络编程
[问答] 为什么recyclerview实现瀑布流效果时,必须写上android:adjustViewBounds="true"
是没有该语句时这个时候imageview不管是包裹内容还是填充都是一样的效果,这些属性像是失效了一样图二是有android:adjustViewBounds="true" 语句时不是很懂其中原理
2020-09-01 15:03 · 安卓
[分享] 正则表达式引擎执行原理——从未如此清晰!
目前越来越多的网站、编辑器、编程语言都已支持一种叫“正则表达式”的字符串查找“公式”,有过编程经验的同学都应该了解正则表达式(Regular Expression 简写regex)是什么东西,它是一种字符串匹配的模式(pattern),更像是一种逻辑公式。
2020-02-20 21:42 · 正则表达式 / 公式 / 字符串 / 查找 / 匹配
[问答] 安卓如何获取基站(网络)定位

想问问有没有大神能讲讲怎么做这个的思路或者是原理,或者怎么才能做好。我看Celler-Z做的那种就挺好的,就是自己水平有限,

不知道怎么做。

2021-12-06 09:26 · 安卓 / 定位 / 基站
[分享] 这是一份关于HTTP协议的学习总结
随着互联网的发展,网络已经越来越普及了,绝大多数的网络请求都是基于HTTP协议的,因此在开发中,了解HTTP的基本原理是必要的,在TCP/IP四层体系结构中,HTTP协议位于应用层,它是应用层主要使用的协议
2020-02-12 11:08 · http / 协议 / 总结 / tcp / udp
[文章] 使用开源框架实现RecyclerView的下拉刷新和上拉加载更多
我们借助一个开源框架,直接包裹就可以使用,刷新控件效果的原理,我们会在自定义控件的课程里面进行讲解。
[文章] MagicIndicator 样式修改小经验,和我一样小白可参考。
2865812fed41MagicIndicator系列之二——MagicIndicator使用指南https://www.jianshu.com/p/e9a832ed6c4cMagicIndicator系列之三——MagicIndicator原理浅析及扩展
2019-12-01 21:58 · MagicIndicator
[文章] Android面试官:你在教我做事吗?
系统原理:Android应用进程间通信(IPC)机制,如Binder、AIDL。JNI(JavaNativeInterface)与NDK开发的基本概念和实际应用。
2024-01-26 17:51 · 面试 / 安卓 / 系统 / AOSP / java
[文章] 李开复给程序员的七个建议
要把数据结构、算法、数据库、操作系统原理、计算机体系结构、计算机网络,离散数学等基础课程学好。
2020-06-25 11:27 · 建议 / 程序员 / 算法 / 基础 / 李开复
[问答] Android项目的 “移植” “引用” 问题
在网上拿到网友分享的一个功能实现项目但是打开了后、勉强能看明白怎么使用里面的一些小功能其中实现原理一丁点也不知道而且多出来了很多东西具体如下图第一个框:我的理解是jar包?
2020-06-18 12:17 · anroid
[文章] SpringBoot整合Redis后报错 java.io.IOException: 远程主机强迫关闭了一个现有的连接
原理自行百度或者翻译一下它的注释就好了。然后保存后,重新启动redis就好了,已经用了两三个星期了,再也没有报过这个错误了。
2020-09-07 08:38 · redis / bug / java
[文章] Java 后台开发常见100题
栈可以装任意类型13.epoll和select的区别14.TCP中四次挥手中TIME_WAIT的作用15.流量控制16.流量控制中接收方的窗口大小由什么确定17.TCP粘包现象处理18.算法:快速排序的原理
2021-03-07 10:30 · 面试
[文章] 你真的懂IPC吗?
防止某进程正在访问共享资源时,其他进程也访问该资源,因此,主要作为进程间以及同一进程内不同线程之间的同步手段信号:不适用与信息交换,更适合与进程中断控制,比如非法内存访问、杀死某个进程等Linux中传统IPC通讯原理首先
2020-01-27 10:30 · IPC / Android / 进程间通讯 / Linux
[问答] 课程建议:希望大佬制作关于“登录注册模块”的实践课程
虽然学起来有些困难,有时你讲的挺快,功能实现的挺好,但就是为了写代码而写代码,有些原理,思路没有交代清楚。但是我坚持看,跟着敲代码,后面的几集看完以后再回过头来看一遍,还是能够消化的。
2020-07-19 22:27 · 登录注册安卓
[文章] 高德地图 Android SDK 绘制点标记 绘制自定义 Marker
layoutInflater.inflate(R.layout.diandiantu,null)}设置这个icon需要重新设置一个View过去,实现上图想要的效果至于原理我想是官方设置的资源文件替换会有一个图标
2023-11-10 09:32 · 高德地图amapp
[文章] 【领券联盟】笔记:视频46,47,48,49-解决刷新控件的事件冲突问题
mRecyclerView.canScrollVertically(1);}returnfalse;}代码很少,老师讲的很多很细,具体内容原理请看视频视频链接【领券联盟】46-添加refresh刷新控件的模块依赖
2020-04-02 19:41 · 课堂笔记
[文章] javaweb-监听器
监听到事件源变化的时,去做什么事情3.监听器的作用统计在线人数,利用HttpSessionLisener加载初始化信息:利用ServletContextListener统计网站访问量实现访问监控4.监听器原理使用代理设计模式
2021-01-30 13:14 · 监听器
[文章] 【领券联盟】笔记:视频42,43,44,45-NestedScrollView嵌套RecyclerView
homePagerHeaderContainer.getMeasuredHeight();homePagerNestedScroller.setHeaderHeight(headerHeight);......代码很少,老师讲的很多很细,具体内容原理请看视频视频链接
2020-04-02 00:05 · 课堂笔记
[文章] 移动应用扫码登录是怎么实现的呢?
移动应用扫码登录的原理手机越来越重要了,也比较私密了,也不容易被盗/丢失。所以现在很多网站的登录都使用扫码的形式登录。安全,方便,不需要输入账号和密码。
2019-11-11 17:17 · 登录 / 扫码登录 / web / 二维码 / 用户
[文章] 分布式信号量(Redis)
Redis分布式信号量的工作原理如下:计数器:Redis中的分布式信号量通常是一个键,其值代表可用资源的数量。这个数值可以通过incr或decr命令原子地增加或减少。
2024-01-25 12:08 · redis / 信号量 / 计数器
[文章] MMKV 使用简介 GitHub 转载
MMKV原理内存准备通过mmap内存映射文件,提供一段可供随时写入的内存块,App只管往里面写数据,由操作系统负责将内存回写到文件,不必担心crash导致数据丢失。
2022-10-27 14:05 · android
  • 1
  • 2
  • 3