Как передать параметр из действия в службу ... когда пользователь останавливает службу - PullRequest
3 голосов
/ 11 января 2011

У меня есть активность с флажком: если флажок снят, остановите службу.это фрагмент моего кода активности:

    Intent serviceIntent = new Intent();
    serviceIntent.setAction("com.android.savebattery.SaveBatteryService");

    if (*unchecked*){
        serviceIntent.putExtra("user_stop", true);
        stopService(serviceIntent);

, когда я останавливаю службу, я передаю параметр «user_stop», чтобы сказать службе, которая была остановлена ​​пользователем, а не системой (для низкогопамять).

теперь я должен прочитать переменную "user_stop" в void onDestroy моего сервиса:

public void onDestroy() {
super.onDestroy();

Intent recievedIntent = getIntent(); 
boolean userStop= recievedIntent.getBooleanExtra("user_stop");

    if (userStop) {
       *** notification code ****

но это не работает!Я не могу использовать getIntent () в onDestroy!

есть предложения?

спасибо

Симона

Ответы [ 4 ]

6 голосов
/ 11 января 2011

Я вижу два способа сделать это:

  1. Использование общих настроек.
  2. Использование местных трансляций.

Первый подход - это простой и понятный способ.Но это не очень гибко.В основном вы делаете:

  • a.Установите для общего предпочтения «остановка пользователя» значение true.
  • b.Остановить службу
  • c.В вашей службе в onDestroy проверьте, что является значением предпочтения «пользовательская остановка».

Другой подход более эффективен, но требует больше кода.а.Определите строковую константу в вашем классе обслуживания:

final public static string USER_STOP_SERVICE_REQUEST = "USER_STOP_SERVICE".
  • b.Создайте внутренний класс BroadcastReceiver class:

    public class UserStopServiceReceiver extends BroadcastReceiver  
    {  
        @Override  
        public void onReceive(Context context, Intent intent)  
        {  
            //code that handles user specific way of stopping service   
        }  
    }
    
  • c.Зарегистрируйте этот получатель в методе onCreate или onStart:

    registerReceiver(new UserStopServiceReceiver(),  newIntentFilter(USER_STOP_SERVICE_REQUEST));
  • d.Из любого места, где вы хотите остановить свою службу:

    context.sendBroadcast(new Intent(USER_STOP_SERVICE_REQUEST));

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

1 голос
/ 11 января 2011

Я не думаю, что полагаться на onDestroy () - это хорошо.Есть несколько подходов, которые вы можете использовать.

  1. предлагает связать сервис, чтобы вы могли написать свое уведомление пользователя в onUnbind http://developer.android.com/guide/topics/fundamentals.html#servlife

  2. Другой вариант (не уверен, что это работает)опубликуйте вашу переменную в SharedPreferences и получите ее из onDestroy ().[Необходимо проверить, работает ли это в режиме отладки или сообщениях LogCat.

0 голосов
/ 28 мая 2013

// Вы можете передать параметр следующим простым способом: -

Intent serviceIntent = new Intent(this,ListenLocationService.class); 
   serviceIntent.putExtra("From", "Main");
   startService(serviceIntent);
//and get the parameter in onStart method of your service class

    @Override
public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);
     Bundle extras = intent.getExtras(); 
if(extras == null)
    Log.d("Service","null");
else
{
    Log.d("Service","not null");
    String from = (String) extras.get("From");
    if(from.equalsIgnoreCase("Main"))
        StartListenLocation();
}

}
Enjoy :)
0 голосов
/ 12 января 2011

У меня есть такая же настройка в моем приложении, использующая CheckBoxPreference в моей деятельности и getSharedPreference в onCreate класса обслуживания. Установка флажка запускает сервис. Снятие отметки останавливает службу.

Слушайте и обрабатывайте предпочтения, нажмите в моей Активности:

    getPreferenceManager().findPreference("prefEnable").setOnPreferenceClickListener(new OnPreferenceClickListener()
    {
        // not used: Intent intent = new Intent(this, MyService.class);
        @Override
        public boolean onPreferenceClick(Preference preference) {
            CheckBoxPreference cb = (CheckBoxPreference) preference;
            if (cb.isChecked()) {
                Log.d(TAG, "User enabled service");
                // code to start service
            } else {
                Log.d(TAG, "User disabled service");
                // code to stop service
            }
            return true;
        }
    });

Получите мои предпочтения prefEnable в моем сервисе onCreate:

    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    Boolean isEnabled = preferences.getBoolean("prefEnable", false);

Возможно, в вашем onDestroy, вы можете изменить это и сказать:

if (isEnabled==false) {
   *** notification code ***
...