代码之家  ›  专栏  ›  技术社区  ›  user7060819

如何在选项卡之间保持本地服务的运行?

  •  2
  • user7060819  · 技术社区  · 8 年前

    我目前正在开发计步器应用程序。起初,我从一项活动开始,即计步器活动。此活动启动了本应在后台运行的服务,并绑定到该服务。代码很长,所以我只给出我认为对我的问题有帮助的部分。

    //Bind service
        private ServiceConnection mServiceConnection = new ServiceConnection() {
            public void onServiceConnected(ComponentName className, IBinder service) {
    
                //binder to communicate with the service
                PedometerService.PedometerBinder mBinder = (PedometerService.PedometerBinder)service;
    
                mPedometerService = mBinder.getService();
                mPedometerService.registerCallback(mCallback);
            }
    
            public void onServiceDisconnected(ComponentName className) {
                mPedometerService = null;
            }
        };
    
    private void startPedometerService() {
            if (!isPedometerService) {
                Log.v(TAG, "Start service");
                isPedometerService = true;
    
                //start service
                Intent intent = new Intent(getApplicationContext(),
                        PedometerService.class);
                startService(intent);
            }
        }
    
        //Bind to the service
        private void bindPedometerService() {
            Log.i(TAG, "Bind service");
    
            Intent intent = new Intent(PedometerActivity.this, PedometerService.class);
            bindService(intent, mServiceConnection,
                    Context.BIND_AUTO_CREATE + Context.BIND_DEBUG_UNBIND);
        }
    
        //close connection with service
        private void unbindPedometerService() {
            Log.i(TAG, "Unbind service");
            unbindService(mServiceConnection);
        }
    
        //Stop the service that had been started
        private void stopPedometerService() {
            Log.i(TAG, "Stop service");
            if (mPedometerService != null) {
    
                //stop service
                Intent intent = new Intent(PedometerActivity.this, PedometerService.class);
                stopService(intent);
    
                isPedometerService = false;
            }
        }
    
    @Override
        public void onResume() {
            Log.i(TAG, "onResume");
            super.onResume();
    
            startPedometerService();
            bindPedometerService();
    
    
        }
    
    
        @Override
        public void onStop() {
            super.onStop();
            Log.i(TAG, "onStop");
            stopPedometerService();
    
        }
    
        public void onDestroy() {
            super.onDestroy();
    
            unbindPedometerService();
            stopPedometerService();        
    
        }
    

    在扩展服务的服务类中

     /*Local service binding*/
        public class PedometerBinder extends Binder {
            public PedometerService getService() {
                return PedometerService.this;
            }
        }
    
    
        /*A client is binding to the service with bindService()
        * Returns the IBinder object received in
         * ServiceConnection.onServiceConnected(ComponentName,IBinder)*/
        @Override
        public IBinder onBind(Intent intent) {
            return new PedometerBinder();
        }
    

    然后,我修改了我的应用程序,使其具有3个选项卡,即3个片段的tablayout。我将PedmeterActivity中的代码粘贴到PedmeterFragment中,并对其进行了修改

    //Bind service
        private ServiceConnection mServiceConnection = new ServiceConnection() {
            public void onServiceConnected(ComponentName className, IBinder service) {
    
                //binder to communicate with the service
                PedometerService.PedometerBinder mBinder = (PedometerService.PedometerBinder)service;
    
                mPedometerService = mBinder.getService();
                mPedometerService.registerCallback(mCallback);
            }
    
            public void onServiceDisconnected(ComponentName className) {
                mPedometerService = null;
            }
        };
    
    private void startPedometerService() {
            if (!isPedometerService) {
                Log.v(TAG, "Start service");
                isPedometerService = true;
    
                //start service
                Intent intent = new Intent(getActivity().getApplicationContext(),
                        PedometerService.class);
                getActivity().startService(intent);
            }
        }
    
        //Bind to the service
        private void bindPedometerService() {
            Log.i(TAG, "Bind service");
    
            Intent intent = new Intent(getActivity(), PedometerService.class);
            getActivity().bindService(intent, mServiceConnection,
                    Context.BIND_AUTO_CREATE + Context.BIND_DEBUG_UNBIND);
        }
    
        //close connection with service
        private void unbindPedometerService() {
            Log.i(TAG, "Unbind service");
            getActivity().unbindService(mServiceConnection);
        }
    
        //Stop the service that had been started
        private void stopPedometerService() {
            Log.i(TAG, "Stop service");
            if (mPedometerService != null) {
    
                //stop service
                Intent intent = new Intent(getActivity(), PedometerService.class);
                getActivity().stopService(intent);
    
                isPedometerService = false;
            }
        }
    
    @Override
        public void onResume() {
            Log.i(TAG, "onResume");
            super.onResume();
    
            startPedometerService();
            bindPedometerService();
    
    
        }
    
    
        @Override
        public void onStop() {
            super.onStop();
            Log.i(TAG, "onStop");
            stopPedometerService();
    
        }
    
        public void onDestroy() {
            super.onDestroy();
    
            unbindPedometerService();
            stopPedometerService();        
    
        }
    

    问题是当我在选项卡之间切换时,无法保持服务运行。我正在使用 碎片状态页雷达 因此,当我导航到最后一个选项卡时,第一个片段(计步器片段)被卸载。我已经能够在中保存其他变量 onSaveInstanceState 但这似乎没有帮助,因为一切都重新开始。

    2 回复  |  直到 8 年前
        1
  •  1
  •   Mars    8 年前

    您正在使用 startService 因此,即使绑定的组件被破坏,服务也不应该停止。但是,您明确地呼叫 stopPedometerService() 在里面 onStop()

    尝试简单地删除 StoppedMeterService() 从…起 onStop() onDestroy() 在你的碎片里。

    https://developer.android.com/reference/android/support/v4/app/FragmentStatePagerAdapter.html

    当有大量数据时,此版本的寻呼机更有用 用户,他们的整个片段可能会被销毁,只保留 该片段的保存状态。

        2
  •  0
  •   Stanislav Bondar    8 年前

    您需要在中绑定服务 Activity 班然后你可以从任何附件中使用它 Fragment 通过接口或公共方法。