Почему удаленный сервис разрушается, когда основное действие закрыто? - PullRequest
5 голосов
/ 19 ноября 2010

Я написал программу для Android, которая: имеет основное действие для пользовательского интерфейса и запускает службу.Служба своевременно выполняет обратный вызов активности пользовательского интерфейса для обновления представлений.Он работает нормально, за исключением того, что: если действие закрыто (с помощью НАЗАД) и запустится снова, служба также будет запущена снова (служба воспроизводит аудиофайл, поэтому имеются два перекрывающихся звука).Я использую bindService с флагом BIND_AUTO_CREATE для запуска и подключения к сервису.Согласно документу, он должен создавать сервис, только если он не существует, но, очевидно, он запускает другой экземпляр при открытии во второй раз.Все, что я хочу, это когда активность закрыта, служба продолжает работать, а когда операция открывается снова, она может повторно подключиться к службе.Это возможно?Или я просто неправильно понимаю использование службы?

Попробовал еще: использовать ICountService (описанный в .aidl) вместо CountService в bindService Intent.Он onDestroyed вызывается, когда действие закрывается.

Ниже приведен код создания службы, если это помогает.

    ServiceConnection conn = new ServiceConnection(){
    @Override
    public void onServiceConnected(ComponentName c, IBinder b) {
        Log.d("TK","Connected");
        //binder = (ICountService.Stub) b;
        service = ICountService.Stub.asInterface(b);
        try {
            service.setCallback(new ICountCallback.Stub(){

                @Override
                public void alert() {
                    Log.d("TK","alert!");
                }

                @Override
                public void updateTime(final int sec) {
                    handler.post(new Runnable(){

                        @Override
                        public void run() {
                                                            indicator.setText(toText(sec));
                        }

                    });
                }               
            });
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName c) {
        Log.d("TK","Disconnected");
    }           
};

private void startCountService(){
    Intent i = new Intent(ICountService.class.getName());
    boolean ok = context.bindService(i, conn, Context.BIND_AUTO_CREATE);
    Log.d("TK", "bindService="+ok);
}

Ответы [ 2 ]

7 голосов
/ 19 ноября 2010

Согласно документу, он должен создавать сервис, только если он не существует, но, очевидно, он запускает другой экземпляр при открытии во второй раз.

bindService() создаст экземпляр службы, если служба не запущена. unbindService() уничтожит экземпляр службы, если нет других связанных подключений, и никто не вызвал startService(). Если служба уничтожена на unbindService(), то последующая bindService() создаст новый экземпляр службы.

ИМХО, в идеале, unbindService() не приведет к немедленному уничтожению службы, но сначала будет задерживаться на несколько секунд, если вскоре после unbindService() будет bindService(). Однако, это не то, как они это реализовали.

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

Вы должны использовать startService() и stopService() вместо (или, возможно, в дополнение к) bindService() и unbindService().

0 голосов
/ 30 июня 2012

Это сработало для меня.

Main.java

public class Main extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        startService(new Intent(Main.this, MyService.class));

        try{

            MyService.setMainActivity(this);

        }catch(Exception e){

            //t.setText(e.getMessage());

        }
     }
}

MyService.java

public class MyService extends Service {
    private Context ctx;
    public static Main main;
        @Override public IBinder onBind(Intent intent) {        
        // TODO Auto-generated method stub      
        return null;
    }       

    public void onCreate()
    {
        super.onCreate();
        ctx = this; 
        startService();
    } 

    @Override public void onDestroy() {         
        // TODO Auto-generated method stub      
        Log.d("ASAS","Destroy");
        super.onDestroy();  
    }

    public static void setMainActivity(Main activity) {
        main = activity;
    }

    private void startService()
    {           
        //timer.scheduleAtFixedRate(new checkdata(),0,30000);
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...