2015-12-25 60 views
0

我在论坛中找到了代码,该代码允许我在关闭设备屏幕时关闭所有活动并打开另一个活动。我在sharedpreference中存储了一个布尔值,当它为true时,必须启动BroadcastReceiver。问题是,即使布尔值为false,BroadcastReceiver也会启动。Android BroadcastReceiver完成并开放活动

public class Impostazioni extends AppCompatActivity { 
private BroadcastReceiver mReceiver = null; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.impostazioni); 

Switch swChiusura = (Switch) findViewById(R.id.switch1); 
SharedPreferences settings_chiusura = getSharedPreferences(CHIUSURA_AUTOMATICA, Context.MODE_PRIVATE); 
    boolean vero_falso = settings_chiusura.getBoolean("pref_chiusura_automatica", false); 
    if(vero_falso){ 
     swChiusura.setChecked(true); 
    }else{ 
     swChiusura.setChecked(false); 
    } 
swChiusura.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if(isChecked){ 
       SharedPreferences settings_percorso = getSharedPreferences(CHIUSURA_AUTOMATICA, Context.MODE_PRIVATE); 
       SharedPreferences.Editor prefEditor = settings_percorso.edit(); 
       prefEditor.putBoolean("pref_chiusura_automatica", true); 
       prefEditor.apply(); 
      }else{ 
       SharedPreferences settings_percorso = getSharedPreferences(CHIUSURA_AUTOMATICA, Context.MODE_PRIVATE); 
       SharedPreferences.Editor prefEditor = settings_percorso.edit(); 
       prefEditor.putBoolean("pref_chiusura_automatica", false); 
       prefEditor.apply(); 
       //disable reciver 
       if (mReceiver != null) { 
        unregisterReceiver(mReceiver); 
        mReceiver = null; 
       } 
      } 
     } 
    }); 

@Override 
protected void onPause() { 
    super.onPause(); 
    SharedPreferences settings_chiusura = getSharedPreferences(CHIUSURA_AUTOMATICA, Context.MODE_PRIVATE); 
    boolean vero_falso = settings_chiusura.getBoolean("pref_chiusura_automatica", false); 
    if (vero_falso) { 
     /** 
     * initialize receiver 
     */ 
     final IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     mReceiver = new ScreenReceiver(); 
     registerReceiver(mReceiver, filter); 

     // when the screen is about to turn off 
     if (ScreenReceiver.wasScreenOn) { 
      // this is the case when onPause() is called by the system due to a screen state change 
      Log.e("MYAPP", "SCREEN TURNED OFF"); 
     } 
    } else { 
     if (mReceiver != null) { 
      unregisterReceiver(mReceiver); 
      mReceiver = null; 
     } 
    } 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    if (mReceiver != null) { 
     unregisterReceiver(mReceiver); 
     mReceiver = null; 
    } 
} 

接收机

public class ScreenReceiver extends BroadcastReceiver { 

public static boolean wasScreenOn = true; 

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

    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
     intent = new Intent(context, Login.class); 
     intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(intent); 
     wasScreenOn = false; 
    } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
     wasScreenOn = true; 
    } 
} 
} 

回答

0

这可能是一个坏的解决方案,但是,尽量把你的SharedPreferences布尔到ScreenReceiver的if块。因为知道,当你的屏幕熄灭时它不需要布尔值。我的意思是:

if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
    if(sharedPref.getBoolean(yourBoolean)){ //...