博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[安卓] 10、悬浮窗与获取其他任务信息
阅读量:6977 次
发布时间:2019-06-27

本文共 5714 字,大约阅读时间需要 19 分钟。

 

这里介绍的是一个浮动窗口以及用该浮动窗口显示当前在顶层的应用信息~一个需要写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             @Override11             public void onClick(View v) {12                 // TODO Auto-generated method stub13                 Intent intent = new Intent(MainActivity.this, FxService.class);14                 startService(intent);15                 finish();16             }17         });18 19         remove.setOnClickListener(new OnClickListener() {20             @Override21             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_FOCUSABLE14     // LayoutParams.FLAG_NOT_TOUCHABLE15     ;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     // 添加mFloatLayout37     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.MeasureSpec48             .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         @Override55         public boolean onTouch(View v, MotionEvent event) {56             // TODO Auto-generated method stub57             // 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         @Override77         public void onClick(View v) {
//显示当前是哪个应用在顶层78 // TODO Auto-generated method stub79 pm = getPackageManager();80 am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);81 String packageName = am.getRunningTasks(1).get(0).topActivity82 .getPackageName();83 try {84 String progressName = pm.getApplicationLabel(85 pm.getApplicationInfo(packageName,86 PackageManager.GET_META_DATA)).toString();87 mFloatView = (Button) mFloatLayout88 .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 block94 e.printStackTrace();95 }96 }97 });98 }

注意:如果想获得系统的TopActivity,还必须获得权限:

<uses-permission android:name="android.permission.GET_TASKS" />  

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

 

 

本文链接:

更多精彩:

github:   

 

本文转自beautifulzzzz博客园博客,原文链接:http://www.cnblogs.com/zjutlitao/p/4231525.html,如需转载请自行联系原作者

你可能感兴趣的文章
IOS自定义表格UITableViewCell
查看>>
[Linux] ubuntu 格式化u盘
查看>>
一个COM示例程序
查看>>
通过改进算法来优化程序性能的真实案例(Ransac)
查看>>
head命令
查看>>
软件开发经验总结(一)细节决定软件的成败
查看>>
python tar.gz格式压缩、解压
查看>>
JNDI概述(转载)
查看>>
利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换
查看>>
第 7 章 项目运作
查看>>
PYTHON黑帽编程1.5 使用WIRESHARK练习网络协议分析
查看>>
.NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator
查看>>
C# 格式串(收藏)
查看>>
浅谈SQL Server中统计对于查询的影响
查看>>
WF4 Beta,RC版文章总结
查看>>
WPF 与Surface 2.0 SDK 亲密接触–LibraryContainer 篇
查看>>
C# 对应 Oracle 存储过程 的 SYS_REFCURSOR 应该 传入什么类型的参数?
查看>>
Unity3D移植到自己的Android程序
查看>>
【转】用示例说明索引数据块中出现热块的场景,并给出解决方案
查看>>
HDU 2034 人见人爱A-B
查看>>