Удалить плавающую кнопку из WindowManager при нажатии клавиши питания

В моем приложении есть служба, которая добавляет плавающую кнопку в WindowManager.

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

Я добавляю следующий код в свою службу, но он не работает!

Должен ли я добавить какое-либо разрешение или моя служба должна работать в фоновом режиме?!

public class Receiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) 
        {
            try{
                // Remove Floating Button from Window Manager
                MyWindowManager.removeView(floating_btn);
                // Stop Service
                stopSelf();
            }
            catch (Exception e)
            {
                //Log Error
            }   
        } 
    }

}

person Jessica    schedule 17.12.2014    source источник


Ответы (2)


Обычно вы объявляете приемник в своем манифесте. Что-то вроде этого

<receiver android:name="com.whatever.client.Receiver"
    <intent-filter>
        <action android:name="android.intent.action.SCREEN_OFF" />
    </intent-filter>
</receiver>

По какой-то причине (не знаю почему) вы не можете сделать это для SCREEN_OFF или SCREEN_ON. Таким образом, вы должны зарегистрировать его программно.

В качестве теста я сделал простое приложение.

public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
                    startService(new Intent(context, MyService.class));
                }
            }
        };

        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        registerReceiver(receiver, filter);
    }
}

С помощью простого сервиса.

public class MyService extends IntentService {
    public MyService() {
        super("MyService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Log.e("MyService", "Screen was turned off!");
    }
}
person mpkuth    schedule 18.12.2014

У меня такая же проблема, и я работаю над этим сейчас. В вашем случае это не сработало, потому что 1) ваш «stopSelf()» должен быть в классе, расширенном Service, а не BroadcastReceiver. 2) если вы хотите удалить представление из оконного менеджера, вам нужно каким-то образом передать (информацию о представлении) это представление из того метода, где вы его объявили, в метод, в котором вы хотите удалить это представление

person S.Drumble3    schedule 28.02.2016