为什么主活动关闭后远程服务被销毁?

5
我写了一个Android程序,它有一个主活动用于用户界面,并启动了一个服务。该服务定时回调UI活动以更新视图。它工作正常,只是:如果关闭活动(使用BACK)并重新启动,服务也将被重新启动(服务播放音频文件,因此会有两个重叠的声音)。
我使用bindService和BIND_AUTO_CREATE标志来启动和连接到服务。根据文档,它应该仅在服务不存在时创建服务,但显然在第二次打开时又启动了另一个实例。
我想要的是当活动关闭时,服务继续运行,当活动再次打开时,可以重新连接到服务。这可能吗?还是我误解了服务的用法?
尝试更多: 在bindService Intent中使用ICountService(在.aidl中描述),而不是CountService。当活动关闭时,它的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个回答

8
根据文档,它应该只在服务不存在时创建服务,但是当第二次打开时显然会启动另一个实例。
如果服务未运行,则bindService()将创建服务实例。如果没有其他绑定的连接并且没有人调用startService(),则unbindService()将销毁服务实例。如果在unbindService()上销毁服务,则随后的bindService()将创建新的服务实例。
在我看来,理想情况下,unbindService()不会立即销毁服务,而是让其先等待几秒钟,以防unbindService()之后很快就有bindService()。然而,他们没有这样实现。
我想要的只是当活动关闭时,服务仍在运行,并且当活动再次打开时,可以重新连接到服务。
你应该使用startService()stopService()代替(或者可能除了)bindService()unbindService()

感谢。start/stopService不起作用。我尝试了更多,发现当活动关闭时服务实际上被销毁(CountService.onDestroy被调用)。现在的问题是:如何防止服务被销毁? - Reno
@Reno:使用startService()。信不信由你,它确实有效。 - CommonsWare
谢谢。终于可以工作了。现在我这样使用:当启动活动时,1)startService,2)bindService而不使用BIND_AUTO_CREATE;当停止活动时,只需unbindService,无需stopService。 - Reno

-2

这对我有用。

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

1
应该添加一些解释,使答案更有帮助。 - Trung Nguyen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接