如何在UI上保留更新的TextView(通过SharedPreferences)?

问题描述:

我有这个TextView(txtCounter),它每次运行服务时都会自动更新。所述进程运行平稳,但每当我关闭应用程序并再次打开它时,TextView不会显示实际变量,只有在我再次运行该服务后。如何在UI上保留更新的TextView(通过SharedPreferences)?

我知道我需要在onCreate(或onResume?)方法中做些什么,沿着从更新它的方法(在我的情况下,它是“UpdateUI”)接收更新的TextView的行,但我不'不知道是什么。

MainActivity:

public class MainActivity extends AppCompatActivity { 

public TextView txtCounter; 

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

    final Button startApp = (Button) findViewById(R.id.startApp); 
    final EditText timer = (EditText) findViewById(R.id.insertTimer); 

    assert startApp != null; 
    startApp.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Toast.makeText(MainActivity.this, "Countdown, Started", Toast.LENGTH_SHORT).show(); 

      Intent startMain = new Intent(Intent.ACTION_MAIN); 
      startMain.addCategory(Intent.CATEGORY_HOME); 
      startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      startActivity(startMain); 

      Intent intent = new Intent(MainActivity.this, MainService.class); 
      assert timer != null; 
      intent.putExtra("timer", timer.getText().toString()); 
      startService(intent); 

      Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, 1000); 

      registerReceiver(broadcastReceiver, new IntentFilter(MainService.BROADCAST_ACTION)); 
     } 
    }); 
} 

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { updateUI(intent); } 
}; 

private void updateUI(Intent intent) { 
    txtCounter = (TextView) findViewById(R.id.txtCounter); 

    SharedPreferences pref = getApplicationContext().getSharedPreferences("MyFile", MODE_PRIVATE); 
    int counter = pref.getInt("counter", 0); 
    SharedPreferences.Editor editor = pref.edit(); 
    editor.putInt("counter", ++counter); 
    editor.apply(); 

    assert txtCounter != null; 
    txtCounter.setText(String.valueOf(counter)); 
} 

@Override 
public void onDestroy() { 
    try { unregisterReceiver(broadcastReceiver); } catch (IllegalArgumentException ignored) {} 

    super.onDestroy(); 
} 
+0

嘿,我刚刚注意到,您不再需要传递一个'intent'到'updateUI()'因为我们没有从它读取任何东西。 – Shaishav

呼叫在onResume()下面的方法:

// read counter variable and update the textview 
private void updateTextView() { 
    SharedPreferences pref = getApplicationContext().getSharedPreferences("MyFile", MODE_PRIVATE); 
    int counter = pref.getInt("counter", 0); 
    setCounterTV(counter); 
} 


// Update the textview with a counter value 
private void setCounterTV(int counter) { 
    txtCounter = (TextView) findViewById(R.id.txtCounter); 
    assert txtCounter != null; 
    txtCounter.setText(String.valueOf(counter)); 
} 


// Method to be called by your service 
private void updateUI() { 
    SharedPreferences pref = getApplicationContext().getSharedPreferences("MyFile", MODE_PRIVATE); 
    int counter = pref.getInt("counter", 0); 
    SharedPreferences.Editor editor = pref.edit(); 
    editor.putInt("counter", ++counter); 
    editor.apply(); 

    setCounterTV(counter); 
} 
+0

这个方法与OP的'updateUI()'方法有什么不同? –

+0

@ Code-Apprentice'updateUI'也更新了他想从他的某个服务中反复调用的'counter' – Shaishav

+0

两个建议:1.使用一个方法名,这个方法区别于原来的'updateUI()'方法。 2.重构最初的'updateUI()'方法来调用这个方法来减少代码重复。 –