如何使用构造函数实例化 Android 服务?

2022-09-03 06:07:41

我有一个具有以下构造函数的服务:

public ShimmerService(Context context, Handler handler) {
    mHandler = handler;
}

我想实例化此服务类。我有以下代码,但是,我不确定在哪里传递参数:

private ServiceConnection mConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder binder) {
        mShimmerService = ((ShimmerService.ShimmerConfigureBinder) binder)
                .getService();
        Toast.makeText(ConfigureShimmer.this,
                "Shimmer service has succesfully started.",
                Toast.LENGTH_SHORT).show();
    }

    public void onServiceDisconnected(ComponentName className) {
        mShimmerService = null;
    }
};

我有其他所有设置,包括绑定,开始等。但是我在上面的代码中遇到错误:

04-03 19:06:10.285: E/AndroidRuntime(16837): java.lang.RuntimeException: Unable to instantiate service com.milanix.androidecg.services.ShimmerService: java.lang.InstantiationException: can't instantiate class com.milanix.androidecg.services.ShimmerService; no empty constructor

如何解决此问题?我需要在哪里传递参数?以下代码有效,但它宁愿使用服务类作为类,而不是服务:

mShimmerService = new ShimmerService(this, mHandler);

答案 1

不应显式构造服务(或活动或广播接收器)。Android系统在内部做到这一点。构建服务的正确方法是通过有意图;随意为该意图添加额外的参数。startService()

编辑:或.然后你有选择 - 要么使用AIDL构建自定义接口,要么使用原始。bindService()transact()


答案 2

服务扩展了 Context,因此您实际上并不需要将其作为构造函数中的参数,因为您可以使用相同的实例。

如果您有任何其他要传递给服务的参数,我建议将它们作为附加内容添加到 startService 意图中,并在 service.onStartCommand 方法中获取它们。


推荐