2015-05-17 1 views
2

Мое приложение имеет службу, которая регистрирует ScreenStateReceiver, которая создает обработчик, когда экран включен, и удаляет его, когда экран выключен.handler.removeCallbacksAndMessages не работает

Моя проблема в том, что handler.removeCallbacksAndMessages не работает, когда экран выключен. Я знаю, потому что я получаю несколько журналов от всех обработчиков, созданных всякий раз, когда экран включен.

Мой код:

public class mainActivity extends ActionBarActivity { 

static Button setButton; 
static Context activityContext; 

static SharedPreferences preferences; 
static SharedPreferences.Editor editor; 

static long handlerDelay; 
static Handler handler; 
static Runnable notificationRunnable; 
static Runnable lockRunnable; 
static String handlerType; 

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

    setButton = (Button) findViewById(R.id.setButton); 
    activityContext = this; 

    preferences = getSharedPreferences("values", Context.MODE_PRIVATE); 
    editor = preferences.edit(); 

    setButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      setButton.setEnabled(false); 
      setButton.setText("Done"); 
      editor.putBoolean("appSet", true).apply(); 

      handlerDelay = 10000; 
      editor.putLong("handlerDelay", handlerDelay).apply(); 

      editor.putString("handlerType", "Notification").apply(); 

      Intent intentService = new Intent(activityContext, mainActivity.service.class); 
      startService(intentService); 

      lockRunnable = new Runnable() { 
       @Override 
       public void run() { 
        Toast.makeText(activityContext, "Lock Handler", Toast.LENGTH_SHORT).show(); 
       } 
      }; 

      handler = new Handler(); 
      notificationRunnable = new Runnable() { 
       @Override 
       public void run() { 
        Toast.makeText(activityContext, "Notification Handler", Toast.LENGTH_SHORT).show(); 

        editor.putString("handlerType", "lock").apply(); 
        editor.putLong("handlerDelay", 10 * 1000).apply(); 
        handlerDelay = preferences.getLong("handlerDelay", 0); 
        handler.postDelayed(lockRunnable, handlerDelay); 
       } 
      }; 
      handler.postDelayed(notificationRunnable, handlerDelay); 
     } 
    }); 
} 

static public class screenStateReceiver extends BroadcastReceiver { 

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

     preferences = context.getSharedPreferences("values", Context.MODE_PRIVATE); 
     editor = preferences.edit(); 

     handler = new Handler(); 

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

      handler.removeCallbacksAndMessages(null); 
     } 

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

      handlerDelay = preferences.getLong("handlerDelay", 0); 
      editor.putLong("handlerDelay", handlerDelay).apply(); 

      handlerType = preferences.getString("handlerType", "notification"); 

      if(!(handlerDelay < 0)) { 
       if (handlerType.equals("notification")) { 
        notificationRunnable = new Runnable() { 
         @Override 
         public void run() { 
          Toast.makeText(context, "Notification Handler", Toast.LENGTH_SHORT).show(); 

          editor.putString("handlerType", "lock").apply(); 
          editor.putLong("handlerDelay", 10 * 1000).apply(); 
          handlerDelay = preferences.getLong("handlerDelay", 0); 
          handler.postDelayed(lockRunnable, handlerDelay); 
         } 
        }; 
        handler.postDelayed(notificationRunnable, handlerDelay); 
       } 

       else if(handlerType.equals("lock")) { 
        lockRunnable = new Runnable() { 
         @Override 
         public void run() { 
          if(handlerType.equals("lock")) { 
           Toast.makeText(context, "Lock Handler", Toast.LENGTH_SHORT).show(); 
           Log.e("lock handler", "Lock Handler"); 
           editor.putString("handlerType",null).apply(); 
          } 
         } 
        }; 
        handler.postDelayed(lockRunnable, handlerDelay); 
       } 
      } 
     } 
    } 
} 

static public class service extends Service { 

    BroadcastReceiver mReceiver; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     mReceiver = new screenStateReceiver(); 
     registerReceiver(mReceiver, filter); 
    } 

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

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 
} 
} 

приложение предполагается начать другой работоспособной после запуска второго работоспособной.

ответ

2

Это потому, что в BroadcastRecevier вы снова создаете обработчик. Вы должны удалить handler = new Handler();, в противном случае вы звоните removeCallbacks на другом Handler

+0

Приемник должен работать, даже если приложение выключено. Я думаю, что стирание этой строки сделает обработчик нулевым? –

+0

он мог. Тем не менее это не изменяет причины, по которым removeCallbacks не работает в вашем случае. – Blackbelt

+0

Хорошо, спасибо за помощь. Я инициализировал 'handler' в методе' onCreate' службы, и теперь он работает хорошо. –