context

锁屏上显示Activity

妖精的绣舞 提交于 2020-01-19 19:09:01
SurfaceFlinger 前面说的,就是一个surface的合成。SurfaceFlinger就是一个默默的记录着,它不会对surface的内容有什么改动。 WMS(WindowsManagerService)就是对surface的管理,或者说是一个大管家。它负责协调各方面资源。 ViewRoot就是一个个演员,负责表演(产生surface)。 从IO系统角度而言,WMS至少要干这几件事。 全局窗口管理 全局事件派发 键盘 触摸屏 1.WMS综述 1)WMS将以同AMS等一样的形式,系统server的一部分。 由SystemServer负责启动 知道系统关闭才能停止 发生异常的时候,能够自我恢复 2)SurfaceFlinger 和WMS将有很多交集。 3)有显示需求的图层。可以想见,界面显示是分不同层级的。 4)inputManagerService 当有按键或者触摸事件时,WMS时最好的管理员。 5)AMS 同WMS 也有交互。 6)Bind交互 从WMS窗口的实现来讲,主要包含如下子功能 窗口的添加和删除 启动窗口 窗口动画 窗口大小 窗口层级 事件派发 1.1WMS的启动 services\java\com\android\server\SystemServer.java private void startOtherServices() { inputManager

spring源码解析之SpringIOC源码解析(上)

主宰稳场 提交于 2020-01-19 17:34:08
SpringIOC源码解析(上) 一、什么是SpringIOC spring ioc指的是控制反转,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。交由Spring容器统一进行管理,从而实现松耦合。 二、SpringIOC源码解析 在开始之前我们先通过一个简单的示意图来了解一下大概的一个流程 从示意图可以看出,当web容器启动的时候,spring的全局bean的管理器会去xml配置文件中扫描的包下面获取到所有的类,并根据你使用的注解,进行对应的封装,封装到全局的bean容器中进行管理,一旦容器初始化完毕,beanID以及bean实例化的类对象信息就全部存在了,现在我们需要在某个service里面调用另一个bean的某个方法的时候,我们只需要依赖注入进来另一个bean的Id即可,调用的时候,spring会去初始化完成的bean容器中获取即可,如果存在就把依赖的bean的类的实例化对象返回给你,你就可以调用依赖的bean的相关方法或属性等; 本文会分析Spring的IOC模块的整体流程,分析过程需要使用一个简单的demo工程来启动Spring,需要的童鞋可自行下载 https://github.com/cjinjun/spring-framework-demo 工程示例代码 写一个简单的接口和接口实现类 public interface IOCService {

上下滚动自定义广告条ViewGroup

做~自己de王妃 提交于 2020-01-19 16:53:25
工作日志记录,记录本文的初衷是用来抛砖引玉,希望对自己以后有用,对各位看官也有用。。。 惯例上图: 上代码: package com.xuganwen.testhichart; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; /** * 文件描述: * 作者:徐干稳 * 创建时间:2020/1/9 * 更改时间:2020/1/9 * 版本号:1.0 */ public class AdvertisementView<T extends View> extends ViewGroup { private int childCount; float value; public AdvertisementView(Context context) { super(context); } public AdvertisementView(Context context, AttributeSet attrs) { super(context, attrs

Android9.0保活后台service

南楼画角 提交于 2020-01-19 13:57:35
Android8.0之后Service变为后台后很开就会被杀死。因此要采取一定的措施进行保活。 启动service: Intent i=new Intent(context,TestIntentService.class); if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){ context.startForegroundService(i); }else{ context.startService(i); } Service类为: package com.example.myapplicationww; import android.app.IntentService; import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import

Cannot initialize context because there is already a root application context present

扶醉桌前 提交于 2020-01-19 12:30:23
严重: StandardWrapper.Throwable java.lang.IllegalStateException: Cannot initialize context because there is already a root application context present - check whether you have multiple ContextLoader* definitions in your web.xml! at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:182) at com.webapp.main.WebApp.init(WebApp.java:28) at javax.servlet.GenericServlet.init(GenericServlet.java:212) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1172) at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:808) at

ActiveMQ_监听器(四)

风流意气都作罢 提交于 2020-01-19 11:30:40
一、本文章包含的内容 1、列举了ActiveMQ中监听器的使用 2、spring+activemq方式 1 2 3 <!-- 消息监听容器(Queue),配置连接工厂,监听的队列是queue3,监听器是上面定义的监听器 --> <!--加载spring配置后,studentInfoHandler的onMessage方法自动运行并接收队列--> 二、配置文件(spring-jms.xml) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 <? xml version = "1.0" encoding = "UTF-8" ?> < beans xmlns = " http://www.springframework.org/schema/beans " xmlns:xsi = " http://www.w3.org/2001/XMLSchema-instance " xmlns:context = " http://www.springframework.org/schema/context " xmlns:jms = " http://www.springframework.org

