还是需求的问题,我这边在网上去找了一些资料整理了一下
这边引用了GitHub上的一位大神的实现方式:https://github.com/yhaolpz/FloatWindow
将他的一些方法和功能实现抽离一部分功能出来
这上面为什么这样做,还是因为考虑到这个app,开机自启动之后,不要影响到其他app或者功能的使用,
开机自启动我这边,选择延迟5秒钟,再启动
@Override
public void onReceive(final Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
// if(intent.getAction().equals("android.intent.action.BOOT_COMPLETED")){
// Intent is =new Intent(context, Main2Activity.class);
// is.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// context.startActivity(is);
// System.out.println("启动成功" );
// Log.i("启动成功","启动成功");
// }
new android.os.Handler(Looper.myLooper()).postDelayed(new Runnable() {
@Override
public void run() {
Log.i("线程启动成功","线程启动成功");
context.startActivity(new Intent(context,Main2Activity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
}
},5000);
}
当然,你也可以选择直接启动,我这边有个重新onKeydown()去监听外接物理键盘,直接启动,会导致我的监听功能不能正常使用。我这边启动跳转的Main2Activity布局是空白的,这边只有重新onKeydown()方法。
我这边的悬浮窗也是自定义的布局和样式,以便显示自己想要的布局内容
LinearLayout ll_main, ll_Setting;
View inflat;
//布局
inflat = (View) View.inflate(getApplicationContext(), R.layout.activity_main, null);
ll_main = inflat.findViewById(R.id.ll_main);
ll_Setting = inflat.findViewById(R.id.ll_Setting);
FloatWindow
.with(getApplicationContext())
.setView(inflat)
.setWidth(Screen.width, 1f) //设置悬浮控件宽高
.setHeight(Screen.width, 0.4f)
// .setX(Screen.width, 0.8f)
// .setY(Screen.height, 0.3f)
/* .setX(0)
.setY(240)*/
//修改刚开始显示的坐标的具体位置
.setX(0)
.setY(1723)
.setMoveType(MoveType.active, 0, 0)
// .setMoveStyle(500, new BounceInterpolator())
.setFilter(false)
.setViewStateListener(mViewStateListener)
.setPermissionListener(mPermissionListener)
.setDesktopShow(true)
.build();
布局我就不展示出来了,我们这边只要懂得怎么去绑定就行了。找到他们的控件id和绑定就行。
要实现悬浮,我们就要把下面的类和方法的代码复制过来。
private PermissionListener mPermissionListener = new PermissionListener() {
@Override
public void onSuccess() {
Log.d(TAG, "onSuccess");
}
@Override
public void onFail() {
Log.d(TAG, "onFail");
}
};
private ViewStateListener mViewStateListener = new ViewStateListener() {
@Override
public void onPositionUpdate(int x, int y) {
Log.d(TAG, "onPositionUpdate: x=" + x + " y=" + y);
}
@Override
public void onShow() {
Log.d(TAG, "onShow");
}
@Override
public void onHide() {
Log.d(TAG, "onHide");
}
@Override
public void onDismiss() {
Log.d(TAG, "onDismiss");
}
@Override
public void onMoveAnimStart() {
Log.d(TAG, "onMoveAnimStart");
}
@Override
public void onMoveAnimEnd() {
Log.d(TAG, "onMoveAnimEnd");
}
@Override
public void onBackToDesktop() {
Log.d(TAG, "onBackToDesktop");
}
};
因为这个项目还是功能简单的,就不把代码完整展示各位,有需要的可以看会开头的GitHub的连接去下载来学习,会更好,以及利用现有的代码,快速去实现自己的想要的需求。当然还有很多更好的方法,如果有更好的,可以留言,我们一起交流学习一下。