Android应用退到后台,点击悬浮窗返回应用


方案1:

        系统设置中找到对应的应用,打开权限“后台弹出界面”,然后直接调用startActivity()方法
        缺点:1、需要开启权限 2、部分手机没这个权限


方案2:

        判断app是否在前台,如果不在前台调用moveTaskToFront()方法
        上代码:判断是否在前台的方法

    private boolean isAppRunningForeground(Context context) {
        ActivityManager activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);

        assert activityManager != null;
        List<ActivityManager.RunningAppProcessInfo> runningAppProcessList = activityManager.getRunningAppProcesses();

        for (ActivityManager.RunningAppProcessInfo runningAppProcessInfo : runningAppProcessList) {
            if (runningAppProcessInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
                    && runningAppProcessInfo.processName.equals(context.getApplicationInfo().processName)) {
                return true;
            }
        }

        return false;
    }

将应用拉到前台
 

private Disposable disposable;

    private void moveAppToFront(Context context) {
        final ActivityManager activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
        assert activityManager != null;
        List<ActivityManager.RunningTaskInfo> runningTasks = activityManager.getRunningTasks(100);
        for (final ActivityManager.RunningTaskInfo runningTask : runningTasks) {
            assert runningTask.topActivity != null;
            if (runningTask.topActivity.getPackageName().equals(context.getPackageName())) {
                activityManager.moveTaskToFront(runningTask.id, 0);

                 disposable = Observable.intervalRange(1, 5, 0, 1, TimeUnit.SECONDS).subscribe(aLong -> {
                     if(isAppRunningForeground(context)){
                         Logger.i(TAG,"moveTaskToFront success");
                         disposable.dispose();
                     }else {
                         Logger.i(TAG,"moveTaskToFront start");
                         activityManager.moveTaskToFront(runningTask.id, 0);
                     }
                 });


                break;
            }
        }
    }

缺点:一次不一定成功,需求设置拉取次数反复去moveAppToFront();如果到了自己设定的次数还没成功,就会失败(目前测试没失败过)

方案3:

        参考跳转第三方应用方法,如果应用在后台调用下面方法将app拉到前台,这种方法回跳到app退到home之前到页面
 

Intent intent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
                                context.startActivity(intent);

缺点:部分手机拉起会慢几秒(测试效果与微信一样 )

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将一个应用点击变成一个悬浮窗,需要使用 Android 系统提供的 WindowManager 类和 View 类。 下面是一个示例代码: ```java public class MainActivity extends AppCompatActivity { private WindowManager mWindowManager; private View mFloatingView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 创建一个悬浮窗 mFloatingView = LayoutInflater.from(this).inflate(R.layout.floating_view, 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 = 100; // 将悬浮窗添加到窗口中 mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); mWindowManager.addView(mFloatingView, params); // 设置悬浮窗点击事件 mFloatingView.findViewById(R.id.btn_close).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 关闭悬浮窗 mWindowManager.removeView(mFloatingView); } }); } } ``` 在上面的代码中,首先我们创建了一个悬浮窗,并设置了它的初始位置。然后将悬浮窗添加到窗口中。最后设置了悬浮窗点击事件,当用户点击关闭按钮时,关闭悬浮窗。 需要注意的是,要将一个应用点击变成一个悬浮窗,需要在 AndroidManifest.xml 文件中添加 SYSTEM_ALERT_WINDOW 权限: ```xml <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> ``` 同时,需要在 Android 6.0 及以上版本中动态申请该权限。 以上就是将一个应用点击变成一个悬浮窗的基本步骤。如果需要更加复杂的悬浮窗效果,可以根据需要自行扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值