【问题标题】:Why remote service is destroyed when main activity is closed?为什么关闭主要活动时会破坏远程服务?
【发布时间】:2010-11-19 14:18:44
【问题描述】:

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

尝试更多: 在 bindService Intent 中使用 ICountService(在 .aidl 中描述)而不是 CountService。它的 onDestroyed 在 Activity 关闭时被调用。

如果有帮助,下面是创建服务的代码。

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

【问题讨论】:

    标签: android service


    【解决方案1】:

    根据文档,它应该只有在它不存在时才创建服务,但显然它在第二次打开时会启动另一个实例。

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

    恕我直言,理想情况下,unbindService() 不会立即销毁服务,而是先让它停留几秒钟,以防在unbindService() 之后不久出现bindService()。然而,这不是他们实现它的方式。

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

    您应该使用startService()stopService() 来代替(或除此之外)bindService()unbindService()

    【讨论】:

    • 谢谢。启动/停止服务不起作用。我尝试了更多,发现当活动关闭(调用CountService.onDestroy)时服务实际上被破坏了。现在的问题是:如何防止服务被破坏?
    • @Reno:使用startService()。信不信由你,它确实有效。
    • 谢谢。它终于开始工作了。现在我这样使用:当启动活动时,1)startService,2)没有 BIND_AUTO_CREATE 的 bindService;停止活动时,只取消绑定服务,没有停止服务
    【解决方案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);
        } 
    }
    

    【讨论】:

    • 应该添加一些解释以使答案更有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    相关资源
    最近更新 更多