保持活动在后台运行

时间:2017-01-12 12:16:33

标签: android android-service

我有一个计数器应用程序。它会在很长一段时间内(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)));
}

这可以保存我的数据,并在重新进入关闭的活动时恢复它。

3 个答案:

答案 0 :(得分:1)

我建议使用将在后台运行的服务,并修改计数器。 并通过任何一种方式将该计数器提供给Activity

  1. 制作public static变量
  2. 保存为共享偏好
  3. 并从onResume()方法更新您的活动用户界面,因此,只要您的活动进入前台,它就会显示更新后的计数

答案 1 :(得分:0)

您可以使用服务对事物进行计数,并通过事件总线发送更新或进行广播。然后在您的活动中,您可以在onStart()方法中订阅此事件/广播,并在onStop()中取消订阅。这将允许您在屏幕上显示活动时更新UI,并且在电话被锁定时不要过度使用电池而不更新UI。

不要尝试在用户不需要时保存您的活动。做一个好公民;)

答案 2 :(得分:-1)

在您的活动 onCreate 方法

上添加此项
 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);