【问题标题】:Pass Service From one Activity to Another将服务从一个活动传递到另一个活动
【发布时间】:2016-08-05 03:15:39
【问题描述】:

如何将服务从一项活动传递到另一项活动?我有一个显示歌曲列表的音乐播放器(Activity1),当您单击它时,它会在 Activity1 中启动服务。我有一个按钮,用户可以单击它来打开 Activity2。

那么对我来说,将服务从 Activity1 传递到 Activity2 的最佳方式是什么。如果服务是在 Activity1 中启动的,那么 Activity2 应该会继续播放。如果Activity1中没有启动该服务,那么Activity2应该在使用它之前启动该服务。

谢谢。

这是一些示例代码,MusicService 是一个扩展服务类的类。

 public class Activity1 extends AppCompatActivity {

 private MusicService serviceMusic;  

private ServiceConnection musicConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        MusicService.PlayerBinder binder = (MusicService.PlayerBinder) service;
        //get service
        serviceMusic = binder.getService();
        serviceMusic.setSongList(songList);
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {

    }
};

}

【问题讨论】:

    标签: android android-activity android-service android-service-binding


    【解决方案1】:

    我认为绑定服务比传递一个静态全局服务更好。由于您有多个活动将使用相同的服务,因此应该像这样创建一个基本活动:

    BasicServiceActivity.java

    public abstract class BasicServiceActivity extends AppCompatActivity {
        protected DvrService mDvrService;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_basic);
            attachService();
        }
    
        @Override
        protected void onDestroy() {
            detachService();
            super.onDestroy();
        }
    
        private ServiceConnection mServiceConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder binder) {
                DvrService.DvrServiceBinder serviceBinder = (DvrService.DvrServiceBinder) binder;
                mDvrService = serviceBinder.getService();
                onServiceAttached(mDvrService);
            }
    
            @Override
            public void onServiceDisconnected(ComponentName name) {
                mDvrService = null;
            }
        };
    
        private void attachService() {
            Intent service = new Intent(this, DvrService.class);
            bindService(service, mServiceConnection, Service.BIND_AUTO_CREATE);
        }
    
        private void detachService() {
            unbindService(mServiceConnection);
        }
    
        /** Callback when service attached. */
        protected void onServiceAttached(DvrService service) {
            // do something necessary by its subclass.
        }
    }
    

    然后你可以像这样实现子类活动:

    public class ServiceActivity extends BasicServiceActivity {
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            startService(new Intent(this, DvrService.class));
        }
    
        @Override
        protected void onDestroy() {
            if (mDvrService != null) {
                mDvrService.removeListener1(mListener1);
            }
            super.onDestroy();
        }
    
        @Override
        protected void onServiceAttached(DvrService service) {
            // do your stuff, for example add a listener.
            service.addListener1(mListener1);
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以定义应用程序扩展类并在此类中使用公共静态变量并在所有活动中访问此变量。

      像这样:

      public class G extends Aplication{
         public static MusicService serviceMusic;  
      }
      

      在清单中:

        <application ...
          android:name=".G">
      

      现在您可以在任何地方访问 G.serviceMusic。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-12
        • 2017-12-10
        • 2012-07-05
        • 2015-01-14
        • 2018-05-31
        • 2014-09-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多