如何在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();
}
呼叫在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);
}
这个方法与OP的'updateUI()'方法有什么不同? –
@ Code-Apprentice'updateUI'也更新了他想从他的某个服务中反复调用的'counter' – Shaishav
两个建议:1.使用一个方法名,这个方法区别于原来的'updateUI()'方法。 2.重构最初的'updateUI()'方法来调用这个方法来减少代码重复。 –
嘿,我刚刚注意到,您不再需要传递一个'intent'到'updateUI()'因为我们没有从它读取任何东西。 – Shaishav