Why is the remote service destroyed when the main activity is closed?

I wrote a program for Android, which: has the main action for the user interface and starts the service. The service timely pays attention to the activity of the user interface for updating views. It works fine, except: if the action is closed (with BACK) and starts again, the service will be started again (the service plays an audio file, so there are two overlapping sounds). I am using bindService with the BIND_AUTO_CREATE flag to start and connect to the service. According to the document, it should create a service only if it does not exist, but obviously it starts another instance when it is opened a second time. All I want is when the activity is closed, the service continues to work, and when the activity opens again, it can reconnect to the service.Is it possible? Or am I just misunderstanding the use of the service?

Tried more: Use ICountService (described in .aidl) instead of CountService in bindService Intent. It onDestroyed is called when activity is closed.

Below is the code to create the code if it helps.

    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);
}
+5
source share
2 answers

According to the document, he should create a service only if it does not exist, but, obviously, it starts another instance when it is opened a second time.

bindService()will create an instance of the service if the service is not running. unbindService()will destroy the service instance if there are no other connected connections and no one is called startService(). If the service is destroyed on unbindService(), then the subsequent one bindService()will create a new instance of the service.

, , unbindService() , , bindService() unbindService(). , .

, , , , , .

startService() stopService() ( ) bindService() unbindService().

+7

.

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);
    } 
}
-2

All Articles