Android 为什么在主活动关闭时远程服务被破坏?

Android 为什么在主活动关闭时远程服务被破坏?,android,service,Android,Service,我写了一个android程序,它有一个主要的UI活动,并启动一个服务。该服务及时回调UI活动以更新视图。它工作正常,除了:如果活动关闭(带BACK)并再次启动,服务也将再次启动(服务播放音频文件,因此有两个重叠的声音)。 我使用bindService和BIND_AUTO_CREATE标志启动并连接到服务。根据文档,只有当服务不存在时,它才应该创建服务,但很明显,它在第二次打开时会启动另一个实例。 我想要的只是当活动关闭时,服务继续运行,当活动再次打开时,它可以重新连接到服务。可能吗?或者我只是误

我写了一个android程序,它有一个主要的UI活动,并启动一个服务。该服务及时回调UI活动以更新视图。它工作正常,除了:如果活动关闭(带BACK)并再次启动,服务也将再次启动(服务播放音频文件,因此有两个重叠的声音)。 我使用bindService和BIND_AUTO_CREATE标志启动并连接到服务。根据文档,只有当服务不存在时,它才应该创建服务,但很明显,它在第二次打开时会启动另一个实例。 我想要的只是当活动关闭时,服务继续运行,当活动再次打开时,它可以重新连接到服务。可能吗?或者我只是误解了服务的使用

尝试了更多: 在bindService意图中使用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);
}
根据文档,只有当服务不存在时,它才应该创建服务,但很明显,它在第二次打开时会启动另一个实例

bindService()
将在服务未运行时创建服务实例<如果没有其他绑定连接且没有人调用
startService()
,则code>unbindService()将销毁服务实例。如果服务在
unbindService()
上被销毁,则后续的
bindService()
将创建一个新的服务实例

理想情况下,
unbindService()
不会立即破坏该服务,而是先让它停留几秒钟,以防在
unbindService()之后不久出现
bindService()
。然而,他们并不是这样实施的

我想要的只是当活动关闭时,服务继续运行,当活动再次打开时,它可以重新连接到服务


您应该使用
startService()
stopService()
而不是(或者可以想象是除了)
bindService()
unbindService()
这对我来说很有用

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

谢谢启动/停止服务不工作。我尝试了更多,发现当活动关闭时(调用CountService.onDestroy),服务实际上被破坏。现在的问题是:如何防止服务被破坏?@Reno:Use
startService()
。信不信由你,它确实有用。谢谢。它终于开始工作了。现在我这样使用:当启动活动时,1)启动服务,2)不带BIND_AUTO_CREATE的bindService;当停止活动时,只需取消绑定服务,任何停止服务都不应添加一些解释,以使答案更有帮助。