目录

开发背景

一、搭建环境

二、功能实现

1、思路简单分析:

2、主要问题

三、展示

开发背景

       好久没有碰安卓了,由于自己一直记性不好,经常需要把壁纸改成将要完成的任务来提醒自己。(不选择手机的备忘录,是因为它不能一直显示,对我来说不太满意)于是,打算动手写一个简单APP,来满足自己。

功能:可以输入文字,可以定位在屏幕最上层。

这是最初功能。

一、搭建环境

今天是2021年12月31,编辑器选择AndroidStudio3.0(官网最新)安装很顺畅,模拟器使用夜神。在安装路径下,执行cmd在

输入

nox_adb.exe connect 127.0.0.1:62001

 测试成功

 连接成功!

二、功能实现

在网上查询资料,好像FloatingWindow可以实现类似的功能。

Floating view:可以悬浮在应用的各个页面。floating view是放在一个单独的window中。 对于每个app而言,它所在的window在floating view所在的window之下,这样,就可以悬浮在其至上。window可以设置相应的层级。比如,通知栏,就是在一个级别很高的window中。

1、思路简单分析:

1)用 EditText接收文本,点击Button提交,触发点击事件

2)在点击事件内获取文本,通过Intent,传入Service

3)在Service里取到对应的文本,送给FloatingWindow

4)撒花❀❀❀❀❀

2、主要问题

1)权限与请求的设置

Manefest.xml文件中声明权限SYSTEM_ALERT_WINDOW

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

2)设置里面对本应用进行设置悬浮窗权限。该权限在应用中需要启动Settings.ACTION_MANAGE_OVERLAY_PERMISSION来让用户手动设置权限。

startActivityForResult(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())), REQUEST_CODE);

3)LayoutParam设置

LayoutParam里的type变量,指定窗口类型的。

Android 8.0之前,悬浮窗口设置可以为TYPE_PHONE,提供用户交互操作的非应用窗口。
Android 8.0之后,如果需要实现在其他应用和窗口上方显示提醒窗口,那么必须该为TYPE_APPLICATION_OVERLAY的新类型。

4)在Servie里获取EditText内容

为了这里在showFloatingWindow() 函数里接收到输入的文本,再给 showFloatingWindow()

借助了静态变量Text传递。不太规范,但此应用自用,且体积尚小,后期再做优化。

public static String Text;
  @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        showFloatingWindow();
        String  string = intent.getStringExtra("string1");
        Log.v("MainActivity",string);
        Text = string;
        Log.v("MainActivity",string);
        return super.onStartCommand(intent, flags, startId);

    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    private void showFloatingWindow() {
//        String string = Text;
//        Log.v("MainActivity",string);
        if (Settings.canDrawOverlays(this)) {
           // editText=new EditText(getApplicationContext());
            //Log.v("MainActivity",string);
            button = new Button(getApplicationContext());
            button.setText(Text);
            button.setBackgroundColor(Color.WHITE);
            windowManager.addView(button, layoutParams);
            button.setOnTouchListener(new FloatingOnTouchListener());
        }
    }

5)显示的不太对

 经过一番测试,发现

 showFloatingWindow函数比onStartCommand函数先执行

查看onStartCommand()函数,发现先调用了函数,其次才取值,修改位置

完美

三、展示

暂更到这,2021年12月31日


 需要源码,请关注公众号“大鱼海无糖”,回复:悬浮备忘录

参考博文:

Android悬浮窗的实现_董小虫的专栏-CSDN博客_android 悬浮窗

android中activity向service中传值_illdvm_新浪博客

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