Android:在多活动应用程序中使用服务的正确方法

时间:2014-09-02 10:03:06

标签: java android service

我知道,关于泄露Android服务以及如何维护"有很多问题。应用程序中的服务,但有点像看到两位医生有一个问题:你得到三种不同的意见......

换句话说:我完全不确定,如何以适当的方式处理我的服务。因此这个问题。

我有以下内容:多个Activities和一个BoundService,它在应用启动时启动,应该保持活动状态,直到应用关闭。

Android.delevoper建议使用绑定服务来简化ServiceActivity之间的通信。因此,我在每个活动onStart()中绑定我的服务,并在每个onStop()中取消绑定,以防止泄露。

另外,我在几个线程中读到,当没有Activity再绑定它时,应该使用startService()来防止服务被销毁。所以我在我的第一个startService()使用了明确的Activity,并在我的应用的每个退出点使用了stopService()

基本上我将此作为我的Service

public class NetworkService extends Service {
    private final IBinder binder = new ServiceBinder();

    @Override
    public void onCreate() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }

    public class ServiceBinder extends Binder {
        public NetworkService getService() {
            return NetworkService.this;
        }
    }
}

然后是这样的开始活动:

public class ActFirstActivity extends Activity {
    private NetworkService      networkService;
    private boolean             networkServiceIsBound   = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.act_1);
    }

    @Override
    protected void onStart() {
        super.onStart();

        Intent serviceIntent = new Intent(this, NetworkService.class);
        startService(serviceIntent);
        bindService(serviceIntent, networkServiceConnection, Context.BIND_AUTO_CREATE);
    }

    @Override
    protected void onStop() {
        super.onStop();
        unbindService(networkServiceConnection);
    }

    private ServiceConnection networkServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName className, IBinder service) {
            ServiceBinder binder = (ServiceBinder) service;
            networkService = binder.getService();
            networkServiceIsBound = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            networkServiceIsBound = false;
        }
    };
}

每个其他Activity都具有相同的绑定/取消绑定功能和相同的ServiceConnection。据我所知,这使我的应用程序不会泄漏服务连接。但我的印象是我在这里引入了很多开销。怎么做

  • a)安全(没有泄漏),
  • b)有效(最小开销)和
  • c)易于维护(代码方式)?

感谢所有花时间回答的人:)

0 个答案:

没有答案