2015-08-17 2 views
0

В моем приложении для Android я регистрирую несколько широковещательных приемников, которые включают в себя: WiFi, экран и активность. Приложение работает плавно на Moto g и Samsung G3, но отключилось включение/выключение экрана, подключение/отключение Wi-Fi и события активности на другом телефоне после трех дней плавного выполнения. Поскольку приложение находится на пользовательском телефоне, я не знаю модель/сделать. Помимо обнаружения события, обычное определение местоположения работает нормально (это запланировано каждые 10 минут). Любые идеи, что может быть неправильным? В противном случае на моих тестовых устройствах все еще работает нормально (тестирование продолжается более 2 недель). Для справки ниже приведен код только для датчика экрана. Кроме того, я пытался зарегистрировать приемник в onstartcommand, но он не работает на моих тестовых устройств (см комментируемой части в screenService)правильный способ регистрации широковещательного приемника android

MainActivity:

Intent intentscreen = new Intent(getApplicationContext(), ScreenService.class); 
startService(intentscreen); 

ScreenService:

private final BroadcastReceiver mybroadcast = new ScreenReceiver(); 
    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 
     /* if (intent!=null) 
     { 
      IntentFilter screenStateFilter = new IntentFilter(); 
      screenStateFilter.addAction(Intent.ACTION_SCREEN_ON); 
      screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF); 
      registerReceiver(mybroadcast, screenStateFilter); 
     }*/ 
     return START_STICKY; 
    } 
    @Override 
    public void onCreate(){ 
     super.onCreate(); 

     IntentFilter screenStateFilter = new IntentFilter(); 
     screenStateFilter.addAction(Intent.ACTION_SCREEN_ON); 
     screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF); 
     registerReceiver(mybroadcast, screenStateFilter); 
    } 

    @Override 
    public void onDestroy() 
    { 
     super.onDestroy(); 
     unregisterReceiver(mybroadcast); 
    } 
} 

ScreenReceiver:

public class ScreenReceiver extends BroadcastReceiver { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
       Log.i("Check","Screen went OFF"); 
      } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
       Log.i("Check","Screen went ON"); 

     } 
    } 

ответ

1

Эти BroadcastReceivers должны быть зарегистрированы йу namically

android.intent.action.SCREEN_ON 
android.intent.action.SCREEN_OFF 
android.intent.action.BATTERY_CHANGED 
android.intent.action.CONFIGURATION_CHANGED 
android.intent.action.TIME_TICK 

EDIT: MainActivity.java пакет com.kishore_kumar.stackoverflow;

import android.content.BroadcastReceiver; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 

public class MainActivity extends AppCompatActivity { 

BroadcastReceiver mybroadcast; 
IntentFilter screenStateFilter; 
static boolean alreadyListening = false; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mybroadcast = new ScreenBroadcastReceiver(); 
    screenStateFilter = new IntentFilter(); 
    screenStateFilter.addAction(Intent.ACTION_SCREEN_ON); 
    screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF); 
If (!alreadyListening) 
{ 
    registerReceiver(mybroadcast, screenStateFilter); 
alreadyListening = true; 
} 


} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 
} 

ScreenBroadcastReceiver.java

package com.kishore_kumar.stackoverflow; 


import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 


public class ScreenBroadcastReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
     Log.e("Check", "Screen went OFF"); 
    } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
     Log.e("Check","Screen went ON"); 
    } 
} 
} 
+0

Благодарим вас за ответ. Вы видите код выше и видите, есть ли ошибка? Приложение работает отлично на Samsung S3, Moto g, Nexus, но перестает получать экран/Wi-Fi/мероприятие (после трех гладких дней) на фоне примечаний Samsung. Любое предложение? –

+0

Почему бы вам не попробовать использовать 'intent.getStringExtra' вместо' намерения.getAction'. Это работало для меня в предыдущем приложении, которое я строил, но в том, что я использовал приемник вызовов, но насколько он может быть другим? –

+0

Как я могу использовать его для экрана, например? Кроме того, код выглядит нормально? Я немного потерял, почему это происходит, по каким-либо причинам? –

-2

Вы можете сделать это так:

Define приемник в манифеста файла:

<receiver android:name=".ScreenOnOffListener" > 
    <intent-filter> 
    <action android:name="android.intent.action.SCREEN_OFF" /> 
    <action android:name="android.intent.action.SCREEN_ON" /> 
    </intent-filter> 
</receiver> 

Теперь добавьте класса которого расширяетBroadcastReceiver:

public class ScreenOnOffListener extends BroadcastReceiver { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
       Log.i("Check","Screen OFF"); 
      } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
       Log.i("Check","Screen ON"); 
      } 
    } 

Надеется, что это поможет вам.

+0

Это не сработает, вы не можете зарегистрировать android.intent.action.SCREEN_OFF и android.intent.action.SCREEN_ON не программно - проверьте документацию. – lukewm

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