Как перезапустить службу в андроиде?

Кто-нибудь знает, как перезапустить службу в Android ?? у меня есть служба, которая вызывается при загрузке устройства... и у меня есть option.java для сохранения моей конфигурации...

если я редактирую конфигурацию в option.java, то я должен перезапустить свою службу, чтобы она вступила в силу.

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

startService(new Intent(this, ListenSMSservice.class));

person Michael Frans    schedule 04.08.2011    source источник
comment
почему вам нужно перезапустить службу, чтобы изменения вступили в силу?   -  person MrJre    schedule 04.08.2011
comment
просто из любопытства: почему после сохранения конфигурации ваш сервис не может читать из той же конфигурации? я имею в виду, какая необходимость в перезапуске службы? если вы вообще хотите перечитать конфиг, почему бы не наблюдаемый наблюдателем шаблон?   -  person Viren    schedule 04.08.2011
comment
@mrjre: я делаю приложение для экрана блокировки, которое отправляет отчет владельцу через SMS (номера зарегистрированы ранее в базе данных через форму параметров), когда телефон заблокирован (запускается командой SMS), он отправляет отчет SMS на владелец сказал, что его устройство заблокировано. служба запускается при загрузке телефона, поэтому, если я изменю номер владельца с помощью опции, служба не обнаружит новую конфигурацию (новый номер владельца) и не отправит SMS-отчет на старый номер, потому что служба была запущена до создания новая конфигурация. из-за этого мне нужно перезапустить свой сервис. Есть идеи?   -  person Michael Frans    schedule 05.08.2011
comment
@Viren Shakya: причина, по которой я хочу перезапустить свой сервис, указана в моем предыдущем комментарии ... можете ли вы объяснить мне свои комментарии, почему не наблюдаемый наблюдателем шаблон? спасибо..   -  person Michael Frans    schedule 05.08.2011
comment
Пожалуйста, смотрите мой ответ ниже в деталях. Я не могу написать здесь код должным образом, поэтому предоставляю его в качестве ответа. Пожалуйста, не минусуйте, если это не соответствует вашим требованиям, но я все равно просто подкину идею :)   -  person Viren    schedule 05.08.2011


Ответы (3)


В вашей стихии:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

2) В вашем элементе (обязательно используйте полное [или относительное] имя класса для вашего BroadcastReceiver):

<receiver android:name="com.example.MyBroadcastReceiver">  
    <intent-filter>  
        <action android:name="android.intent.action.BOOT_COMPLETED" />  
    </intent-filter>  
</receiver>

public class MyBroadcastreceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent startServiceIntent = new Intent(context, MyService.class);
        context.startService(startServiceIntent);
    }
}

для получения дополнительной информации: это

person Nikunj Patel    schedule 04.08.2011
comment
этот код для запуска службы при загрузке телефона?? мне нужно, как перезапустить службу .. есть идеи, ник?? спасибо.. - person Michael Frans; 05.08.2011
comment
когда вы перезагружаете телефон, ваши службы автоматически запускались по этому коду. - person Nikunj Patel; 05.08.2011
comment
да, но я хотел перезапустить службу, когда служба уже перезапущена, а не при загрузке ... любое другое решение, ник?? спасибо - person Michael Frans; 05.08.2011
comment
вы можете сделать это, пока загружаете свой мобильный шаг 1 :: остановить службу 2 :: затем запустить службу с помощью этого кода - person Nikunj Patel; 05.08.2011

Просто остановите службу и запустите ее снова

stopService(new Intent(this, ListenSMSservice.class));
startService(new Intent(this, ListenSMSservice.class));
person MRK    schedule 21.05.2014

Таким образом, с помощью шаблона проектирования, наблюдаемого наблюдателем , я имел в виду использование класса FileObserver, предоставляемого Android.

Например, вот фрагмент из WallPaperManagerService.java из исходного кода Android:

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

Надеюсь, вы уловили суть идеи.

/**
 * Observes the wallpaper for changes and notifies all IWallpaperServiceCallbacks
 * that the wallpaper has changed. The CREATE is triggered when there is no
 * wallpaper set and is created for the first time. The CLOSE_WRITE is triggered
 * everytime the wallpaper is changed.
 */
private final FileObserver mWallpaperObserver = new FileObserver(
        WALLPAPER_DIR.getAbsolutePath(), CREATE | CLOSE_WRITE | DELETE | DELETE_SELF) {
            @Override
            public void onEvent(int event, String path) {
                if (path == null) {
                    return;
                }
                synchronized (mLock) {
                    // changing the wallpaper means we'll need to back up the new one
                    long origId = Binder.clearCallingIdentity();
                    BackupManager bm = new BackupManager(mContext);
                    bm.dataChanged();
                    Binder.restoreCallingIdentity(origId);

                    File changedFile = new File(WALLPAPER_DIR, path);
                    if (WALLPAPER_FILE.equals(changedFile)) {
                        notifyCallbacksLocked();
                    }
                }
            }
        };
person Viren    schedule 05.08.2011
comment
все еще запутался здесь, но спасибо за ваш код .. я действительно ценю это .. :) - person Michael Frans; 05.08.2011
comment
Я думаю об использовании этого отношения наблюдателя для своего приложения, но меня беспокоит использование памяти/батареи. Чем это может быть лучше, чем просто вручную вносить изменения при изменении параметра? - person Josh; 01.02.2012
comment
насколько мне известно, класс fileobserver представляет собой простую реализацию/оболочку в системе inotify Linux. многие другие системные компоненты в Android используют это. поэтому его можно было бы безопасно использовать, если вы не размещаете наблюдателей на очень большом наборе файлов/каталогов. - person Viren; 02.02.2012