我有一个计数器应用程序。它会在很长一段时间内(2-3小时)计算。在大多数情况下,对于10-15,可能是30分钟的增量),应用程序在我的口袋中保持断电状态。经过这么长时间的Android决定我没有使用它并关闭它。所以我失去了所有的计数。
在后台保持活动开放的最佳方法是什么?我注意到使用了唤醒锁,因为不必要的电池耗尽而我不想这样做,服务也很好,我在后台操作服务没有问题。
服务可以更新活动的特定界面对象,基本上可以更新我的计数器屏幕上的计数吗?
该服务会阻止Android关闭我的应用程序吗?我认为我可以通过做这样的事情来对抗这个......
@Override
public void onCreate(){
....
if(myService.isRunning())
Intent i = new Intent(this, MyCounterActivity.class);
startActivity(intent);
}
如果android在运行服务时关闭它,那应该开始我的活动。但是,我如何从服务中获取信息回到柜台视觉效果?
修改的 我决定使用sharedPreferences建议。所以要做到这一点,我需要像下面这样的东西?
SharedPreference Singleton
public class MySharedPreference {
private static MySharedPreference mySharedPreference;
private SharedPreferences sharedPreferences;
public static MySharedPreference getInstance(Context context) {
if (mySharedPreference == null) {
mySharedPreference = new mySharedPreference(context);
}
return mySharedPreference;
}
private mySharedPreference(Context context) {
sharedPreferences = context.getSharedPreferences(MyConstants.PREF_FILE_KEY, Context.MODE_PRIVATE);
}
public void saveData(String key,String value) {
SharedPreferences.Editor prefsEditor = sharedPreferences.edit();
prefsEditor .putString(key, value);
//prefsEditor.commit();
prefsEditor.apply();
}
public String getData(String key) {
if (sharedPreferences!= null) {
return sharedPreferences.getString(key, "");
}
return "";
}
}
Activity.class
@Override
public void onCreate(){
SharedPreferences.OnSharedPreferenceChangeListener listener;
listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if(key.compareTo(MyConstants.PREF_FIELD_M20_COUNT)){
m20CountTextView.setText(String.format("$1%d", prefs.getInt(key, 0)));
}else if(key.compareTo(MyConstants.PREF_FIELD_M30_COUNT)){
m30CountTextView.setText(String.format("$1%d", prefs.getInt(key, 0)))
}
}
};
MySharedPreference.getInstance().registerOnSharedPreferenceChangeListener(listener);
button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
m20Count++;
MySharedPreferences.getInstance().saveData(MyConstants.PREF_FIELD_M20_COUNT, m20Count);
}
});
button2 = (Button) findViewById(R.id.button2);
button2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
m30Count++;
MySharedPreferences.getInstance().saveData(MyConstants.PREF_FIELD_M30_COUNT, m30Count);
}
});
}
@Override
public void onResume(){
updateInterfaceWithPreferences();
}
private void updateInterfaceWithPreferences(){
m20CountTextView.setText(String.format("$1%d", MySharedPreferences.getInstance().getInt(MyConstants.PREF_FIELD_M20_COUNT, 0)));
m30CountTextView.setText(String.format("$1%d", MySharedPreferences.getInstance().getInt(MyConstants.PREF_FIELD_M30_COUNT, 0)));
}
这可以保存我的数据,并在重新进入关闭的活动时恢复它。
答案 0 :(得分:1)
我建议使用将在后台运行的服务,并修改计数器。 并通过任何一种方式将该计数器提供给Activity
public static
变量并从onResume()方法更新您的活动用户界面,因此,只要您的活动进入前台,它就会显示更新后的计数。
答案 1 :(得分:0)
您可以使用服务对事物进行计数,并通过事件总线发送更新或进行广播。然后在您的活动中,您可以在onStart()方法中订阅此事件/广播,并在onStop()中取消订阅。这将允许您在屏幕上显示活动时更新UI,并且在电话被锁定时不要过度使用电池而不更新UI。
请不要尝试在用户不需要时保存您的活动。做一个好公民;)
答案 2 :(得分:-1)
在您的活动 onCreate 方法
上添加此项 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);