在后台保留 Activity 运行
Keep Activity running in background
我有一个计数器应用程序。它计算了很长一段时间(2-3 小时)的事情。在大多数时间里,以 10-15 分钟为增量,可能以 30 分钟为增量),应用程序在我的口袋中保持断电状态。经过这么长的持续时间 Android 决定我不使用它并关闭它。所以我失去了所有的计数。
保持 activity 在后台打开的最佳方法是什么?我注意到使用了唤醒锁,我不想这样做,因为不必要的电池耗尽,还有服务,这很好,我在后台运行服务没有问题。
服务可以更新 activity 的特定界面对象吗,基本上它可以更新我的计数器屏幕上的计数吗?
服务会阻止 android 关闭我的应用程序吗?我想我可以通过做这样的事情来解决这个问题...
@Override
public void onCreate(){
....
if(myService.isRunning())
Intent i = new Intent(this, MyCounterActivity.class);
startActivity(intent);
}
如果 android 在 运行 服务时关闭它,那应该会重新启动我的 activity。但是我怎样才能从服务中获取信息返回到柜台视觉效果?
编辑
我决定采用 sharedPreferences 推荐。所以要做到这一点,我需要像下面这样的东西?
SharedPreference 单例
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("%d", prefs.getInt(key, 0)));
}else if(key.compareTo(MyConstants.PREF_FIELD_M30_COUNT)){
m30CountTextView.setText(String.format("%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("%d", MySharedPreferences.getInstance().getInt(MyConstants.PREF_FIELD_M20_COUNT, 0)));
m30CountTextView.setText(String.format("%d", MySharedPreferences.getInstance().getInt(MyConstants.PREF_FIELD_M30_COUNT, 0)));
}
当重新进入关闭的 activity 时,这是否可以保存我的数据并恢复它。
您可以使用服务来计数,并通过事件总线发送更新或广播它。然后在你的 activity 中你可以在 onStart() 方法中订阅这个 events/broadcasts 并在 onStop() 中取消订阅。这将允许您在 activity 出现在屏幕上时更新 UI,并且不会过度使用电池并且在 phone 被锁定时不会更新 UI。
请不要在用户不需要时尝试保存您的activity。做个好公民 ;)
将此添加到您的 Activity onCreate 方法
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
我建议使用将 运行 在后台运行并修改您的 counter 的服务。
并通过
中的任一方式使 Activity 可以使用该计数器
- 制作一个
public static
变量
- 保存到共享首选项
并通过 onResume() 方法更新您的 activity UI,因此每当您的 activity 进入前台时,它都会向您显示 更新的计数.
我有一个计数器应用程序。它计算了很长一段时间(2-3 小时)的事情。在大多数时间里,以 10-15 分钟为增量,可能以 30 分钟为增量),应用程序在我的口袋中保持断电状态。经过这么长的持续时间 Android 决定我不使用它并关闭它。所以我失去了所有的计数。
保持 activity 在后台打开的最佳方法是什么?我注意到使用了唤醒锁,我不想这样做,因为不必要的电池耗尽,还有服务,这很好,我在后台运行服务没有问题。
服务可以更新 activity 的特定界面对象吗,基本上它可以更新我的计数器屏幕上的计数吗?
服务会阻止 android 关闭我的应用程序吗?我想我可以通过做这样的事情来解决这个问题...
@Override
public void onCreate(){
....
if(myService.isRunning())
Intent i = new Intent(this, MyCounterActivity.class);
startActivity(intent);
}
如果 android 在 运行 服务时关闭它,那应该会重新启动我的 activity。但是我怎样才能从服务中获取信息返回到柜台视觉效果?
编辑 我决定采用 sharedPreferences 推荐。所以要做到这一点,我需要像下面这样的东西?
SharedPreference 单例
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("%d", prefs.getInt(key, 0)));
}else if(key.compareTo(MyConstants.PREF_FIELD_M30_COUNT)){
m30CountTextView.setText(String.format("%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("%d", MySharedPreferences.getInstance().getInt(MyConstants.PREF_FIELD_M20_COUNT, 0)));
m30CountTextView.setText(String.format("%d", MySharedPreferences.getInstance().getInt(MyConstants.PREF_FIELD_M30_COUNT, 0)));
}
当重新进入关闭的 activity 时,这是否可以保存我的数据并恢复它。
您可以使用服务来计数,并通过事件总线发送更新或广播它。然后在你的 activity 中你可以在 onStart() 方法中订阅这个 events/broadcasts 并在 onStop() 中取消订阅。这将允许您在 activity 出现在屏幕上时更新 UI,并且不会过度使用电池并且在 phone 被锁定时不会更新 UI。
请不要在用户不需要时尝试保存您的activity。做个好公民 ;)
将此添加到您的 Activity onCreate 方法
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
我建议使用将 运行 在后台运行并修改您的 counter 的服务。 并通过
中的任一方式使 Activity 可以使用该计数器- 制作一个
public static
变量 - 保存到共享首选项
并通过 onResume() 方法更新您的 activity UI,因此每当您的 activity 进入前台时,它都会向您显示 更新的计数.