为什么我不能从服务转到主屏幕

Why can't I go to home screen from service

运行 在 API KitKat(19) Pixel 2 上项目,目标 API 30.

我有一个服务在前台 运行,里面有这个处理程序,我可以通过我看到的 println 语句确认通常是 运行。

    Handler handler = new Handler(Looper.getMainLooper());
    private Runnable periodicUpdate = new Runnable() {
        @Override
        public void run() {
            handler.postDelayed(periodicUpdate, 1000 - SystemClock.elapsedRealtime()%500);
            currentApp = getForegroundApp();
            for (AppObject restrictedApp : allAppsRestricted) {
                System.out.println("restricted app: " + restrictedApp.packageName);
                System.out.println("foreground app: " + currentApp);
                if (currentApp.equals(restrictedApp.packageName)) {
                    showHomeScreen();
                    System.out.println("We're trying to go home");
                }
            }
        }
    };

我还可以通过我看到的“We're trying to go home”println 语句确认当前应用程序和前台应用程序包相同。 同样在我的服务中,我有一个 showHomeScreen() 方法。 showHomeScreen() 方法的代码理想地通过向用户显示主屏幕来将用户带出与受限应用程序匹配的前台应用程序。这是:

    public void showHomeScreen(){        
        Intent startMain = new Intent(Intent.ACTION_MAIN);
        startMain.addCategory(Intent.CATEGORY_HOME);
        startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        App.getContext().startActivity(startMain);
}

在我的服务之外,我有 App class 和我的 showHomeScreen() 正在调用的 getContext() 方法:

public class App extends Application {
    private static Context context;

    @Override
    public void onCreate() {
        super.onCreate();

        createNotificationChannel();
        App.context = getApplicationContext();
    }

    public static Context getContext() {
        return context;
    }
}

我已经看到我的 showHomeScreen() 方法的内容被发布为关于如何将用户带到主屏幕的多个问题的最佳答案,但是它一次也没有带我到主屏幕。我错过了什么?如何从我的服务中将用户带到主屏幕?

免责声明:除非您向用户提供某种管理或家长控制类型的服务,否则不应使用此权限。 但是...您可以通过后台服务启动您的 activity ,方法是将此权限放入您的清单中: <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

并通过将用户重新路由到设置以从您的后台服务启用您的应用的覆盖活动来引导用户启用系统覆盖: startActivity(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION));