首页 文章 精选 留言 我的

精选列表

搜索[任务组],共10000篇文章
优秀的个人博客,低调大师

[安卓] 10、悬浮窗与获取其他任务信息

这里介绍的是一个浮动窗口以及用该浮动窗口显示当前在顶层的应用信息~一个需要写2个layout和2个java 在MainActivity中主要是那两个按钮的的监听事件,通过Intent启动和关闭另一个activity. 1 public class MainActivity extends Activity { 2 @Override 3 public void onCreate(Bundle savedInstanceState) { 4 super.onCreate(savedInstanceState); 5 setContentView(R.layout.main); 6 // FloatingWindowActivity的布局视图按钮 7 Button start = (Button) findViewById(R.id.start_id); 8 Button remove = (Button) findViewById(R.id.remove_id); 9 start.setOnClickListener(new OnClickListener() { 10 @Override 11 public void onClick(View v) { 12 // TODO Auto-generated method stub 13 Intent intent = new Intent(MainActivity.this, FxService.class); 14 startService(intent); 15 finish(); 16 } 17 }); 18 19 remove.setOnClickListener(new OnClickListener() { 20 @Override 21 public void onClick(View v) { 22 Intent intent = new Intent(MainActivity.this, FxService.class); 23 stopService(intent); 24 } 25 }); 26 27 } 28 } 另一个FxService则是悬浮窗的全部实现:其中核心都是在createFloatView()函数中实现的,因为在onCreate中调用的是这个函数。在该函数中首先对悬浮窗的一些属性进行设置,然后写其触摸和点击事件,触摸事件中主要是移动悬浮窗位置;点击事件主要是获取上层活动activity的packageName[80-82],然后根据包名获得进程名[84-86],下面就是根据获得的信息来更新悬浮窗的显示了并toast. 1 private void createFloatView() { 2 wmParams = new WindowManager.LayoutParams(); 3 // 获取WindowManagerImpl.CompatModeWrapper 4 mWindowManager = (WindowManager) getApplication().getSystemService( 5 getApplication().WINDOW_SERVICE); 6 // 设置window type 7 wmParams.type = LayoutParams.TYPE_PHONE; 8 // 设置图片格式,效果为背景透明 9 wmParams.format = PixelFormat.RGBA_8888; 10 // 设置浮动窗口不可聚焦(实现操作除浮动窗口外的其他可见窗口的操作) 11 wmParams.flags = 12 // LayoutParams.FLAG_NOT_TOUCH_MODAL | 13 LayoutParams.FLAG_NOT_FOCUSABLE 14 // LayoutParams.FLAG_NOT_TOUCHABLE 15 ; 16 17 // 调整悬浮窗显示的停靠位置为左侧置顶 18 wmParams.gravity = Gravity.LEFT | Gravity.TOP; 19 20 // 以屏幕左上角为原点,设置x、y初始值 21 wmParams.x = 0; 22 wmParams.y = 0; 23 24 /* 25 * // 设置悬浮窗口长宽数据 wmParams.width = 200; wmParams.height = 80; 26 */ 27 28 // 设置悬浮窗口长宽数据 29 wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT; 30 wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT; 31 32 LayoutInflater inflater = LayoutInflater.from(getApplication()); 33 // 获取浮动窗口视图所在布局 34 mFloatLayout = (LinearLayout) inflater.inflate(R.layout.float_layout, 35 null); 36 // 添加mFloatLayout 37 mWindowManager.addView(mFloatLayout, wmParams); 38 39 Log.i(TAG, "mFloatLayout-->left" + mFloatLayout.getLeft()); 40 Log.i(TAG, "mFloatLayout-->right" + mFloatLayout.getRight()); 41 Log.i(TAG, "mFloatLayout-->top" + mFloatLayout.getTop()); 42 Log.i(TAG, "mFloatLayout-->bottom" + mFloatLayout.getBottom()); 43 44 // 浮动窗口按钮 45 mFloatView = (Button) mFloatLayout.findViewById(R.id.float_id); 46 mFloatLayout.measure(View.MeasureSpec.makeMeasureSpec(0, 47 View.MeasureSpec.UNSPECIFIED), View.MeasureSpec 48 .makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); 49 Log.i(TAG, "Width/2--->" + mFloatView.getMeasuredWidth() / 2); 50 Log.i(TAG, "Height/2--->" + mFloatView.getMeasuredHeight() / 2); 51 // 设置监听浮动窗口的触摸移动 52 mFloatView.setOnTouchListener(new OnTouchListener() { 53 54 @Override 55 public boolean onTouch(View v, MotionEvent event) { 56 // TODO Auto-generated method stub 57 // getRawX是触摸位置相对于屏幕的坐标,getX是相对于按钮的坐标 58 wmParams.x = (int) event.getRawX() 59 - mFloatView.getMeasuredWidth() / 2; 60 // Log.i(TAG, "Width/2--->" + mFloatView.getMeasuredWidth()/2); 61 Log.i(TAG, "RawX" + event.getRawX()); 62 Log.i(TAG, "X" + event.getX()); 63 // 25为状态栏的高度 64 wmParams.y = (int) event.getRawY() 65 - mFloatView.getMeasuredHeight() / 2 - 25; 66 // Log.i(TAG, "Width/2--->" + mFloatView.getMeasuredHeight()/2); 67 Log.i(TAG, "RawY" + event.getRawY()); 68 Log.i(TAG, "Y" + event.getY()); 69 // 刷新 70 mWindowManager.updateViewLayout(mFloatLayout, wmParams); 71 return false; 72 } 73 }); 74 75 mFloatView.setOnClickListener(new OnClickListener() { 76 @Override 77 public void onClick(View v) {//显示当前是哪个应用在顶层 78 // TODO Auto-generated method stub 79 pm = getPackageManager(); 80 am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 81 String packageName = am.getRunningTasks(1).get(0).topActivity 82 .getPackageName(); 83 try { 84 String progressName = pm.getApplicationLabel( 85 pm.getApplicationInfo(packageName, 86 PackageManager.GET_META_DATA)).toString(); 87 mFloatView = (Button) mFloatLayout 88 .findViewById(R.id.float_id); 89 mFloatView.setText(progressName); 90 Toast.makeText(FxService.this, progressName, 91 Toast.LENGTH_SHORT).show(); 92 } catch (NameNotFoundException e) { 93 // TODO Auto-generated catch block 94 e.printStackTrace(); 95 } 96 } 97 }); 98 } 注意:如果想获得系统的TopActivity,还必须获得权限: <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 本文链接:http://www.cnblogs.com/zjutlitao/p/4231525.html 更多精彩:http://www.cnblogs.com/zjutlitao/ github: https://github.com/beautifulzzzz/Android/tree/master/FloatingWindow 本文转自beautifulzzzz博客园博客,原文链接:http://www.cnblogs.com/zjutlitao/p/4231525.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

知识库Survey论文快读:从符号三元组到 LLM 自动构建

一次读 4 篇跨度十年的知识库/知识图谱综述(2015 → 2025),按问题主线交叉跳读: -[Nickel15] = Nickel et al., A Review of Relational Machine Learning for Knowledge Graphs; -[Ji20] = Ji et al., A Survey on Knowledge Graphs: Representation, Acquisition, and Applications; -[Niu24] = Niu, Knowledge Graph Embeddings: A Comprehensive Survey on Capturing Relation Properties; -[Bian25] = Bian, LLM-empowered Knowledge Graph Construction: A Survey。 插图均从原论文 PDF 截取,仅供学习使用。

优秀的个人博客,低调大师

vue2的$refs在vue3组合式API中的替代方法

如果你有过vue2的项目开发经验,那么对$refs就很熟悉了。由于vue3的断崖式的升级,在vue3中如何使用$refs呢?想必有遇到过类似的问题,我也有一样的疑惑。通过搜索引擎和github,基本掌握如何使用$refs。在vue3中使用组合式API的函数ref来代替静态或者动态html元素的应用。 最近业余在学习vue3项目《蜡笔(Crayon)管理模板:Vue3 + Vuex4 + Ant Design2》开发,这两天迭代推进了一点,实现了chart图表组件,写文章的时候发现提交代码的commit有错别字。 在vue3中使用组合式API的setup()方法的时候,无法正常使用this.$refs,但可以使用新的函数ref()。 下面代码摘自:https://github.com/QuintionTang/crayon/blob/feat-dashboard/src/qtui/components/Chart.vue <template> <canvas ref="refChart" :height="setHeight"></canvas> </template> <script> import { defineComponent, onMounted, ref, inject, watch } from "vue"; import Chart from "chart.js"; import { deepCopy } from "@/helper/index"; export default defineComponent({ name: "QtChart", props: { type: { type: String, required: true, default: "line", }, data: { type: Object, required: true, default: () => ({}), }, options: { type: Object, default: () => ({}), }, height: { type: Number, default: 0, }, refKey: { type: String, default: null, }, }, setup(props) { const refChart = ref(); // 初始化方法 const init = () => { const canvasChart = refChart.value?.getContext("2d"); const chartHelper = new Chart(canvasChart, { type: props.type, data: deepCopy(props.data), options: props.options, }); watch(props, () => { chartHelper.data = deepCopy(props.data); chartHelper.options = props.options; chartHelper.update(); }); // 附加一个实例给refChart refChart.value.instance = chartHelper; }; // 设置高度 const setHeight = () => { return { height: props.height, }; }; // 绑定一个实例,使用inject注入 const bindInstance = () => { if (props.refKey) { const bind = inject(`bind[${props.refKey}]`); if (bind) { bind(refChart.value); } } }; onMounted(() => { bindInstance(); init(); }); return { refChart, setHeight, }; }, }); </script> 这段代码完整的实现了一个图表组件Chart,其中自定义了属性props,通过把参数传递给setup方法来使用其属性值。html中定义一个ref="refChart"来作为图表的dom对象,在setup方法中通过方法ref方法来定义响应式可变对象,并在setup函数结尾作为返回值。 const refChart = ref(); 需要注意的是,返回值的属性名必须和html中的ref值一致。 下面代码是可以正常执行的。 <template> <canvas ref="refChart" :height="setHeight"></canvas> </template> <script> import { defineComponent, onMounted, ref, inject, watch } from "vue"; import Chart from "chart.js"; import { deepCopy } from "@/helper/index"; export default defineComponent({ name: "QtChart", props: { // ... }, setup(props) { const refChartBox = ref(); // ... return { refChart:refChartBox, }; }, }); </script> 下面的情况,会出现程序错误,无法达到预期效果。应为html中定义的ref="refChart"和setup返回的refChartBox不一致。 <template> <canvas ref="refChart" :height="setHeight"></canvas> </template> <script> import { defineComponent, onMounted, ref, inject, watch } from "vue"; import Chart from "chart.js"; import { deepCopy } from "@/helper/index"; export default defineComponent({ name: "QtChart", props: { // ... }, setup(props) { const refChartBox = ref(); // ... return { refChartBox, }; }, }); </script> 结论 本文只是简单的介绍ref方法的使用,正好在项目中用到,后续将继续边学边推进项目并做好笔记。

优秀的个人博客,低调大师

Redis中国用户组|唯品会Redis cluster大规模生产实践经验

Outline 一、生产应用场景 二、存储架构演变 三、应用最佳实践 四、运维经验总结 第1、2节:介绍redis cluster在唯品会的生产应用场景,以及存储架构的演变。 第3节:redis cluster的稳定性,应用成熟度,踩到过那些坑,如何解决这些问题?这部分是大家比较关心的内容。 第4节:简单介绍大规模运营的一些经验,包括部署、监控、管理以及redis工具开发。 本文作者:geelou 本文来自云栖社区合作伙伴rediscn,了解相关信息可以关注redis.cn网站。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册