【问题标题】:Always(never killed) visible icon over screen in android始终(从不杀死)android屏幕上的可见图标
【发布时间】:2014-04-29 07:20:29
【问题描述】:

我想在屏幕上创建图标,只听触摸它(不强制创建无用的通知) 3天后通过网络搜索并在IRC频道中询问并实施必须的示例:

Android app that runs on top of ALL other apps?

Creating a system overlay window (always on top)

我发现有一种 hacky 方法可以做到这一点,但没有人知道(智能任务栏开发人员除外) 我用大多数源示例安装智能任务栏,发现这个示例在没有通知栏的情况下被杀死,但智能任务栏从未被杀死,(我发现你甚至不能用常规任务杀手杀死它,比如 Android 任务管理器),只有一种方法可以杀掉这个图标,进入设置>应用>选择智能任务栏>强制停止。

我发现的另一件事是它永远不会进入后台,并且在 android 任务管理器中(在实时进程列表中)它被标记为可见并且你不能杀死它 有人可以帮助我如何创建一个始终可见且永远不会在屏幕上被杀死的图标

【问题讨论】:

    标签: android android-layout always-on-top


    【解决方案1】:

    在服务的onCreate 方法中调用setupNotification(),在服务的onDestroy 方法中调用clearNotification()

    private int SERVICE_NOTIFICATION = 1; // this should be unique for your app
    
    private void setupNotification()
    {
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2){
            Notification serviceNotification = new NotificationCompat.Builder(this)
                .setContentTitle("Your Service")
                .setContentText("Your Service is running in the background")
                .setSmallIcon(R.drawable.ic_launcher)
                .setPriority(NotificationCompat.PRIORITY_MIN)
                .setOngoing(true)
                .build();
            startForeground(SERVICE_NOTIFICATION, serviceNotification);
        }
        else{
            Notification serviceNotification = new Notification();
            serviceNotification.flags = Notification.FLAG_ONGOING_EVENT;
            startForeground(SERVICE_NOTIFICATION, serviceNotification);
        }
    }
    
    private void clearNotification()
    {
        stopForeground(true);
    }
    

    【讨论】:

    • sorry ,但是会发出通知,但我说的是无论如何我都不需要无用的通知,就像上面的答案一样,这不是有用的响应
    • 这正是智能任务栏 2 所做的。你甚至尝试过吗?这是低于 APIv18 的不可见通知。之后您必须收到通知。
    【解决方案2】:

    这是绝对可行的。您应该保持始终运行的服务。 并在创建该服务时,

    @Override
        public void onCreate() {
            super.onCreate();
    
            customView= new MYCustomView(MyService.this);
            WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                    WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
                    WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                    PixelFormat.TRANSLUCENT);
            params.gravity = Gravity.RIGHT | Gravity.TOP;
            WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
            wm.addView(customView, params);
        }
    

    这会将您的观点置于所有竞争之上。

    【讨论】:

    • 你有没有测试过你发布的内容,没有,你必须为前台服务创建通知,请仔细阅读帖子,它会进入后台并停止
    • 我在我的一个项目中实现了这一点。是的,您需要保留前台服务通知,因为您可能希望保持该服务处于活动状态
    • 如果服务被杀死,为了重新启动服务,您可能还需要 startSticky()。
    • 好的,我问的是智能任务栏开发者做什么(没有通知),所以你在这篇文章中的代码是无关的,
    猜你喜欢
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多