2017-01-12 9 views
0

У меня есть приложение-счетчик. Он считает вещи в течение длительного периода времени (2-3 часа). В течение большей части времени, для 10-15, может быть 30-минутный прирост), приложение остается в выключенном состоянии в моем кармане. После этого долгого времени Android решает, что я не использую его и не закрываю. Поэтому я теряю все свои соображения.Работает в фоновом режиме

Что является лучшим способом сохранить активность в фоновом режиме? Я замечал использование либо wakelock, чего я не хочу делать из-за ненужного утечки батареи, и услуг, которые были бы хороши, у меня нет проблем с обслуживанием службы в фоновом режиме.

Могут ли сервисы обновлять определенные объекты интерфейса, в основном, можно обновить счетчик на моем счетчике?

и будет ли служба андроида отключать мое приложение? Я предполагаю, что я могу бороться с этим делать что-то вроде этого ...

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

Это должно начать свою деятельность обратно, если андроид отключает его во время работы службы. Но тогда как я могу получить информацию от службы обратно на счетчик?

Редактировать Я решил пойти с рекомендацией 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))); 
} 

Будет ли это работать, чтобы сохранить данные и восстановить его при повторном входе в деятельность, которая получает отсечку.

+2

Кол-во магазинов в общем предпочтении – Pavya

+0

Да, вы можете обновить интерфейс от сервиса.Даже если приложение будет уничтожено, служба будет работать нормально. Но сервис будет продолжать разряжать батарею. –

ответ

1

Я предлагаю использовать сервис, который будет работать в фоновом режиме и будет изменять свой счетчик. И сделать этот счетчик доступен для деятельности любых из способов

  1. Сделать public static переменной
  2. Сохранить в общую предпочтительность

и обновить активность UI от onResume() метода, поэтому всякий раз, когда ваш активность войдет на передний план, он покажет вам обновленный счет.

+0

, поэтому я помещаю вещи в sharedpreferences, то Android отключает мое приложение, потому что оно может. Когда я подавляю основную кнопку приложения, так как приложение было убито, вызывается onResume() или должен обновляться во время onCreate()? –

+0

yes Если активность в фоновом режиме (не убита) onResume() вызывается, Если активность была убита, то вызовы onCreate() и onResume() будут вызваны, поэтому лучше обновить интерфейс от 'onResume()' – Gaurav

+0

, как это сделать использовать прослушиватель, чтобы определить, какой префикс был изменен? 'onSharedPreferenceChanged (SharedPreference pref, String key)'. Допустим, у меня есть 3 варианта, я мог бы получить значение, подобное этому 'count1 = pref.getInt (key, 0);' поэтому я мог бы сделать ряд утверждений if, чтобы найти, какое предпочтение было изменено, и делать то, что необходимо соответственно? –

0

Вы можете использовать сервис для подсчета вещей и отправки обновлений через автобус или трансляцию. Затем в своей деятельности вы можете подписаться на эти события/трансляции в методе onStart() и отказаться от подписки на onStop(). Это позволит вам обновлять пользовательский интерфейс, когда активность находится на экране, и не перезаряжать аккумулятор и не обновлять пользовательский интерфейс при блокировке телефона.

И, пожалуйста, не попытаться сохранить вашу деятельность, когда пользователь не нуждается в ней. Быть хорошим гражданином;)

+0

Мне нравится эта идея с трансляцией, кажется более чистой. До тех пор, пока у меня есть широковещательный приемник, чем андроид, не выключит мое приложение, потому что он делает вещи, ожидая трансляции? Я считаю 9 вещей за раз, использование общих настроек кажется громоздким, когда все, что я хочу сделать, это обновить номер. –

+0

На самом деле вам не нужно обновлять свой интерфейс, если телефон заблокирован, поэтому все в порядке, если Android убьет вашу активность. Главное здесь, что ваш сервис будет жив, и когда ваша деятельность будет воссоздана, вы сможете подписаться на нее и продолжить обновление пользовательского интерфейса. Также вы должны сделать свой сервис переднего плана или использовать блокировку, чтобы убедиться, что 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); 

 Смежные вопросы

  • Нет связанных вопросов^_^