2017-01-12 105 views
0

我有一个计数器应用程序。它在很长一段时间内(2-3小时)计算事情。在大多数时间里,对于10-15,也许30分钟的增量),应用程序仍然处于关闭状态。经过这段漫长的时间后,Android决定不使用它并关闭它。所以我失去了所有的计数。保持活动在后台运行

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

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

并将该服务阻止android关闭我的应用程序?我以为我可以做这样的事情本战...

@Override 
public void onCreate(){ 
    .... 
    if(myService.isRunning()) 
     Intent i = new Intent(this, MyCounterActivity.class); 
     startActivity(intent); 
} 

这应该开始我的活动回来,如果机器人将其关闭,同时运行的服务。但是,我怎么能从服务中获得信息回到柜台的视觉效果呢?

编辑 我决定使用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("$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))); 
} 

将这项工作,以节省我的数据并重新进入该得到的关断活动时恢复。

+2

分享偏好的店铺数量 – Pavya

+0

是的,你可以从服务更新UI。即使应用程序被破坏,该服务也能正常工作。但服务将继续耗尽您的电池。 –

回答

1

我建议使用将在后台运行的服务,并会修改计数器。 并做出反可供活性受到的方式

  1. 做一个public static变量
  2. 保存到共享偏好

,并从的onResume()方法更新活动UI,所以每当你活动将进入前景,它会告诉你更新的计数

+0

,所以我把东西sharedpreferences,然后Android关闭我的应用程序,因为它可以。当我压制主应用程序按钮,因为应用程序被杀害,onResume()被调用或应该更新onCreate()期间? –

+0

是如果活动在后台(而不是被杀死)onResume()将被调用, 如果活动被杀死,然后onCreate()和onResume()都会被调用,所以更好地从'onResume()'更新UI' – Gaurav

+0

我如何使用监听器来确定哪个pref被改变了? 'onSharedPreferenceChanged(SharedPreference pref,String key)'。假设我有3个偏好,我将能够检索像这样的值 'count1 = pref.getInt(key,0);'所以我可以做一系列的if语句来找出哪些偏好发生了变化,因此? –

0

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

而且请不要尝试保存您的活动时,用户不需要它。做一个好公民;)

+0

我喜欢这个想法与广播,它似乎更干净。只要我有广播接收机运行比android不会关闭我的应用程序,因为它正在做的东西,等待广播?我一次数9件东西,使用共享偏好似乎很麻烦,当我想要做的就是更新一个数字。 –

+0

其实你不需要更新你的用户界面,如果手机被锁定,所以它是好的,如果Android杀死你的活动。这里的要点是你的服务将会是活着的,当你的活动被重新创建时,你将能够订阅它并继续UI更新。此外,您应该使您的服务前景或使用锁定,以确保Android不会触及它。 – Grimmy

+0

检查此 - https://developer.android.com/reference/android/app/Service.html#startForeground(int,android.app.Notification)的详细信息,如何使它前景(方法startForeground(...) )。您也可以使用前台通知来显示柜台更新。 – Grimmy

0

你的活动添加此的onCreate方法

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