[安卓] 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

时间: 2024-12-14 04:26:12

[安卓] 10、悬浮窗与获取其他任务信息的相关文章

关于Android悬浮窗要获取按键响应的问题

要在Android中实现顶层的窗口弹出,一般都会用WindowsManager来实现,但是几乎所有的网站资源都是说弹出的悬浮窗不用接受任何按键响应. 而问题就是,我们有时候需要他响应按键,比如电视上的android,我们要它响应遥控器上的音量按键等等之类的.这时就必须要对添加的View进行LayoutParams的相关设置了. 主要的代码就两个地方. 第一,添加的view不可以设置layoutParams.flags=LayoutParams.FLAG_NOT_FOCUSABLE;//否则就完全

突破小米悬浮窗权限控制--不需要权限的悬浮窗

突破小米悬浮窗权限控制–不需要权限的悬浮窗 在上一篇文章讲了Android的Toast拓展,在原生Toast基础上对显示时长和显示动画做了二次封装,强化了Toast的部分功能.也分析了对于二次封装的ExToast设计原理,以及Toast的关键点.如果不了解的可以看看下面的链接. Toast拓展–自定义显示时间和动画 常用悬浮窗与Toast 之前分析过,Toast其实就是系统悬浮窗的一种,那它跟常用的系统悬浮窗有什么区别呢? 先看一下常用的Andoird系统悬浮窗写法: // 获取应用的Conte

android悬浮窗--获取内存显示当前内存使用量

原文地址:http://www.android100.org/html/201306/20/3224.html 运行效果: 其中, 这一块就是悬浮窗,可以随意拖动,动态显示当前内存使用量. 下面看一下代码是如何实现的: 悬浮窗的实现是用了一个service,为什么要用service呢?了解service特点的大体就会明白.下面看一下: public class FloatService extends Service { WindowManager wm = null; WindowManage

【图文教程】小米4如何获取触动精灵悬浮窗权限

机型:小米4 系统:4.4.4 1. 打开设置,在界面底部找到其他应用管理,点击 2. 在打开的界面找到触动精灵并点击 3. 在应用详情界面上滑,点击底部的权限管理 4. 点击悬浮窗管理,在弹出的底部菜单选择允许

(转载)简易的可拖动的桌面悬浮窗效果

本文转载自:http://www.cnblogs.com/xqxacm/p/4918470.html 首先,我们需要知道,悬浮窗分为两种:Activity级别的悬浮窗,系统级别的悬浮窗 Activity级别的悬浮窗跟随所属Activity的生命周期而变化,而系统级别的悬浮窗则可以脱离Activity而存在. 由此可知,要实现360手机卫士那样的悬浮窗效果,就需要使用系统级别的悬浮窗 下面学习实现桌面悬浮窗效果的代码步骤: 1.配置清单文件AndroidManifest.xml 中 添加系统悬浮窗

android桌面悬浮窗仿QQ手机管家加速效果

主要还是用到了WindowManager对桌面悬浮进行管理. 需要一个火箭的悬浮窗 一个发射台悬浮窗  ,判断火箭是否放到了发射台,如果放上了,则使用AsyTask 慢慢将火箭的图片往上移.结束后., 返回原位. 1.打开activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.andro

Android悬浮窗原理解析(Window)[源码]

悬浮窗,在大多数应用中还是很少见的,目前我们接触到的悬浮窗,差不多都是一些系统级的应用软件,例如:360安全卫士,腾讯手机管家等:在某些服务行业如金融,餐饮等,也会在应用中添加悬浮窗,例如:美团的偷红包,博闻金融快捷联系等.但两种悬浮窗还是有区别的: 系统悬浮窗:所有界面都会展示,包括主屏.锁屏 应用悬浮窗:只在应用Activity中展示. 一.窗口Window 在了解悬浮窗之前,首先我们需要认识一下Android窗口Window.Android Framework将窗口分为三个类型: 应用窗口

悬浮窗

1 package com.bi.dialogactivity_xuanfuchuang.app; 2 3 import android.graphics.Color; 4 import android.graphics.PixelFormat; 5 import android.support.v7.app.ActionBarActivity; 6 import android.os.Bundle; 7 import android.view.*; 8 import android.widge

android桌面悬浮窗实现

                        首先是一个小的悬浮窗显示的是当前使用了百分之多少的内存,点击一下小悬浮窗,就会弹出一个大的悬浮窗,可以一键加速.好,我们现在就来模拟实现一下类似的效果. 1.新建一个项目 , 打开activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.an