2013-04-28 7 views
2

Я хочу реализовать сервис, который управляет экраном вкл/выкл. Для этого я создал BootReceiver, который вызывается при загрузке, и я начинаю свою службу. Однако, мой ScreenBroadcastReceiver никогда не называется, почему? Я зарегистрировал его не в том месте, я сделал это onCreate службы ... Пожалуйста, помогите мне, где я должен зарегистрировать его?Android BroadcastReceiver никогда не называется

Таким образом, приложение должно работать на фоне (без взаимодействия с пользователем), и оно будет регистрировать экран вкл и выкл. Я начал эти коды, но мне кажется, что мне нужно зарегистрировать свой трансляционный транслятор ScreenBroadcastReceiver. Если я сделаю это onCreate службы. я должен его изменить? моя конечная цель, чтобы запустить это приложение на фоне так, что приложение работает без взаимодействия с пользователем

Это BootReceiver, что называется в самом начале:

public class BootReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     Log.w("TAG", "BootReceiver"); 

     Intent service = new Intent(context, ScreenListenerService.class); 
      context.startService(service); 

    } 

} 

Это услуга:

public class ScreenListenerService extends Service { 


public void onCreate(){ 
    super.onCreate(); 
    Log.w("TAG", "ScreenListenerService---OnCreate "); 

      IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
    filter.addAction(Intent.ACTION_SCREEN_OFF); 
    BroadcastReceiver screenOnReceiver = new ScreenBroadcastReceiver(); 
    registerReceiver(screenOnReceiver, filter); 
} 


@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

     Log.w("TAG", "ScreenListenerService---onStart "); 

     return START_STICKY; 
    } 

@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    return null; 
} 

} 

Это ScreenBroadcastReceiver:

public class ScreenBroadcastReceiver extends BroadcastReceiver { 

    ///this part is never called, even if the screen is turned on/off. 
    public static boolean screenOff; 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 

      screenOff = true; 
      System.out.println("SCREEN TURNED OFF on BroadcastReceiver"); 
     } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 

      screenOff = false; 
      System.out.println("SCREEN TURNED ON on BroadcastReceiver"); 
     } 
     Intent i = new Intent(context, ScreenListenerService.class); 
     i.putExtra("screen_state", screenOff); 
     context.startService(i); 

    } 

} 

И manifes т:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.test" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="10" /> 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 
    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:name=".main" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 


     <service android:name=".ScreenListenerService"></service> 

     <receiver android:name=".BootReceiver"> 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
       <action android:name="android.intent.action.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE" /> 
      </intent-filter> 
     </receiver> 

    </application> 

</manifest> 

Update: Можно протестировать этот код в эмуляторе и дайте мне знать результат?

+0

Проверьте, правильно ли ваш сервис работает или нет в мобильных запущенных службах. –

+0

Я напечатал несколько журналов в своем сервисе, и они хорошо напечатаны. Но нет журнала для ScreenBroadcastReceiver. –

+0

После печати команды журнала в сервисе, boradcastreceiver никогда не вызывается (для него нет журнала). И коды обслуживания запускаются только один раз, чего я не хватает? –

ответ

5

Зарегистрируйте Ваш BroadcastReceiver в методе onStart()

@Override 
public void onStart(Intent intent, int startId) { 
    try { 

     IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     BroadcastReceiver mReceiver = new ScreenReceiver(); 
     registerReceiver(mReceiver, filter); 

    } catch (Exception e) { 
    } 
} 
+0

Я также попытался зарегистрировать его onStartCommand(), который предназначен для android> 2, но он не работал.BTW, действительно ли это имеет значение onStart()? Могу ли я использовать оба одновременно? –

+0

Я сделал это в одном из моих проектов, и он работает правильно. Если вам нужно, я пришлю вам образец кода. Просто укажите свой идентификатор почты. – Priyaranjan

+0

спасибо, я получил вашу электронную почту. Но, как вы объяснили, вы использовали операцию для запуска своего сервиса с помощью кнопки. В моем случае нет активности, которую он должен автоматически запускать через службу. –

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