创建 service 后台启动

public class FBService extends Service {    private static final String TAG = "FBService";    public static final int TYPE_ADD = 0;    public static final int TYPE_DEL = 1;    private FloatBallManager mFBManager;    @Override    public void onCreate() {        super.onCreate();        Log.d(TAG,"onCreate");        mFBManager = FloatBallManager.getInstance(this);    }    private void showFloatBall() {        Log.d(TAG,"showFloatBall");        mFBManager.addBallView(); //通过mFBManager 在windowmanager添加view     }    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        Log.d(TAG,"onStartCommand");showFloatBall(intent);        showFloatBall();        return super.onStartCommand(intent, flags, startId);    }    @Override    public IBinder onBind(Intent intent) {        return null;    }    @Override    public void onDestroy() {        super.onDestroy();        Log.d(TAG,"onDestroy");    }}

通过FloatBallManager 在windowmanager 加载 悬浮球布局

public class FloatBallManager {    private static final String TAG = "FloatBallManager";    private FloatBallManager(Context ctx){        mCtx = ctx;        mWindowManager = (WindowManager) mCtx.getSystemService(Context.WINDOW_SERVICE);        //获取WindowManager     }    public static  FloatBallManager getInstance(Context ctx){        if(instance == null){            synchronized(FloatBallManager.class){                if(instance == null){                    instance = new FloatBallManager(ctx);                }            }        }        return instance;    }    public void addBallView() {        if (mFloatBallView == null) {        //获取 整个手机的宽度和高度            DisplayMetrics dm = new DisplayMetrics();            mWindowManager.getDefaultDisplay().getMetrics(dm);            mScreenWidth = dm.widthPixels;            mScreenHeight = dm.heightPixels;            //填充悬浮球 布局            mFBWindow = LayoutInflater.from(mCtx).inflate(R.layout.float_ball, null);            mFloatBallView = mFBWindow.findViewById(R.id.float_ball);            mFBParams = new LayoutParams(); //设置悬浮球布局的参数            mFBParams.x = mScreenWidth-mFloatBallView.getWidth();             mFBParams.y = mScreenHeight / 2;            mFBParams.width = WindowManager.LayoutParams.WRAP_CONTENT;            mFBParams.height = WindowManager.LayoutParams.WRAP_CONTENT;            mFBParams.gravity = Gravity.LEFT | Gravity.TOP;            mFBParams.type = LayoutParams.TYPE_SYSTEM_ALERT | LayoutParams.TYPE_SYSTEM_OVERLAY;//顶层的View ,就要用这两个type             mFBParams.format = PixelFormat.TRANSLUCENT;//半透明            mFBParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_NOT_FOCUSABLE;//设置没有焦点不能touch,这样其他的界面才可以滑动和操作            mWindowManager.addView(mFBWindow, mFBParams);            //将View 按照mFBParams参数设置,添加到mWindowManager ,mFBParams是告诉mFBWindow 的父view        }    }    //这个方法用来拖动时使用,更新位置    public void updateBallView(int deltaX,int deltaY) {        mFBParams.x += deltaX;        mFBParams.y += deltaY;        if (mWindowManager != null) {//            Log.d(TAG,"updateBallView mParams.x = "+mFBParams.x+" mParams.y = "+mFBParams.y);            mWindowManager.updateViewLayout(mFBWindow, mFBParams);        }    }}

悬浮球布局

<?xml version="1.0" encoding="utf-8"?>"http://schemas.android.com/apk/res/android"    android:id="@+id/fl_button"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:background="@android:color/transparent"    android:orientation="vertical">            "@+id/img_bg"              android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:scaleX="0.7"            android:scaleY="0.7"            android:background="@drawable/icon_bg"            android:layout_gravity="center"/>            "@+id/img_ball"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="center"            android:alpha="0.5"            android:scaleX="0.7"            android:scaleY="0.7"            android:background="@drawable/icon_ball"/>            "@+id/img_big_ball"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="center"            android:scaleX="0.7"            android:scaleY="0.7"            android:background="@drawable/icon_big_ball"            android:visibility="invisible"            />               "@+id/tv_switch"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="center"            android:text="@string/switch_off"/>

以上一个悬浮球 就可以显示了,但是不能操作

完整代码


更多相关文章

  1. Android(安卓)ListView异步加载网络图片
  2. [置顶] Android(安卓)Studio 配置
  3. android中异步加载图片信息
  4. 检查Android进程当前是否正在后台运行
  5. android 加载 网络图片
  6. Android判断应用程序从后台回到前台
  7. Android(安卓)使用IPC和后台Service通信
  8. android加载进度条
  9. android ImageLoader加载本地图片的工具类

随机推荐

  1. Android关于arm64-v8a、armeabi-v7a、arm
  2. 系统音量 android
  3. Android Retrofit源码解析
  4. Android(安卓)gallery 3D效果
  5. 关于Style的用法例子
  6. android解析XML文件的三方法之Pull(读写)
  7. Android ROM 拆包和打包
  8. Android 编程获取手机型号,本机电话号码,sd
  9. android实现节点进度条效果
  10. Android 实现调整屏幕亮度,以及自动适应