android 从桌面点击APP的悬浮窗返回到APP前台
- 在AndroidManifest.xml文件中添加以下权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
- 创建一个悬浮窗Service,用来显示悬浮窗。在Service的onCreate()方法中创建悬浮窗,并设置悬浮窗的布局和参数。
public class FloatingWindowService extends Service {
private WindowManager mWindowManager;
private View mFloatingView;
@Override
public void onCreate() {
super.onCreate();
mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
mFloatingView = LayoutInflater.from(this).inflate(R.layout.floating_window, null);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.START;
params.x = 0;
params.y = 0;
mWindowManager.addView(mFloatingView, params);
}
@Override
public void onDestroy() {
super.onDestroy();
if (mFloatingView != null) {
mWindowManager.removeView(mFloatingView);
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
- 在MainActivity中添加代码,用来启动悬浮窗Service,并在悬浮窗上添加点击事件,用来返回到APP前台。
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_CODE_FLOATING_WINDOW = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnOpenFloatingWindow = findViewById(R.id.btn_open_floating_window);
btnOpenFloatingWindow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(MainActivity.this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
startActivityForResult(intent, REQUEST_CODE_FLOATING_WINDOW);
} else {
startFloatingWindowService();
}
}
});
}
private void startFloatingWindowService() {
Intent intent = new Intent(this, FloatingWindowService.class);
startService(intent);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_FLOATING_WINDOW) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Settings.canDrawOverlays(this)) {
startFloatingWindowService();
}
}
}
}
- 在悬浮窗的布局文件中添加一个Button,用来返回到APP前台。
<Button
android:id="@+id/btn_back_to_app"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Back to App" />
- 在悬浮窗Service的onCreate()方法中,为Button添加点击事件,用来返回到APP前台。
public class FloatingWindowService extends Service {
private WindowManager mWindowManager;
private View mFloatingView;
@Override
public void onCreate() {
super.onCreate();
mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
mFloatingView = LayoutInflater.from(this).inflate(R.layout.floating_window, null);
// ...
Button btnBackToApp = mFloatingView.findViewById(R.id.btn_back_to_app);
btnBackToApp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
});
mWindowManager.addView(mFloatingView, params);
}
// ...
}
``
原文地址: https://www.cveoy.top/t/topic/clgR 著作权归作者所有。请勿转载和采集!