Android 保持活动在后台运行

Android 保持活动在后台运行,android,android-service,Android,Android Service,我有一个计数器应用程序。它在很长一段时间内(2-3小时)计算事物。在大多数情况下(10-15分钟,也许30分钟的增量),应用程序在我的口袋中保持断电状态。经过这么长时间,Android决定我不使用它,并关闭了它。所以我失去了所有的计数 在后台保持活动开放的最佳方式是什么?我注意到使用了wakelock(我不想这样做,因为不必要的电池消耗)和服务,这两种方式都很好,我在后台操作服务没有问题 服务是否可以更新活动的特定接口对象,基本上是否可以更新计数器屏幕上的计数 这项服务会阻止android关闭我

我有一个计数器应用程序。它在很长一段时间内(2-3小时)计算事物。在大多数情况下(10-15分钟,也许30分钟的增量),应用程序在我的口袋中保持断电状态。经过这么长时间,Android决定我不使用它,并关闭了它。所以我失去了所有的计数

在后台保持活动开放的最佳方式是什么?我注意到使用了wakelock(我不想这样做,因为不必要的电池消耗)和服务,这两种方式都很好,我在后台操作服务没有问题

服务是否可以更新活动的特定接口对象,基本上是否可以更新计数器屏幕上的计数

这项服务会阻止android关闭我的应用程序吗?我想我可以通过做这样的事情来解决这个问题

@Override
public void onCreate(){
    ....
    if(myService.isRunning())
        Intent i = new Intent(this, MyCounterActivity.class);
        startActivity(intent);
}
如果android在运行服务时关闭了我的活动,我的活动应该会重新启动。但是,我怎样才能从服务中获取信息,并将其返回到柜台视觉效果

编辑 我决定采用SharedReferences建议。所以要做到这一点,我需要如下的东西

共享引用单例

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 "";         
    }
}
活动类

@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)));
}

这将用于保存我的数据,并在重新进入关闭的活动时将其还原。

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


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

将此添加到您的活动中onCreate方法

 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

我建议使用将在后台运行并将修改您的计数器的服务。 并通过以下任一方式使该计数器可供活动使用

  • 创建一个
    公共静态变量
  • 保存到共享首选项中

  • 并通过onResume()方法更新您的活动UI,这样每当您的活动进入前台时,它都会显示更新的计数

    将计数存储在共享首选项中是的,您可以通过服务更新UI。即使应用程序被破坏,服务也可以正常工作。但服务会不断耗尽你的电池。我喜欢广播这个主意,它看起来更干净。只要我有广播接收器在运行,安卓就不会因为我的应用程序正在做事情而关闭它,等待广播?我一次数9件事,当我只想更新一个号码时,使用共享首选项似乎很麻烦。事实上,如果手机被锁定,你不需要更新你的用户界面,所以如果Android停止你的活动也没关系。这里的要点是,您的服务将是活动的,当您的活动将被重新创建时,您将能够订阅它并继续UI更新。此外,您还应该将您的服务置于前台或使用锁,以确保Android不会触碰它。请检查此-,Android.app.Notification)以了解详细信息,以及如何将其置于前台(方法startForeground(…)。你也可以使用前台通知来显示计数器更新。事实上,我认为这可能不是办法。我只是在想,我不想在屏幕被锁定的时候数数东西,我只想能够在关机前检索状态信息。但我不能保证onDestroy()会有时间激活。要添加号码,我想打开应用程序并使用界面。也许SharedReferences是一个不错的选择,尽管它很麻烦。你也可以使用onSaveInstanceState(…)来实现它。所以我把东西放在SharedReferences中,然后Android关闭了我的应用程序,因为它可以。当我按下主应用程序按钮时,由于应用程序被终止,将调用onResume()还是在onCreate()期间更新?是,如果活动在后台(未终止),将调用onResume(),如果活动被终止,则将调用onCreate()和onResume(),因此最好从
    onResume()更新UI
    如何使用侦听器确定更改了什么pref<代码>已更改共享首选项(共享首选项,字符串键)
    。假设我有3个首选项,我是否能够像这样检索值
    count1=pref.getInt(key,0)所以我可以做一系列的if语句来找出哪个偏好发生了变化,并相应地做一些必要的事情?您要更新多少个计数器?我认为aal需要在UI上更新,所以更新所有(尽管值是否更改),如果您的计数器经常更新(在您的问题中,您说不是),则使用广播