Всегда (никогда не убитый) видимый значок над экраном в Android

Я хочу создать иконку на экране, чтобы просто прослушивать прикосновения к ней (без необходимости создавать бесполезные уведомления) после 3-х дней поиска по сети и запроса в каналах IRC и реализации таких примеров:

Android-приложение, которое работает поверх ВСЕХ других приложений?

Создание системного оверлея (всегда сверху)

я обнаружил, что есть хакерский способ сделать это, но никто не знает его (кроме разработчиков Smart Taskbar). Я устанавливаю Smart Taskbar с большинством исходных примеров и обнаружил, что эти примеры убиты без панели уведомлений, но smart Taskbar никогда не убивал (я обнаружил, что вы можете даже не убить его с помощью обычного убийцы задач, как Android Task Manager), есть только один способ убить этот значок, перейдите в настройки> приложения> выберите умную панель задач>Force stop.

Еще одна вещь, которую я обнаружил, это то, что она никогда не переходит в фоновый режим, а в диспетчере задач Android (в списке процессов в реальном времени) она помечается как видимая, и вы не можете убить ее. Кто-то может мне помочь, как я могу создать иконку, которая всегда видна и никогда не убивал на экране

2 ответа

Решение

Вызов setupNotification() в вашем сервисе onCreate метод и clearNotification() в вашем сервисе onDestroy метод.

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);
}

Это абсолютно выполнимо. Вы должны поддерживать постоянно работающий сервис. и в создании этого сервиса,

@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);
    }

Это поместит ваш взгляд поверх всех соперников.

Другие вопросы по тегам