穿山甲sdk激励视频广告关闭按钮引发的bug排查及解决

折月煮酒 提交于 2020-01-19 10:04:47
项目中接入了穿山甲广告,其中包括图文广告和视频广告,后期发现一个偶现的问题,就是看完激励视频广告后,点击视频页面的关闭按钮,此时回到了app源生页面,UI卡住了,本来看完视频有个加分操作,现在没了。排查了代码,看看是不是自己的代码有漏洞,看了半天也没发现,然后就想,是不是穿山甲sdk的视频有问题,点击关闭按钮没有给客户端回调?为了验证这个问题,我写了个点击事件,请求激励视频并且播放,在穿山甲的回调地方添加log日志,看看是否有打印日志。由于bug是偶现的,那就是说需要大量的尝试,如果向上面的那样操作,点击一下请求广告,视频播放结束显示关闭按钮,再点击一下,比较麻烦,并且把一个人给定死在这里,需要不停的操作,能不能省点力? 第一步,我把请求广告的点击事件,放到了 Activity 的 onResume() 方法中,这样,刚进入该页面,或者视频看完点击关闭按钮后又回到该页面,都会触发激励视频广告,为了体验更好一点,我在 onResume() 方法中延迟了1秒去请求广告,并在请求广告的时候添加请求log日志; 第二步,我想在激励视频结束时也打印一个log日志,由于激励视频页面是SDK内部的Activity,没办法直接监听,我就从 Application 入手,它有个注册方法 registerActivityLifecycleCallbacks

Android 绘图时实现双缓冲

我与影子孤独终老i 提交于 2020-01-19 07:51:00
一、双缓冲技术原理:   在内存中创建一片内存区域,把将要绘制的图片预先绘制到内存中,在绘制显示的时候直接获取缓冲区的图片进行绘制。更具体一点来说: 先通过setBitmap方法将要绘制的所有的图形绘制到一个Bitmap上也就是先在内存空间完成,然后再来调用drawBitmap方法绘制出这个Bitmap,显示在屏幕上。 二、双缓冲技术出现的缘由   当一个动画争先显示时,程序又在改变它,前面的画面还没显示完,程序又要求重新绘制,这样屏幕就会不停闪烁。为了避免闪烁,使绘制的内容有一个平滑的过度,所以就出现了双缓冲技术——》将要处理的图片都放在内存中处理好后,再将其一次性显示到屏幕上。这样出来的就是完整的图像,不会出现闪烁现象。 二、双缓冲技术的优缺点   优点:     1.绘制过程中一般不会出现闪烁现象,能使动画平滑过度。     2.高效,将图像一次性绘制到屏幕上比一次一次的绘制要高效的多。   缺点:     当图片过大时会严重的消耗内存 三、实现双缓冲的步骤   1.创建一片内存区域用于存放目标Bitmap        // 创建一个200*200的缓冲区 bitmapBuffer = Bitmap.createBitmap(200, 200, Config.ARGB_8888);   2.设置目标内容绘制到缓冲区     // 设置将目标内容绘制在“缓冲区” canvas

RecycleView&&Framgment的使用

不问归期 提交于 2020-01-19 04:34:01
一..添加依赖 dependencies { //noinspection GradleCompatible implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support:recyclerview-v7:28.0.0' } 二.布局文件 1.layout/activity_main..xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!--<FrameLayout android:id="@+id/main_content" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"/>-->

Android动态加载代码技术

时间秒杀一切 提交于 2020-01-18 09:06:32
Android动态加载代码技术 在开发Android App的过程当中,可能希望实现插件式软件架构,将一部分代码以另外一个APK的形式单独发布,而在主程序中加载并执行这个APK中的代码。 实现这个任务的一般方法是: // 加载类cls Context pluginContext = mainContext.createPackageContext(PLUGIN_PKG, Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE); ClassLoader loader = pluginContext.getClassLoader(); Class<?> cls = loader.loadClass(CLASS_NAME); // 通过反射技术,调用cls中的方法,下面是一个示例,实际代码因情况而定 Object obj = cls.newInstance(); Method method = cls.getDeclaredMethod("someMethod"); method.invoke(obj); 但是,这个方法在Android 4.1及之后的系统中存在一些问题:对于收费应用,Google Play会将其安装在一个加密目录之下(具体就是/data/app-asec),而不是一个普通目录之下(具体就是/data