2010-08-24 2 views
2

У меня есть приложение, которое прослушивает экран и пользовательские намерения. Поскольку вы не можете регистрироваться для получения экрана из намерений из манифеста, я регистрирую их в службе.Это хорошая идея иметь услугу, чтобы зарегистрироваться только для намерений?

Нужно ли мне иметь всю услугу, чтобы я всегда получал уведомление о том, когда экран отключается, и пользователь открывает телефон? Кажется, на самом деле расточительно :-(

кода, который я использую в своей службе:..

@Override 
public void onCreate() { 
    super.onCreate(); 
    Log.d(TAG, "Service created."); 
    // register receiver that handles user unlock and screen off logic 
    IntentFilter filter = new IntentFilter(Intent.ACTION_USER_PRESENT); 
    filter.addAction(Intent.ACTION_SCREEN_OFF); 
    BroadcastReceiver mReceiver = new ScreenReceiver(); 
    registerReceiver(mReceiver, filter); 
} 

ответ

1

Пожалуйста, обратите внимание на то, что вы в целом пытаетесь сделать, и другой способ сделать это.

Да, единственный способ контролировать события - активно регистрироваться. Это очень интенционально, потому что они очень заманчивы для приложений, чтобы думать, о чем они хотят рассказать, и заканчивая запуском приложений, каждый раз, когда пользователь включает или выключает их экран, очень плохой пользовательский опыт.

Учитывая, что я могу сказать вам прямо сейчас, что нет никакого способа, вы можете гарантии, что вы будете видеть эти события, к тому же с помощью сервиса, который всегда работает и использовал startForeground(), чтобы предотвратить себя от будучи убитым. Очевидно, что это не то, что вы хотите сделать, если ваше приложение не делает что-то, что пользователь очень намеренно заботится о том, чтобы бежать за ними, когда они решат, что это должно быть.

Итак ... что вы пытаетесь достичь?

+0

Да, я понимаю, что это очень интенционально. Приложение, которое я создаю, очень открыто из-за того, зачем ему это нужно, и то, что он выполняет в userlogin, является очень тривиальной задачей. – NPike

2

Вы можете использовать класс широковещательного приемника вещательного приемник может быть автономной частью приложения

+0

Так что даже если мое приложение не работает, и нет службы, я все равно получаю эти намерения? – NPike

+0

Да. Вещание отправляется на каждое намерение, зарегистрированное в манифесте, для принятия этой трансляции. Ваше приложение может ТОЛЬКО состоять из широковещательного приемника, если это то, что вы хотите. Вам не нужно приложение, услуга или что-то еще. – Falmarri

+0

Могу ли я зарегистрировать приемник вещания в своем основном действии? (Для намерений, описанных выше, которые вы не можете зарегистрировать в манифесте) – NPike

0

Поскольку вы не можете зарегистрироваться, чтобы получить экран, фактически из манифеста

вы уверены, что? в документации не описано, что ограничение , тогда как для ACTION_BATTERY_CHANGED, ACTION_CONFIGURATION_CHANGED и ACTION_TIME_TICK.

Пожалуйста, используйте зарегистрированный манифест BroadcastReceiver, если это вообще возможно.

+0

Вы не можете зарегистрироваться для них. Это очень преднамеренно, так как наличие множества приложений, которые нужно запускать каждый раз, когда вы включаете/выключаете экран, быстро приведет к действительно грубому опыту. – hackbod

+0

Невозможно обновить документацию, чтобы отразить это? –

+1

@ Кристофер: я написал об этом на b.android.com, ~ 10 часов назад. – CommonsWare

2

Action_User_Present может быть зарегистрирован в файле манифеста.

0

Это код основной андроид.

mUserPresentIntent = new Intent(Intent.ACTION_USER_PRESENT); 
mUserPresentIntent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING 
| Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 

и

mScreenOnIntent = new Intent(Intent.ACTION_SCREEN_ON); 
mScreenOnIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND); 
mScreenOffIntent = new Intent(Intent.ACTION_SCREEN_OFF); 
mScreenOffIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND); 

Мы должны зарегистрировать фильтр программно, когда ядро ​​отправить с флагом "FLAG_RECEIVER_REGISTERED_ONLY".

Смежные вопросы