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

时间:2012-04-03 18:18:46

标签: java android service constructor

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

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

6 个答案:

答案 0 :(得分:16)

您不应明确构建服务(或活动或广播接收器)。 Android系统在内部完成。构建服务的正确方法是通过startService()有意图;随意为该意图添加额外的参数。

编辑:或bindService()。然后您可以选择 - 使用AIDL构建自定义界面,或使用原始transact()

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

不要将Handler传递给Service,Handler不会实现Parcelable或Serializable,所以我认为不可能。

在服务中创建处理程序,并将通过Intent Extras创建处理程序所需的任何数据传递给服务。

答案 3 :(得分:0)

您的Service类需要一个无参构造函数,否则系统不知道如何实例化它。

答案 4 :(得分:0)

不是将Handler(或任何对象)传递给服务(顺便说一下是不可能的),而是在Activity类中创建并注册BroadcastReceiver。当您需要调用Handler函数(或其他对象中的任何函数)时,请在已注册的接收器(sendBroadcast)上发送广播。您还可以为intent添加额外的参数,您可以直接从Activity根据参数处理所有需要的代码。

也许,在这种情况下,您的处理程序将被完全删除(取决于您实际需要的内容)。使用广播接收器时,我不知道在需要将某个对象传递给服务时的情况。另一方面,你做的事情不好,你应该检查应用程序的设计。

如果我们想要传递给服务的东西,我们只能在Intent中使用额外的参数启动Service。服务根据此参数处理状态。

这个想法是服务可以独立于应用程序的其他部分运行,例如活动。当我们启动Service或发送用于调用外部代码的广播时,我们可以使用额外的参数来控制它。

答案 5 :(得分:0)

intent service = new Intent(current context, your service name.class);
`service.putExtra(key,value);`// put your sightly variable type
`service.setAction("StartDownload");`// action that will detect it onStartCommand

 current context.startService(service);

在使用中,在onStartCommand中:

if (intent.getAction().equals("StartDownload")) {
`intent.getExtras().getString(key)`;// string in this sample should be your variable type as you used in your code
//do what you want
    }`