2013-06-25 3 views
0

Во-первых, я искал вопрос и нашел около 2-3 ссылок stackoverflow, но я не получаю определенного ответа. В основном, моему приложению нужно начать работу, когда телефон состыковался (любой тип дока) или когда экран off.I зарегистрирован вещательный приемник в манифесте:Dock и отключить широковещательную рассылку

<receiver android:name=".BootReciever"> 
<intent-filter > 
    <action android:name="android.intent.action.ACTION_DOCK_EVENT"/> 
    <action android:name="android.intent.action.SCREEN_OFF"/> 
</intent-filter> 
</receiver> 

И в моем классе:

public class BootReciever extends BroadcastReceiver{ 
@Override 
public void onReceive(Context context, Intent intent) { 
    String action = intent.getAction(); 
if(action.equals(Intent.ACTION_DOCK_EVENT)){ 
     //work for dock 
    } 

    if (action.equals(Intent.ACTION_SCREEN_OFF)) { 
     //work for screen off 
    } 

} 
} 

Но как оленья кожа work.My работа не делается в обоих случаях . Я читаю о том, что я должен делать это в сервисах, но так как я никогда не работал с моим собственным сервисом, и я упал andro id.developers.com немного дружелюбен, мне трудно заставить его работать. Может кто-нибудь сказать мне, как я могу это сделать? И мое приложение должно слушать его как долгое обслуживание. Так что даже когда мое приложение не находится в На переднем плане. Спасибо за вашу помощь.

ответ

0

SCREEN_OFF определенно должен быть зарегистрирован программно (см this link, например, It'a в protected intent):

public class MainActivity extends Activity { 
    BroadcastReceiver receiver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     try { 
      receiver = new BroadcastReceiver() { 
       @Override 
       public void onReceive(Context context, Intent intent) { 
        Log.d("TAG", "on or off"); 
       } 
      }; 
      IntentFilter filter = new IntentFilter(); 
      filter.addAction(Intent.ACTION_SCREEN_OFF); 
      Log.d("TAG", "Register receiver"); 
      registerReceiver(receiver, filter); 

     } catch (Exception e) { 
      Log.d("TAG", "Caught: " + e.getStackTrace()); 
     } 
    } 

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

     try { 
      Log.d("TAG", "Unregister receiver"); 
      unregisterReceiver(receiver); 

     } catch (Exception e) { 
      Log.d("TAG", "Caught: " + e.getStackTrace()); 
     } 
    } 
} 

Для ACTION_DOCK_EVENT я бы предположить, что-то другое существо неправильно. Может быть, это не работает из-за комбинации с ACTION_SCREEN_OFF, может быть, это связано с проблемой именования (я бы не ожидал относительного пути для .BootReciever, например, проверьте, работает ли полное квалифицированное имя класса).

Надеюсь, это поможет ... Приветствия!

+0

спасибо, что проверил оба. Предположим, что это будет первым, потому что я могу поместить это в свой класс приемника Broadcast и проверить его. Также я планировал намереваться заняться классом bootcomplete. Попробуем это скоро и дадим знать результат! Спасибо еще раз! – user2515577

+0

Я пробовал как ответ, так и второй ответ из [this] (http://stackoverflow.com/questions/12681884/android-broadcast-receiver-doesnt-receive-action-screen-on). Но он не работает для Мне кажется, мне трудно реализовать эту небольшую функцию? Я не знаю, что делать. Неправильно спрашивать, но может ли кто-нибудь предоставить мне пример источника приложения, который запускает службу, чтобы зарегистрировать экран и запустить блок код на экране? Спасибо и извините за неприятности ... – user2515577

+0

См. Полный пример работы выше (это рабочий пример из недавно созданного приложения) – Trinimon

0

Ресиверы для этих типов намерений должны быть зарегистрированы динамически в коде.

 this.receiver = new BootReceiver(); 
     final IntentFilter filter = new IntentFilter(); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     filter.addAction(Intent.ACTION_DOCK_EVENT); 
     this.registerReceiver(receiver, filter); 

Вы могли бы сделать это в какой-либо деятельности (в регистре OnStart(), отменить регистрацию в OnStop(), см visible lifetime раздел) или в вас объект приложения.

Проблема с динамической регистрацией, хотя ваше приложение должно быть запущено до того, как BootReceiver сможет получить намерения.

+0

Должен ли я помещать это в свою основную деятельность? И разве это не нужно, чтобы мое приложение запускалось вручную, в отличие от подключенного вещания с зарядным устройством, которое работает без запуска приложения вручную? Итак, должна ли моя работа регистрироваться в полной версии трансляции, а затем вызывать этот блок кода? Извините, что я новичок, и мне нужно получить каждую информацию в стиле новичков :) – user2515577

+0

Если у вас нет службы, и вам нужно для перезапуска определенного действия: да, зарегистрируйте получателя в 'onCreate()' этого действия и отмените его в 'onDestroy()'. – Trinimon

+0

Я попробовал как ответ, так и 2-й ответ из [this] (http://stackoverflow.com/questions/12681884/android-broadcast-receiver-doesnt-receive-action-screen-on). Но он не работает для Мне кажется, мне трудно реализовать эту небольшую функцию? Я не знаю, что делать. Неправильно спрашивать, но может ли кто-нибудь предоставить мне пример источника приложения, который запускает службу, чтобы зарегистрировать экран и запустить блок код после экрана? Спасибо и извините за неприятности .... – user2515577