2017-01-12 106 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);